From c5ce5ebd4886e7b10424a5ed3c2f19b15c66c3bc Mon Sep 17 00:00:00 2001 From: krahets Date: Fri, 19 Apr 2024 19:42:05 +0800 Subject: [PATCH] deploy --- assets/course/hello-algo-0.1-课程简介.pdf | Bin 0 -> 5108387 bytes chapter_appendix/installation/index.html | 47 +++- chapter_paperbook/index.html | 7 +- .../array_representation_of_tree/index.html | 82 ++++++- chapter_tree/avl_tree/index.html | 145 ++++++++++-- chapter_tree/binary_search_tree/index.html | 106 ++++++++- chapter_tree/binary_tree_traversal/index.html | 37 ++- .../array_representation_of_tree/index.html | 82 ++++++- en/chapter_tree/avl_tree/index.html | 145 ++++++++++-- en/chapter_tree/binary_search_tree/index.html | 106 ++++++++- .../binary_tree_traversal/index.html | 37 ++- en/search/search_index.json | 2 +- en/sitemap.xml | 110 ++++----- en/sitemap.xml.gz | Bin 606 -> 606 bytes search/search_index.json | 2 +- sitemap.xml | 212 +++++++++--------- sitemap.xml.gz | Bin 1012 -> 1011 bytes .../chapter_appendix/installation/index.html | 47 +++- zh-hant/search/search_index.json | 2 +- zh-hant/sitemap.xml | 210 ++++++++--------- zh-hant/sitemap.xml.gz | Bin 1011 -> 1010 bytes 21 files changed, 1041 insertions(+), 338 deletions(-) create mode 100644 assets/course/hello-algo-0.1-课程简介.pdf diff --git a/assets/course/hello-algo-0.1-课程简介.pdf b/assets/course/hello-algo-0.1-课程简介.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9904b865ce9438cdf863927dac41bc83701b8d2b GIT binary patch literal 5108387 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

vr-?T=>de+W3W;ArB%B%ieU4`c5xiGMewZ6*#I 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

iGd-WJY<+_(&X_m}V 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

}S2t^$jQgLVE2i0-4M5->|d4 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

(7!suVp4Tm-#8U4c6PSAP}JEnEw% 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

gG`~6q$$*G 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

3I(LtcSJW(VH(o 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𖌯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%0AubKE4UKmg%?#`xvusE399i?d;0e=K?~1Sccc- zT$vifWlO$qho1EHJ7hKY1?7$_#b~U(;fLeS{G98=AFY z=VMVu!jggZ$vT9QHxEz>Caz#~IYalK|+~jRbo(AZ!n_U+bl-28`te`)VD>fh)}RPW+NsvG(J> z?7rWsppaz;QXDU`whuqIVY4@O!})SUaKGKNi8DgP$PO-2MeZDs=>AkDiL zqU;k1qur<632Sp3WV1f-N{Su^&QyI+(*Sin@!{q6&P+M?q!ngHhgJU4Ohlt=oB{E* zK3ONs?!dL14cceU%iN-O_$^Po>O}R#ssnTM^6 z{w>kq_C;fk-g|0~vy3HnLBSkrAyfBsY2WdP-s#7+bN0ml^%5|m>V@S}!jZ8?*#Vk~ z4OY{Wx0u{a{;YCtBVlams}6?T`&JhTjjj`+hEI-mF<5_NC9ElQryhd5i~lZov3!<1 zh_zItuehRyuv#)_byTwRPfu>v<{j*UBc{#nMr#3mTVQ zA?egVsl66Hz~Yrb2cTD|tVx0<*Mvn4Q|EPt$PN~4h_jkLMC2J~dDx!f~r0bD~Yy>^vf>W`4%R=w(+ByDkNS}G@ zqdJz(w|4)Q9q#hUAu_t%PnOq<4;<9s9%uX*!c(wk1fsUk>iO-!(;0Pn^Nl|l^7yuttm!+&I(HKi!q$CD{~00a4D;n zT52t0g`bwXMG;W3IVIBh8*JmGd+NQ84qSE#6VxZ?tTEvh!N1NPn)oRkY{a>$Bh4cG z@kc$?N#xExj)37K;BhyMe8})c`)$^_pY~(Pvl3hOJ9y>GEEUlk+vnd$`;*V+ys)77 zzeC0O`)p^7!~b$u#jA)PBfocB3BRIcJ%Rt5?zC|r zIPT^9rFT@h=pZeDA z3{^g^famvYnCzglqSudXetTG6I43VJlMh>;9~UT>y;on~Ths<*<@`pmgT2as216?} z7lX8YOWTfrL6=zUvMX)A(*5L`rr)8OlTqKZYdh42b25_S#4527->^oiozdf2Kte|j9WUfrv83N2QCj5)Z6>G-5%pEMhA zYVOkz+5T*c3v20#+#U!V+f3M>dd*w~DVBKO?;5a577D`Vl>o@GXyP1}0q$(fjpj@! z1-c~+KMr6+O~kE_zr2ds<8LA1PKGpPMp zQWR%eNK$lfT|?M@l`&5_U5klwylHF)@0h2F5-@zQ4~Q$7tM$HG6W9vW`V6CU^>hOv zLUuV5(MJBKW&hrPbQs^=afr5WGe7nTcDrEYRdvA4+I2e(Nl#F(1<>Hhq_k`DJlyx{ zY1*6iyEY)~&6OmY>L6W2EVV*k6J zaH8n1CjD=Pto{!+sxF?@_3v2mFD3sk?RyiprO4{vh_Pw@mlM!6+N*r_&sX}-Yx^J2 z`M!W5@xM{g{|7id754e?*L3ZBisAA9GnKfI`iEt})$)Hi@ij2?=`VI#%PnhW{(o+> zC&oV*HO6IJ)PH{kCWrZp1wT+d|No?&gWYsx{+7)8@_b$Wo!N2+mSPRpC(JJtc?{}2ZZSncT@Anlx(HC1hPgk{% zHhkB4^}G{i$H;f;mX0L%0hEvVY*YK}jP|t~ZaOcUD!w-LejO~if5AVxPJ)N>&(Gru zO=J<*e-UEsHo-&V*CzSbtYZKP5wrz`RYpWw$7Q`#4mC z5ckm&SrGX(qTL;IXqM|Y;dkts=$G8;g*- zQ52Sqt8u{1TJRubglLQ$^4=!FQdmsk7g*SM8l!Qo2~nJTm(E8|MDR{RE`uI#A!`Aq zug*)Uoad;&mC*F0i}w6;=Fcaa42*3kZJ{C zLhw#o*o~#i)Om<}4Jz$ph;e)96R+CBGt$O3u-{zHKmaZmg!T)?{>BbeDVJjzds>jW>K)?g!tKur0&fZ%3MTd2C1ROC#PaUutE&I;UR)M0w** zYo>}LO#MaHr^E*;x@cEME6yhDC!!LHS!nCIQUn{1%@N=&xzhB(I;gv~ZqjX#U}*~5 znni$*n>{%J_`}M*1*F=Gi?dA;qk3J`)UwgnUVTY|v!4}hVZM!>^qr~O14v}K_$}dd zI@^PS=0Byc03N*XXy3-kq?B2MFV|m!2uvHEC8?lnEvuM zc=U)1q(Vam63c1giBqWctg#UE}kiX9F#-hS!6JrHTVKtI}BwyfLQ?j|8AB3X5WbPJc){6^+gghZb;@#0yNicUm8r8JK6`r0G;!S&*CyFs`z6xw%H zu-%JaI5w+)R9_+sxjnpN6#6Gw?c&tMtoZTj8?tZ8zsom&c@QPlPI9FY-sPY!f65y;Xyj0KvdnY&*E^@Rph>Lz)gphJrO*PmWz_^yt zahEX~#j0PzDk@?jOGg}CpSo`}Yek9ZU*;JKVBf&+G)Vdp&p?9lQWndjU zaeGbKHtW^1He=%fq$B5t$+*OdV6aKlR2B8gNfK^$3@MErd0-k1qZ|#*1XUBtYqx7< zkfHgF$G+xZBl-}qd-k@Ut5lGCvW%tiAOubIH+{vPoM4j$tsMMA1V>x3KL0qY$r6Gh z9a|%1RvMJe?fRk16*gE4fSDjBy4eO}+oTy;9qTR9h2s4Hq(xsnAcXH@;-YX^Aj>;0 z?dQO)foOQ$$5?f_8~3%OyK0D+}pXFX7+Pdi9r*!Kj&x+Hkr87 zr8vi#XuFbEf1yAm*t{6EJU6Hyo>%)2I6BHe?OwgxFKA7^vaeK2Y8vvU+O&oRm77K$ zn9vf=4Y_+1IMX*27DzaRr8$X-2jC?FA_nAc3?W#!jLLGBo*aUWcHqTvJ!<|%IYO;aNQO8*}2}{{N=I<4{M$> zZ->vD4A8XpKV0_WZLQ|L-x1uo_{sz>Ty*7fTLsHiwR5@j2(BHyQJ$eY+B;G7yjZv_ zb0w}?*{xYk#$PWMEoN&+;tRY*n zopdoGNiXAQ^(TU7Fy#7pB^JC`uT9!Q8F5buR6>HNeNE^gb{Q6N$S z1gZ@GS%~pY8eEV+UEDMx*T;7$_-ojC!I8jc(>h|tV{Y~}a|UJ8ez`p-^JB1fe8QkP zk5>XiZyO;&f_duv+h6i%toSUou)Q1ovE|#eH~y@vGeZf>T&1|6^A6ykHR~V;ZASsO z5pY7?sj|Pi!~EC_qoY64)HL=@n`>XnS6{d|av4P_PS9sCSFmKI1E%2aaJe3T7FA@< zV6Md;B>|=%jzjd+R99W*{9hdo-?%$MM z1E23CUc0_-Q*}}AvDZTn*7F8&DD{6jJ6y91icCSNWE6Dlf$P!kpnYjgp-)4;VbX& zrLkamh0W)PBiK16WCShYt(;rg)TBfC*g-WR0{{X`JRva}EO6{d zR4Uxv1$36cya|^8eC6!*r|+;sh&!u`>fUmssyv_gI~U#Xii*Imbis@v#TA0C{6R7= zRo&4h+*caS$FbGDj1-;plT}~$C}Kx&GNP*4&ogpJ8$Qc5cI3b{SJ@KYW3$CJ*~!}B zF7=LtM4a`b**DRTOsbC%ojCG{H^61WRn$8a=na_UOIGW%J$7X6<`6yZ(b!!N97gH! zdT`llE-TiHDKusL95P-|F>3$y(d6^Kh^;{}%EdALC$h`;edZyosnw|nq33D*=-ey^ ztQ0uAJRwGr9Zd~u`%&>xcY(}Aq#ocgRv=Xm?eUe`dj?qPW0(zd;9~kpZYNonVeGmJ z;uztL?9$OG6Os9;wj6|ZrA8?8mqlxc4&X|-HkPO)`Ff2R^N<)|+ytr0Farqm z6CL^{aDK3c4s|1D==ZAiJAu9@oP3>SDm-S1)$>iUx{im z>C&tv9U(LAwX69w5E;g?ejN7qz5u<~(NS9m@uBqRW71qKpA<`e(3II)_2)xb?3jhf zBxKMPSb`SPgx1`LSecju=xT(wjDFhqAo&rO!M9hI6Oj&}rx`*0b5ILTM(>OqqcVH2@Nn$og7SGEdQdK-iB{@HH-Z^U7fpW zMrbkv_|y*ztLI$VDy0T=(`}UQ!PP&*fj|y2nO?&}n7xn3&My`V z2&?Un?OxAJxj@{Z2KVUjXy6?#I+qj$NvI8?43&(tLuwz@DolY+NcxY!&jPse{)Ejn z?(HAt^k#VPoW0Dat;LoS>i+uoxvJCg!;~rPsnshrjGV7)@A30@@T*y_YTTkN*HaZ{ z`Gi|oG+LY<>!OpQ=)=Q@Gl~P+9W%;F;!auuV7_Ul97k;}X}`_CP0h#*U7+M6g|b z_!??r4O788W(V0NS$LR4(2`wNVc_f=r}osE=t!A8d- z6%PpS1M9aL8v(eG&$uHe7r5pIX)*%+pWNj?DVU?}Hf8!pVTy;ErUv74BF6vmkMFFb zUiv-=l41Gg5C#b*SwnKk96)PC@8=;DjEO8mPw7}k(P;%j+<+XG2gMy=S)FdIuXo2m z%j(6iC4%Yc@QA+G2x@ihiPE5RNft=Y<2HU}GC||JlR;l=`05eTE|W{%dwqLpZ6Xos zFC6=^puyQu;*eRwlyw*p+${@HM&0v&>oQ90s$pq49AY{=4QTh}} ztq8T-n+I_4Am9S@WuE*#Rlo z!*TYF99kSXl~oGBMDdJSt`B5uD2F=n{Iv>Yj&qjoqiA0U;dvi|yqdtnTXJ45Nduy( z3;a?z&Q6UEcv($!n`lYm9tLT;#uJ;7MMmj#DN+7>>OS*hQjizAfu1qBVMlwGXK)>r z6Hoy@XBz{|&_+F|7jUWE_Cfc`lvYefq<=u%b`YIfy$U6QI7<;s@_B!chJsB|20g)C z_Du(VP_)5FI37+@OzsxUZg)rzLA1lN?se5xwv<4k0p6LZ^dW!w2ZpkuQN$Cm_(HE) zID&Bb&FTap)G%|)9t4SS1Z^vT>YPQYIjQ9k3A)8(8WY@iiT9gksf5BzNYc0$)(2@^Gd2Dko&e1mpt$88;VZY%Q6iJ?hHG?hFcJJ~xBVO=sZ37XAdeeEB<)Jruqk5kb(i*T?!gDbR!P4q{nk`l zj~znTwb`MTrPY~~!gi5yQx5+Kn^Zyl*@@DHrd`Jm=h5GcNANUq;CAF$3Yq+Pvs5tP z+PPSc#74Uj+4#7d=1o&H)s{?arYUg9s{=KZe>=>!0URt>rKP%r6gyhJ`*_He7%&p5 zI^mcINiTUlzbLxO5Td9TTVxxS#=*`VyjcT&P}ieE`D*hqMJYBA%aUdkdq;hEl&jgf z4<~wb3~P`%z2PHfp90aiGe+1ArsnRRTzr!p>I#LexJ0*Qqbm_+HxMjeRhxb}_U%ktTxH&l)1RpwVk&TX*Qkun#QjzVt32a`xxO@hI^kccReR=8!r zk3{LLz)0BXOXac}G%J#Pe>@J9Tgng@+tJ(~Nek%%o(FfX!pY_O+rsNo&{Dz&jE3(= zUr*+9FcgAFywX?dxx{r?@TjKAB1rDU;YcoW20c zPTMU`B5k1>1OLvjcGZbhV1mQ-%gJ4CO878DfA?cjXGYZNs~Z_kuLW+{PQvKQ zP>M=7MNwH{1{O5FsH7r`&+`)2LiN1{%iM%wrjC;){t0gu^iHjGkZ6y-x^}itmY1rt z%UZmM2fk?pxSVrts)%=85GZCF$Ds1frs_FC*xHeWd7S8@F7za~e-U6p9u0v0=9DzO zc6YeuFu{F+EzmVzIyZ@cWC{Ip$kMs*chIQLFhfM6e+Ia3M>8#rD*H8jX-jf+Vzh1h z#fWc5z08-7Bm`MFj1{@s&KM?IM1u0n*SHLp_%pg*_KRy# zBVmAzA|5nAO9VM0*OCoON;|>3j)4Hq=+nhfcmpAJ5oLUo5kmLuv3sBsi^1LpaJhJj ztP+typ1(Q`^{cNxxEUp`I&!A08V(YoaTU`(gc>|ZHD+(KTpGSO6A@iDNGIy4ChvzB zN3I&vga+Mi+eYoye@NAnL8KSqZ!F{9AYpE*F0hEf@psIpzNv;Ic?^UI{HYa0u}$Q* zh+byTB&Xkm;=T9kyJQh`B1}&}@XZf9Q2WX9&NO;{GL$Sf;zx-qPXx)^7v`y7A+rC( zCuRUY%^`2~b+BD^&0(qC=cdlo$3j<>o43``!JLB)F`ukklzhydGM#4E+<&ESqa`3G zP4c|v)40BVQ}w|u%mn}+$2LR$F+F$2J4dp)?#6MfZTPnqtNyW@rhjRn&jh6S>7bvt z<1L#edb!Pf^GLP(GPW|>Qw~*zZwDhINK6KZmtnS{rOqpw)^8dS#ZryBB_0jMzGI zF%Fq)-H}8(=^)i0MW5ZLOUOcdY=V>E+EB#1yPz(wkC^W6!UhD{tPXH9`zwpV<;Lj(%Xf7>Ph{WgP=~`nH1@x z53)=Y3p5!_a7^n(mRhoJjk)!gbgA-KIK@z^LQ%gt0tDYA{FFe-aeqEAmN|A054j=+ zj1V|d%6G$w;~Vt~n*JCj0AH#rR0d<=&cLNr{$}A{wYFU4gM{!~V*gn3JQ**?A|RJt zRC>~Pp+?h~iMfd=L}ZB(;gXC{+Jj6lFxGoglQ9C+?zrWl-2~`?ITL8MpmNtn=oRnA zm+aK+zv@oUa^T8ayVBLz`%r7Y5nmt6T`zQtn{h&W6@}$y_v&iC8t{j^q53FqJBv!A znz*&6XTR$+cFoS_PON(`EJUo}uSlo?z`h_{IU`T3&7e>*mDf7~P!o-CCj4Y|c~lu- zKxiU`CL^Rm+(p%vEO|cBFuAbZ@hfk_@*=K6_MPvtG`>|pU;f+=3 zz0vz=`-TMu)Y5e&$FtJ$>JG<-igZ_j;`m;tZ4FX!e&QX>On;U#5 z4)zV7!y-HfEp8 zr1sJ>D#CNp*&?{{29+QvE=CG+N5T-vA{53dJf{14KsJtLT#bZx^I6>8MUH6{_~h=!uup zE!gg4Huw;Bu$?DljopQ~7-(7+_*J@SJia9L!Xb{! z%$aXQc&eokdYQ5inP?Tc+H~=v`y`MXqcymQnZ}!gw=-#_DD;fe91uKBcw~u&c?pfD zjB{Fnonszp4iN>^UD0R73-8E8$vhcmJ|n3is4=B7k@QWn>s&O0jM3)QPyb? z;=cfa+x<)?6x0R+axJh|(a*@G(VhfSolvgJNSfA}MtkRjGtMd(BWy|{C=pqnE#t0> zT@9DFH?x~X|18%)b=3f#8^B9KSM;1%y_hfn(2KFA$Di=~yiu9^hT*Ml@t2sejVIZg z#1JQ}lJbmG$NQG&7rwXlSUH}^>rU-lNR9^Y=;`ZfZ6b+y3U9Pudz!|ex7oDQn6`5s z81F@2-bR>5cnNrE_0=g0r4}72+B$q*+IhW9LqDbVl7Vd(`n^ zcCA~0*`O4i;@>*P&$*>J5=+oZL2(h%l_h8$dT}!kFSKr_oJD_<@>rA1CKJ7t<`>%F& z`xHl2?#J6d9DiP0_Kf{f)JEG^JDM$`18MZsi(n>dcUVg`XQ**)eA+J3>$XTG$MB>) z+4Bg>(YxGgn7>1b-r6TRGB0^K70W5|*fL^p+fuZ$=4baG5{tzv7=zPzY=Vn{@pp3Pj<|oE?#UI{GoNy!A3WV#Ve%DO-Fu6}|PG zAmVG_nfO4FcHQ3HuL<*k`@VEILS{WMT}nkve(!ZxZ4O9+_&wYL;;5&pA00*E5n@%& zS@5!-Z&Ki5@BiZiSON_oxLtbxGsH6t^~ZAm zR+@4ahY!Iiye&Gb>4VY}S$OGegAdNahPW+Sx(|O9CE$1(0e>fX-HepJd=V}(bAQO7bGwa;i>;aXSeS*gvguiEjBB z!hJsa?+MfYKB0)^7~bN)KOKhl7ISpoJ>IwoD<_@*`{RT3_FUrjQ$KgYzqEjl@<7;? z&3eAkc*C6ZfA|ljF}=lfeWe&1<^uonFbuKVep?LR7H|1ob1ePB!WKM^xNSxG)X_=w z>=v|A#_`g!L76k&b9oNgFXJh9X?omJd7MX?V7~^ey?icyHrTA`IC<<58Ek*d`gFwF zm$d%W2#2U9-O0iv`)Hvlm$<>F3|FCGSKN&KEVA8z80F8zVG1;odon7q3vp^oT|P6? z=`~p22hH@?z8IAExYODvmO4;e*~VhFI3Q<;*Y~i}El%2H||-<^D#l zWhY(75uNz~Whok!1Mp3D*jhsM-AE%2yfwr3 zTRf-mVMs(ln(1pb4d5KbR0LXaMGf(#r7ZdRXKhY>joQ6lqwLmbP+gM`pm8}Nx!J#Z zQ+<#~h(srygFU@s9c2(RFHo$N$w|x≫A&eL|FNIp@v*!nr$P%z4~Ge`s#2G)}7- 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

@(X9Zz*}jU=SAQ4_h)SFzkNP9_Xr1%&=0pU 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≪Ur;! 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 l$ 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�-mTUBcTyR8hT|u$3_cBpsjZsg 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%0A~?36f^Xg_lVwG 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

jL`iplCCp)Pq52=pQTwg8~33Lmk5TCs$w05SN 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 PWKWavIEGn2hs{@jw%+Xe0a% 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 z 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≻WLnGDRcvMCqQC87X7ulRy1>WrE*_V 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 QKtY4U=s)?(}Cg@;{yY4I$Y--!& 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�oU3%bFXhcVSB}D@ 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%0D2ku?(3oH)%_8^cDu|= zKrgu1RgMRu6Bu2wVJbRKIXqKtqTLemR&Bs>40L=)Ng3M)eUsVQE$##ImBw$pgGWvt zO~ZeyyrR*yJ$B>j#4a$}?9{B` zJ2Kjq9^2jF&H${a=`t5K8I`FG#Bv85pSV@Z3|*2aKL6E=e$#+c)CUfRRJw<{X^D}7 zu;nR1d~4nM@Lh&>_P%eHAUO^?g4M%led7#N{`eWT2R>(8-~>~m7I5|Hm)bak&y%zo zj8<2!@D>t{2HI~t3wITSR?=L0EygoQ8)VV4msg?v_=FpeCinvrJRO>=PPE$A;W(;x z>)TU%pg|2^BOXv2beBtD?S4=MQMmoMCROy80zcRLzZbfs4cJ5uo<-Arq)A7(eMS`< z>5a1JwPCvUdUTfC4I!>3S+L`YPmh%x66`ne#x#1H~rISrh zYW}12v;L#>a|ItZJD(cQL#}OtD&2R;`Gl^qt_J@IX!eW26B$hI?o?Urst9|@j#D2$ zSVf|)R<1L|v?0@8`!PukxNy?4NC6|@ohLPau$2a~F8Mtx$u6xOfKO>UNdwB5x*dRB z!>mV_kqmK6z{4{QDa~K4^kruDK6YH&+iHB8a&aj;;m(kz2Tjm=I8-h#K%(u`Jwijy z6|X6A?~RW8`Qv1JyN`>)3c1B1!@qQ$y-VgH2oUz+Vx-kaoM1TaRoi^w*h;mH{L!$z zj-=Z@6Sz8bT6=?$Do_~w&AJ3+HClQUEAHaU^m1RSNQeJhU#y6iu!mVnC66FF;pIIq z3;pGyolauFCYVu!#u>YfxsM3^V!3%KwQJv)t*MRsIps;kfXLGwkq8I(#?ZRB+)^kV zF@zw7@$Xn(St6;OVg^^+{VS zeCu}tpENQ_)N{(;zr%1j@lo(KD!)!YI5W!LJv5iO$p!N5Y{|l;x5^-brrvwh7b{WtvcCnoC6+aA^ zcil_f3N{dm&fZhjxpKCMSG|?`OY0iy-M*kqcyiawDO5vQYRMN>ZzF}ISC+CDc}8s* zVbYx6`Ybfeb00G6Fi}%;R61$#t+2DX?S_~Bl_-6E9tQ{2b8M}2VG_783Zp8P6)n?d zJl*1IytLn*t#EJ3x7n?$kEv0@wW@7&KON6$e%a=k+zyS!+Hw}PLHc<75m+4jVxNZ6 z3%gM<>56)ZyaWt&<1UD7C(SGg&BD%>i$EfH)9<$vm7a0(i3!?66N|KPAj+3%8P!2U za6*IMwn(Xs<9emO&dT^pR`hLrkJU8nn5fY$?& zWWLM>s2OgQmtStENTgXUVBbxCe(!=2k7w=8f)!fZCX0CxFBn*K7OO+9gz-S1l5-{5 zyR`u#QE_%&ZO}$d;zObL#Rapx1a29Ds)i~~LAP7{UstLW*Fw?(p2Lf9=`SiBWb|KD z>R^hTZ8w&Q!cYe6M1~Q{@}W<#$8T$zjZKFmhNjUC!Oy4_Cz?`!+A}a#oDqFa<#6)N zK)CwwKWoBuw2O&$?CB>oP_!y`-n^E!EU0a!!?DqXvXY6- zd1VZ^eTa@^h1Dy=?srd8n-2SanUwgzROv>)eMP?VLSN5Tc`5zn*NOyx;w?%$q=I{A zSvt)VCj-P_9oFD39!RCsH2EESm6|+l{ATC{{eFBsRii?KdJyaez@ipQ$o62~8W|9w z=pL4I;q2pu`A%wnmRU2KaD@wcoZ5Eps6=8&yyX19s9qtb7cuL*71)DLEunXWq9vK| zGTr7iqLb}HaJt5(ptiF-wTR*6*LOaH7wCIV-j~svRxIUmYH?D2Xz>s%{g=U!xfg++ zmnR_X);CKhQQ_*eK^RgcW5DuC+*!-lm!lbr)|kPXC3}cj{l^4RT;}rL2UMj}1ioK= zSB+jYTz^cohPxpxQ$aPXM~6RxR2lj~XhB;AT@`#x;<&WL9ZoXCLAoKVT1rqggxUAH z(Wfo3L`UQ2E*Y0XIrQItWBbfufA-C{X!Mtdd~s#|cKb5Fl<^Sqdtc*70K?3K@_rf$ z!F>4`ztYgyl07r@D3qmnCYo)OKd^CHxeNBN{Nvf0)AWY#sIvh~ttjRu1!wdk)#inl zK~jl{c{Q~*6(x7q^fi*aes&}o`4YeKHkrNk{~KebHEcjpfzcnMz}4l*f75XHC$~=O zFcv%gSTF`2^BL!!097UzmKgJUHZ8g|Mv1fUnpE;8stAT}8?h<+01EgjgYF$7_JH!k z4}2=>Jlo4G8%SG^Vhn)mV-b>1iA#aPi(&Vb9eGu@jpRiIzZ?!lf;gJQao(*#@C2xU_xi6z znV<2YlI-Qm?bpNn8U*P#^yvHE8Lt9;~67U|guP^D4(ktvg3Zgxc1`3^VJz1se_1rO$yJ*bw$JZ%e$ zEp^~7_=B!0{VSDfD$M0^vVGd9I&96!$4mo>k04&;76}N zvA*#^UdW=YLGI-BT!EZM7CJ-@vriCTk9a;d52ZtI&t|Uin2#4G&?i=mmr6;f(ABOE zeL+6LrS0%ysXH^`8sf_ekE2B1rv@DMMVGU*peILy0p@~sQU8l! z;T!?BZ@jfZ!4elf3lftuFbK8 zW{P?+$MInc zsf`>2zgfgSH0C4tO$rEO%Hwjbh6!DSSj*Nn{n)?qv{U>v(6L@*YG-2ZIcDY#uTDuE zr;1ScI2%Nqu!z?o=aM`&9P)}+7VI_YnRe>%LIMbjvSZ-F?~}o!fqCqsEvq z;Fa>kWud~=*_!c9yImo};zfBf={Y9EvryJ4EzSUrM>yqJ*NlEkoVB*tbOBEi z(;e!QTiPV))#;cc>X#}mp?KwvT*mfgRMdh9_Q{^Gjkj@q)j}Zsi?~lM;As(1TSG}e z)0^&xfr@hNXN&SMDFf`I-3Q9p{jL^8a(atgdwGA+Nf0W^F?Hs5*Yfqst{>f!_6a|W zyi|GyC(lID9m!Axow5Ez4MQLVezF-q$K1I(bMmYaV_a>I2+55I(Zm^}S=&&tFSrPy zA9dlLZc3d#ao8sSqv}8KHYHu(ru1(3pn~lgcOn&K5IcYAt&}3~vY3|P!nd26@-avR zfh%OITHc@x@mcE(=~?V@ZhHwl`hk<9e#{mIbFt2;X^rVz1T`09xK!LSzfbSB?MTCS z)+j-0Y+Ac9<17IPTniYxk@>cMaJoy($b+lXZ&aDQv zxr57mQ+f!G)^{OTR&qweR<-w#$EO(acV4h-Dnw-xE1)heH}>_ly{tbm!_nDaI?}EW13fKi-h35+LoP z&~QBh{KrMlIpyf$=DSmM$AO@R7FXw$5#nw`69L|LY4BT-2Yn&mHPtQFi*^T=>Gu@D ztO0y8x^^#EMan%Jo!Xh%WxeP{ ze6F^91X#UXoPK-TC3m(?SB(1Owi4d7p8D%W)fMse!g19u0d(cwzgak^BD*K^N#ZqR zKMnr%h~K1EYu;N52hNb@S1kwg6fpGRu$BxV%^2sFXy^TTUNmE7UPsR2Ue`{~NJCau zlu%en+*yTW1pTL&el}aP7hA@D{tlK7l3ap3R*b_5F?**$5wIVy?#Urntopr_s@Rf} zdTwEUhP$5IeS+}w6TmzVsYX>Prs4g63^7`-`)yp!M3Rnk3_NE)?*q?So!)1Q$H~JW zU%^7StvYFw`vO}sZSsI&DR|-UMjVn4>M3X}SwqcIt>a(e_Q?TANjYRSu(O1PEP>xbIt8h)$9UV%_0nd?{jZhrBG9y z^@pAxVmz%I`gzE9(5w#L+C7r58pYnk^in@UQ5-(%y3Fr1B`^5;{JS3G-f8O<^hLU3 z3t#UR5iBJIqj~i}e^Sb>xuWIm()TcvdeQhU-aE$^ud>Gv4IqA5OBbQFl>n`i8lw`O+oWaO#O*%JI5ADcP{J<2>xmjYl@0ubK1QcvBYAvMda7_7U9CV9VhaccazRG zBQfwDZ=mmjm1xzMY??apmGyIFtlxWYU0r(LP))u`_w7pUKzF_34}v#^;e-g@@PF(7 zMH*OZ&VOQ2_exl-R=3(i?$oVy-z<+Q{Uu`19e|bjTfneUHKiJi<}L9uDCF{MQmJFBuG?OcCE?VfM{GWygk&MLku zZCz%1?ZqSCoU0LCt1ANKcQnw;LWjsrl*QQ2QT)~8JLCBWWilU=7?M40aD9cAUIlFL z?(_(qTKsIeNKOVj4$*Bb&I*FCE@!vYL*8Q~Vk}xH%*#yz}hK;NTx~j0^~- zFgjwBevb-c;4Ir}Hq#)r*-~zg;zM@cX8`03>kRbo0u#h=aG0u%1fp9-gT3U zzMQcH1vni@;A)xTgH>7_Uo&a^u_ zp7X24Z?Io`{@^X&wI7Tn03=DpZ$7wXlt%w6_}O@gk0L>g2qRtBq9Jqw`h<`;^&5*k zdTw5{obH#~p0E^S#`6?2_=pS74 z;XH`islgV*E|B<#Ns68q5T>c%TF7Z;<2$~aA<&9i*^mnsBf-F`h{}IR$zrbmio}eT z@-sKVfGF14rrD!~M-`P!sRxl6oE!ct@)!zukLd#cM(?Tt@(n?0K#!2?uvG|%U48zy*cI^bTaj;%9@(f{jqM(} zUR{zd-5WNzSW#;>eh9FJSr$t*Aq-gM<+QNb!2ho|^(OmX>8=e5V;T(b zD1f+g*yzc;i7}rs^SissA~9x>L1D5%59kieh%%l;9nv4)R_C95-cicdiEFwOtk_iY z^8AzI=xP?34mGodu3j|J=hz6OxL-0|Nj^T0Jw)G@nANWb+- zN{|9nV8k1fh?*1xsoJE&1x7eA{z>~6RWZuhI5ZYFwN#Ly82b2VUT$C^Q~1J}>__2D zavPP!5;>u@6-%B^CUSSoh_cpCM7GhRh)cBkHpV9AdUQfz(%R<)kB;X2M)aKoGPqu1 zbj_r9g_rcsNUv0Z9vX<%=Y2Dn`AG?EISYm1fV!Ex9B-;W;ZuM0TaNbml7c53%&{U* z7=%RxlCFtmar&x&+xkzf-2rU_h@1<=m8{@r#+5I5xyBc`oE$P={RJzGTCzRD8KSw{ zhGOsLVsi%G9i&dJX+F-yex9Ye3A z-!7S-3}lpLE`|%T)=xEAu%=+(Z1f8l;V{>y_f8(zJFct88iY?VkyN$Pu}J(2f;u*1 z)t$tE5*Uea?1p-HNFa*Ql^8htBM-*zpso2PL;_1NOT5{GQf5hc*! zmLFKZoEbSJ-+7gBn+UUr8aybQH`e*~x-22Cz~V5wp{WjI+%`lFy+3+M2e%eWTk)(h zh~bRo6}yT26vkfO-IQmEt;;b639r^Wa(IEcC=;rftX=2M8{lYOH<>E8E*hq-SapX^ zl+SY6qu}?Mhc}nSicfX$?&P9s)QsA4CrkcI)0cRdpwcUZr+hDP4qhF+6=l0=)MD|% zWxZCS$C3OR?ig53858)N&kR54lzH5JQdtFT{+KvKwl0RDSX!7Zx47Wv4|8`$ig}F2 zs(%k2@c6q(I{0-d*D-|--F0h=O*1`^p)dw`;{YfI&y)!;;~B&{{3R7~Y7^T(nYuB% z6e;Lgf&nhvv|>W*$_8X+%KSpLEO@5;>GUNfjNG}3@F6b-)e$vlM;XgRk!kB|&PdxjcR6qXHLBbO(@Uo3*)zres>CJF;&46O?H zwNwbfMnGA5rh8gGDUUmN=A3QRvP3TYc{y7};)S8VtLppZG%B`3yTog6Skpd(ZLa|N8h=r#MSlJcbn9Zo?vrsva!xHc*>(w1xkxoc zvRq_@Ph|ikxgLto8E=Rd2h>5DfVJlULZ+Wu&5;BIqz{2bX&XbM8bDVcTucE?0A`Na zZZ+f^)OP$LC4v(w0r7#&MyVCO0hG#rKOzG$_yPKTE$`rurULC*M~at#q7L74juA|| za;{^wJ}J60Y#Awj)o*w z&Pjfxo{qO$D2&y^xd6w#V}l_&r@1pZ`}t2!tLsh@18-$Lg_c}NQtj>8e5d+jOrX=! zM~+igrCwyBMKs??Y;&qOhcyy+kjMOj(?)&g$lNuE++76aBbRb?%w*@jp$J(O79K4} z=e0yd+b0gPi6FkR2QV|7%ej@{ysOV}<%ZWahi74||3O=_Dd)%uO(yP0%Pp-N6Ov2c zY7-q^mhpbhxE22{D(Lz(l@-#QA9A=Z(M~T(kMXO#feO|6f((*+ypuy>hwf_9|HIyU zM>Vys`@#q!3P?n00um6AUZjX1Bnr}{_Zp>0lPXAygkFUxQWT_1?+8+)x6qsP9=g=f z0|dNNmus(m*4k&Eb?+VbJNFyo{=rCQV7_F&?^AzItMW`Q@q#Us%C3vEYVbR=d?L&l zs~O)tEASG4TVc%0y}fSPc+nOEisNp&o-OLoB;kBc66W%R``W9KZ?fynju??9=+7p( zbs~_vZl9Z4fsS4KK=+exkBmF?)M@DM`K4FekO7~VcTf}b?RI-1&$@!nxLpIiViCZ6 zo|jwTszT-_AZB#~jWCvnZA18cwS+&IP=W&o$}L_UL0~#@X&}{q58weE8(1;;ia0eoDLC=Upg7$;9dzR|SdBbnc9$j0 zEmS(%%k4e=lRgF-=Z5*4)tzWrAQI{cj06@lQ?8DbwLQdhD&4XFrYcRFD~f#wJlOuySt#0t&q98*)C0C zyuCoQBeF_i!D8`dUApbiaw0E=$RB58ahf#GL)>fl`TBUQ0}J~3l&i1i$tzl`H^R?% z`Raix?i%Hbsb$zVvn!iZ_dzZh$|fukXAc_!Rp1IlWgdHgj|B6xdBy;`Y_sJ!MSD+6 z62vst|M&)kFs4B2s3YBi6f7~-SgY( zCT%KSoW;!k7GqYy0?8?am$pZmm2Mt3dY$`9-B_ix_w;%Jt&}kCO;HnP1@W5;*NH5j z?l~ISuS=b9VSVSDj}fhW!FNDUGQTY-rR(>kvsQdK?F^LiEk-4@C+Zb7ErLa+p`bc* z6(0my!Q3ER6s>D9$kbqvJM7u66(j?@Tf*#_nq8QYpI@DnaAdzI^*D9ni_kCZ9mwzg zE$Z)m4@~kaTRE>lwlNb5B!_w<)`v#4(h@y^j)RZ<-fllYjRCmK36GO!ZqBwEY7Fu7 zf-dKJzlzDPW!{*5$?bu#1J!4BErlfA=)$W_s|SY{iQ;YV@ZSJ3fl#q&WT0oj*mV(Y ztf7_yC9`%^K5LHUatoScjzb~ba#u#78Ak=>v7)#9$( zZZbuJL~r*{d+9pq^c|jt1!z!&tTsePz4E;XVAiy|$WSn;_-&wY=$e~N zbJ1~4P2;(x3B^}HW-&^Jo)+7LE(BUNo^^Zi!2D)tuBT%b@`1Xo4cQpEHxUFJ;_u{7 zI)?=}U>~1GCy}c~+)O&@zB{gVW|{j1)onEOavBk9PC-pN97CIVlCNhhcqT6t%Z*Ej zPCq>I3I`H>wFBq4fNwP|9mAn1AojYWqlpn{fE)23TSRB+GB_{uLl7n^R6Bh9@LAT#{DQ7G6sal_Ep#om9)TUVuT6^a@eB zD3Zur$;}*jwsQ31j-|4~W_>8@^{K^H0r$qYu(CMn^%@M(eV5or7^=8Ue@c-n@g)~m z5ME}59z_F8rM~wJEF*`f87Y~=C3CXYbME4YA){-0@lNBR7GM(GdCYnYt#gp-Fy8?r z&1 zjO5WSarajG>=4CWTK*M#AyJ#C`-@0oCAi-S*V#BV;+&8bj(pCRX}^w4@t&dNV;9AE z9mm}O(mQRh?%z}7y~J|ugU;s0Vnt<`72f{r9^*dcHXjo41nHe9GPpRT-ni8it5Ixq zAzGk`?)KKAB7JdYKc%$#Qzzv^*(4h%Mgtk}T30BM0h95`)3coGMt}L|;PR9=tO?$S zqh8S%w${3cnHzPM33RI4kWc478($b;3s)*jEzy*Uz3rK;o=>jpcx zbef2}=Sn%X7=2LP?{rPIs>|$vyNH{qHi+@?Lhb8qXhUyMA~%K;E-_NdjzC`zZdGrc ztodkdV%uK6zHwa@beAacDDA#gO>Zv}%Uax=boDGwWVgC-_;hFvcF_xHf{DH3Vv3oO zK5G-Jdvj2@7axWcY@1mGQjsH-zQ9{gDtg>|2t8$1A60NMV?bxb7l1}De`IeztGy(G z(@Q#s7$pGGng-<7y3bg>y6Ond*sui%YPaPk#JGOxHj1wMptH@Xn0JVd>HU?*j`hbQ zwU)HX3Fr+HAIR$EU#H$f@ao{`Y6 zQjaK~@%3VZD`9}iG=&%4EL7DB3~BUNkL8kgqScZdBAD;Yy_lzqEqFd&dpHGS#tEFh zsl5Of*ycfo!tbRi-70>(xUpGaxAZ2>BwhaEb<-6UE#dt{VCTyRe??3_s`0MwhwktU zt(B<>HpFNfx3XQyL&^vbRmDa#R; zVeP}|$=@w=5f@!iUs$dgH`tkQUFhwvhR$*G5=^|b)?Qlt9KPYXvFZQ=RbOKZ-qJoh zz4(>UK3?2C59;kaKX`V-#$rw-Tzdlq)IK08^IXT?gR_qL^7AKTuJD(0Utl1s zPBe(@4MnIA3kNF7|K-eKyeM1N+Tix=@WBYRQyx{Z_&~X|G&gF6NElmqZGL6poorL3 zVP#Gy_NzhpcRa}aLe=R+CG#F>(q#?)f=`c3N~tk($9zj(_L(!IfuZ|T1n67Y@YH#O zce*mNHl0Wj`iN8R!~pfF%Z48rJM zvKef=x)P+t;jVz3Y$vU&=_!%N0hrn?uBpL85*U7}Ymo3R^1hSl<-?F4O=<6YMXw}+ zF)c}frLkX~QC!?UVTP21V?8g5Z;(wlWiCB$RKWyxtXlEfx#%s%sO!CtmS@>#8TnSh zcUcgg#^t=zVXd3f@ij?EhXoNy?O9s_;|+%gGKV?bUAMR+pq)mv+1kAeU5bqbT-EbO zx|Mb4Ft8R{H8;m=GVd)WFKu$3>_`MDehrp5mDd|O6GsoF* z5nwRs%5uT3%VRfB*|4T@iCQFSpjr7$;Nx@mCd=*fZS4xzYpLr88yDXh3Y%LsezYxWFVHb}O8o1Q3$}Qhs|8F2f0^Sp(Mo;6v$IkmhvVj5 zMoCGjE287UcNsFdotobs%rx0gY&9hj<5)A@_!^T)v~NI_lyVbb%P~@&oy;WA_mev) z3=JOf39zXq_G6*4R^W#BPg#<%?^bW9oK|Zf&_LGCQ_%4>=uTP|Vn<1DD zm|`@n)P{P*-W})@W>=%M`(=x-nC+s#gWUgT-1f=;!?2XRucYeCJ;5!_s;CT+7d!6WlKB zQ?)=Y%N(1G?4xp4c}_ApRe9l462p2n!w4GZ!kgQ$21LM_;1`=MYB%VkA>N6+U45Bd za9+GCxF^o6;>#5H?HMZoA4TAtw{Mgm=mhN52udX`FX-8#BbSz+JBSx^l~_m!USFy; z#MaD0!>UNdM37$mbV(av8oKvP)H|Q1qdxEKeC67ufmmMj_r(*{qUqhchF0;Lxh#I& ziBFsfeM3;L^4s#nxHLTg1r+$WdX*gkpbR1Xc0p`DT%`|3ovE_ijSdqL@$_1MK23?> zJ4MqnLATD0+_iekvXOlV!(Ceu0Fvs}o_LRpEO;XCBA2)}@`rY**WJ-JNkm>f5YmAy zRg|NnE$dpYL(@h{O{4FMe zgL+lQnb83=fpA%9*j}4p+UkJ4llL4+;9}E@b3J-01+q_);<*mAH-`t##tpcz>Pyou z94t=k&Ok#{4j@!Rdjy0xN|yaytjww~8++s8B~Y>!j(ru2X#okHebI@%TylnQRAz z&Ja)_+FlD(awRV&o$j(>)xP7A#?K*-$@GByX8}Y2c(vf?t>`m=wStSAX7;FRzaif2 z1W@iHa02$B&=pZ2YX;s9j3a8gg-tv2i$NTA0iD>7bKfC)GqH$wh-O{%)-egpxvuR< zGW2)=JSN!u2wO3duO^`_VtRC=uBV2%ai(O%U#L7{xw-u7nm|f#OtL|}Y#KZFGDDBx zHv=^G9{-0twEdkC9F@aU20_gJMNyf$dmA(zTU+uk*SA&1meI~YNJX_4if`24z@CzKYm}Ci6@3ovXr=gE?jtEnZ%s}vdq0OCkHI(3u5f6F zJC24E(!sm2I`aa->bOih+3w$+s?aS@^#uD*ms&o?GC0IeVFaAh|{GFRNW=1Ih}l*;7kJ@qctJxdG5-JF}n6 zDo{}W8<~3l{tEP!vzr-Bn-kg4*#lyEktuYEb*P%~{pS{De4SW0xi7(8BGUTO zu0@ihR%lo?crFPK8@SbIEId%)tYnSq++E+Cx6BOdmW~!-ejMJ`(KL9)Iz1^ECzWYH zCjr&0`dt2`6h*Natoa#dtA0TQ&#QXBa1}N$vJS>{&L?f0ONHBQ=dTZpTOGVHm|jT{ zBuioaayww*U9B3PZHY{75V0sM-ZcRS*ag0hZbb7SR3RBo<8zgtRNqaxz{-yk6Wk_y z<8Kz-W%zSytb1s*Vy4#=aYNYUcJ)U%iMMaIv8S}&mmhu#Bk$Jnwa%to~hE~^nkJ);fzAc zG%nd|8CoW6ma;C|Q{WDryH5`Ig5dY0oZWPTH6K(R`t8|#b#WSDw=GP$bZrC1m(VJ zoB_ZLc)w3ZlaC|2*szoaNhqz1)0)8qSaxdTAm_8mk>I3uJN| znLgHv5Zt|-|CPlj^au`A^~Esdl-9ChlghAqbGFgA6g^XLw&8^Hqy=VSL>qhh6y+J=R}GL%j3h)Z3q0cHHLYVuQ=mS?Y=mZtYU7|js2py z1jyH&HMiZjvgiN+)3ihFzrmuVy~g!%=dr?1mlBA>tU<$&9P z1J6Frn!bOc1I=~W8vdea1bSGE8ZABXgx^6gHirc6&yu;V>3_+cX)oc+QP6l^Gh({4 zbp@xSw?XU7EcHfuX0B$h-2CVlC&47Wl>gui!5`CN|A|w6yA}_45{P$dMXBblMXce&?l~x(MjCd2TW7dh3rbN}7y z11A#GR9{b>Ina6#W@&dGjOyf3F`DwUO6wT!NnuG6iRY|c848(we~VL>A&0guIldy& zjaDSwy!U=Rd6KaWq)9n+Sp6Hm)Y%FF+h<20Cz$S&wJ>?|gYl#|pv77?)t?{D1wth{ z$O71Rz!^#EZ`t(X*yaDY-Xs3KZx{VYC}IH&K6L>fljsn}ZHeoA$75XS{g?}w8D;Kg zKmqpG(O*yaR%&r(9J7oLNIDGw@&x(?b(U(p%5XN==UH$yOccY7uXb}KF znzDxQ>g8q1opRjmkuc~A6tGF)if5FkdT0=X`SlmdMWd6F{zo6zzm83mSQyd1QTqgu zNUd!I>>;sji&LU?#8wC}L=kIRNQLP0LY-k_aa=%sWtcb+aCl&|8GA%~VtM#q-2vE2 z!JnGye%e8=J^#=Dz4(u=pQsyB=$K@oe9fAXAl@W_X2{cj>QMG|Ls0YUem-PIYoOrj z>aPxEC5isv-B6%mAkA7!(jFLy_|yU}0P$g=AC$z43CEMD1lctx9dzbsfBG5!e!may@!{an?Lb1yu8j0mxLxSJ9e@!~WEdOqA{O7NN zona?oN5nvBe)6RYfSUM^+J%TNo=a7Hp!7oo8Zz-%2908o-|^|dst_L^i>Wvr6-!vU6H%3ziSf?f~67Y*dy4mu^J0v|Tl0TYUD zyS{?1JTCfm96P%ob{SD$HMh0i%Fk@@c**TKYK7wQf)ND!`MrIRmTDRHp3>1N-k@=9#0@rKO7uH2{c+Ay_; z@@Yv9&@YpkX&f|+Uwa04qmSBeH8%zwRa+(FVnO_qvRk|q*PSC&G5OPQ>n;Jui#I)Z1ObK(zgh_-w@(eo;Y z+%6p98;b&Fh$1l~zqLauj7>WYgX@~9i3I0GU!n^|F<-g&`r>uS7+C)#xBl!}5eDqP zH*?7ybveV+J{nL%3vWAgDW_e#%z1(oZ*yy>LvGSHM3}T)@sFpsuZq6uc zr~T^fdULk7m!R$*tuJ%;#IB<&0(f~A^h~0qn6pXq@&qmdRn03lJzi|M+nC-K1gR3b z?yB^!_#Q71-#gU-qI>0SRN#_B)CTPU51$M+T_Pd8XpEG9YPyA%?QvFknU`WROoB;cB=SlO^Mceq*TCcjKC#LTgcHHzejc*2xTBWliT&7lIWhYcr`abl>0YdXS z>fj9kK9#!yX6PZ%4BCaPbt6D;Xpt=$6W5)Q@wgbUn3YxTGs}2w$k4PA5-;y z$HNagNx zc-xj->9tS0kl9~!bsMVt#~J=cNB{Y?urEMir_v$-L7nT!s&l!2O#EL7Wx1b3De{9n z`Nc@pe{%?aH(K5buWQYVvV|U4XT2LDW>3v(<3c?*ZZQ^+r>A{SJMim^d>nl%jKY>T z>v(8YjjjxDx#k#=J`7I(OpugN!AwAJQP@YjCZd6#`bCc7!ZWk^w-N6lLrY7e3PURj z;lzpEoyukf18eq>-i!ka;|n!nE?Nq&mlV_YylP?Z(Z}G%u-qRL148W-g#5oqUngBi zR6bl0U3+yZ?MW4#YDLRptQ>6}v+D6$0F}HLA-{5OIAT>q$EQi0FnW;_s{o`k>UHWt z<0ty{+!+$>n=86(PI0F*i~4+DaGUMF>8iqF@vHxv4*%~!0l}=w#L*ecxSMRFKB`G& zL${Dy_)?U){idS?S)lfU%B?g+hw9`*^#zi+>{;zehZRBpd)v+!f!+;;g zcw+b+uNN>n`+#``Ik7*2Dc8RDo#Ha8a?^kwaaX(o6QuFn_BTpnbkq&xM5TN-?}1x$ zHVajUg>=gvl7eEzUJmaw1dUg3ZYd6OzY9S>1I^JFE^*R|ncj;6{(st3sM26)M1m7XWi!4RDXoIsKm6@PB?GRr$O0arg`Ixdzgu zHXD-c^+#8NOxK~PbXoJ%Rgo_7icqH2t=CW>W)R?UCpNtyylCKKw}PC5l?p4mZtGybfkgXnXkpD5;H(uBtKB9GD$q-1&H9g!veu`SH z*n}mx>VB-+Kh5oPIGZEFFr>L7;QDIvoGjQ#+ zPw9o2Y#_^YIqmCu`rzZ`(=ANK>vS$U2;CaZhmc7-+tbUK*k`0;tA>qKuE9Fd2J#`HA(=bwY<07d=jfur4o zMR*!?10R|oRrPWFzk^(UJ$e`*-2dkZIGZ^_PkHop<({gNix@1B*Ww8e_Vz>337pay zxF^AX(Nw1~#+Lr7aRn-Vr|={#8>g~UP!$*aCKW|P3}CA(c$r!s23%bM9pH04t|i|1 z+fJh&UwG#}{rvVfV^w(~pqPC;_swwiUAu&Wb^a0&?jUc}pa-oI?bn3TyF7z-*=%KB z%1p}1h0HvBq5An%$^ZY`!W`f+l7BJAf5E!v9VwJIj|hOEK2|5q%EOS>kU_uuO|bfH5FgsxP(dfTbko^}-x%=TeUJW3!DAG+W znqJu2WQMTNxcA^Z$Y$n^2muk+Jp*)gV<+#$Ms^pJ?y{Kjotr|c&ERahMRdwWF6UxR zlr|hQUiq~n@1lU|uIl~yq7zc#0Jfr+Tv2ZOskJ}pzz5uuGNo?&|Do*u-(tob{vVQm zxCA)WB?d$3EBmf(;8R4S_cO0B%aL(^HJ=?OGSnynsjzR|HLzD9R3V;qW?`q-tBz?#JKN|S>{9hsa54FQHVzZ2ku1JnTo88o~arpDx z`3p5w5#zTzliFON-i5G-y8UWy#CYHby5o>As+fR~T{cAZv|pd6_LRP?_~OqxR>b%I zQyf53c>nL`|Lwtl6Aci2A0sxmGkfmrWd6kV$2)ryYvMb182K50yb%{?&7dlpE&X$bA{C9;I`Q*&4EG(TF1#XMpW#p5xe`fEb z;qb&1_@jsBFRV<>Wu2b56Z6U2Ih#8<*gt#XY|iNHGYbL%yFNHZ(1=~!~d z7~P(bmoNdRnevYDl7rRN&2QItTIpT+4>Tq&ZLPRmGZYA9MyVo0$|oGn&Y*{r#pP36OGZ5{mV zyM=j67-bQ@c0IA~Ij+ZqdEWo;;(u}vxHIw7O|n(FDRi`nrDG&hiW>8?iqr>KT|H{{ zx6jarK}Zk;a*UhZO+yhefZgFM+r`U7iC}lHm80S#@1uH8G(l%buh)G8quIxroO%5B zVH_*#q#g73$`#>x4qw;uk%yo)O2?q4QK0!u(J*tU5oBvJy3!L{v5^&-28x`=9- zAsB+jr_foY26!g9wYM7@bd8jTFK{Do*JEw|v}p^(Sce2vlf&VIb?%AZCs03^^1@)- z=TR+VKNnsM#T+?0KEz<_=LwJ?aR`~Jn@`&YKzg{E**bTn0oia_x0QU5nJ$k#0OoYaR-zBYlr-Aw(H5@)1@RH-}l$XD} zhXtj<@4hKmEo5ev`S_)J`q=F|=A;Ql1O~tK!W{Jj{~sw1*~50aW$sp_MQaTOy+xO$9e+VO&_S? zo;P1kvd$!q7=X9HUI;99c0R2a1c7?M>+7HrkR5E_ylF2;9J+(++qKvw*nOM6C_8fp zb~2q<$MT7xsr051)aCL!qOVP`o_zlIhrbRE42Hw^jvAI_e;mp`)|fM#JxW{dT_Rdy z>+D9>ir^0NYl;LQEnAP>?|!{2Q@kSc;Csx|?LV&(eo6e#^aGLrb{L~$>XjupUf3q- z60M-L$U%h3?g{+f8siVsipf=&gguoAsZvujHebSj)9RZpsmU&*#=%L|KE6o#pKRNo zPfrOxdy2^x+0BO$ma_S>sYsj_5x4~M`x6`9Ps&QvHZ+$YAjeDWdwl7t?wtHX2c1;P zaMis9WBZrY2<$0(-Vcd{K(V-$Z6A~@1K0z;e&n+(n+W#sdIot6!AxWE$Oc>&bnF*k zo!y7NiYf{FnqHkEhS!{i11BV%?2US@L@T)6;N&@|d7aeyeXQt%2ZiMjCo7LX(cRhB zx9vBmpg#y0U{g!4)b0B6W@HxWX&^kzaeQE)Mita~k853DcfBH~z|&j8+KIVl@%(XZ zRjqDn#+~6Le5$qpLwBx#cXebUenbDvDSzc)xdKq{&lBj|ZQ6R_<)&4;FZNwuvYPFK z-XKx_zS%g*$it)N9m%Bi!h)cs_AsKOv=Zfus$eeZE)UwzE6E%C!>E&>888Hb#jgAl z7ot#!U^lOYqm*UT62TI|j3C&JWQLe9&|bIB(9QnAzNB6W@mtZAwqzY|md;A*;Z^EI zWvX>|T$*&|vRoh1{ls^bXZ)5UQLO~9QPWV|8D_fyC7T3>dqv?hfcY&=wtq>X-&x`Z zZ(vWrU?RQ=YWSMK8Eg4OBsXD1@wRx z)4Z=3kt3hG-Or=8WLW!m@-k&PC=q;yw~W$3!{}@A!3JcdnbwAP6RU&pJ;t4d$L5u> z=UuA}!JBv+0o8^K;0GTlBa#siRY%IR+aSEtfn)a9?s1$~US7N6k{1Mw=TfJ4lxK>hSSI=+bPkfaS z=nC7+Mj7jZb0u}2Aw7%~oZCwqR}SZ5^iyg}7@ko}7vFR`T5wFS&{e<|7ul=#uKkbD9G#x+d1{esEL!n_~A1n!tWZ zM@Z5u+`guQ>hNuPH*(^tCLdmn^ih6MB0x6x@7;xcRJ_#aa(et&;>~?hqWkxT zTdM~Bg~eGOOL#?jYN|K9{0A>fSwb1}=6@HBv%eVb>>nD#TenN4HutFC7giHsZxnz$ z<^RU;a&Hvdrw@9OsaWq=p{OigfL>~9$>cI|n+&mnOtP{iiY=krrLNO%^3X8sNq!IH zrYtg7wP<>Hu)5|K%Ni1CLND8L-c{o!RVtmhxmx&&B@i=hZknds<#Z42sU z$O65+c~^x>ycJ|!ifVGB_$(n#WSuUnLAn?@DprYrWlA9H$RCAcUUyG)Rz(H{9DF zosTndYVgEKa?jqQ5?k*#P!Vo3^gE8O_r$wLId1Y*BaT_ruH-nI^3Lbli`6LaherIx zV-GM`sBf3&P0v!+&Zn_y|JZ}MI zsgPYIN+1|BbLo9+paN8lx>L*qcE76hqnvC-WF8x?d|(KhQC=u~=e?u*;5P5sy`klu z7w6|%()}fwAnJkEdG$e8ZDu3#Ro?x3Df-9OkU%g`y;vvWI#ke40t$BuM~+5yj>bTN zn;~mFZixl{6tAVp3#^?eA4Gs08+I2Kn_6U5Br302y$s?Ns!iLwgAvbrwVEwUdHJb0 z+(TeD-MJ~X)Vg7J@Y>4SFk7~Q%UD7h`{F%lt275^rlVv6@7mvEBRmMk1upMZQohZG zv-E+X2MC^>J21xNi|q0VXB%LOXTweefb*-D5WYZB%*;h#lW6Vmz{6?l+>Tl6d`6CC z%U;obds5PM;?%uwSr%;#IMo(dZ`XZv^07rb%iP zG@Bxr;Q+b5$spgvU!xq7<=Y!eqY%L!O7iT?72qAMTx$pxS}CQ~2CmihZ9=xA zX)4poe;GzAuhH`a-_LLV3xl?O7Z_I54cJH?$X%)Ck6QG%1oz#k`-tVZFu8?0JWqN#TpeA;rjAA-r2u99`nAv2#XPlO(tw@#Wt)OO> zd~R;q+#r`=i&;YVHhn-*ckj>n_ZdX@2RiBNr_OcHhso|lw<#tyeAJBvYYa^1mFI)2x<>p9&7~(T zI!RILPQsRX)C~AXih6ExQJQ~djW6+&E9&a0q=fEQ3{G<;mByHw^ib3(eR1<}Y*vyw4@|z|lc& z-JMrj`&#-TgOWkBbt2Y*K%h;c_=1OF!|3nS@NW&PxN>x;}zzfrnQ2=z3+ z@@3X$hG6nq1Id!42YyGz;ba-ns>Zq7Bu4bvD9YoviYj%NSu4|hJ=Wf&GWo}5buvCF z4|So~xOOglB_^}z6^2T4QGkmpM3t~K>U%*erCoqvLmekpS+s&vA;z9h4u80*ikd%>*uSVXD8plC zg9nf6CLth^bED91#}p6J4?e4-neqltAFXl@Dd=;oX^=q*-2R@AIf1>;e&tmE?0nMI zAp+y=D`S1lh3p$zHkEQ86<;psI+T)gsl96NSiEWzFE&&&Ybx+fZJaj8p`}+6`Q`qI zF{W&bX0xA|KUunVe%f#G%?GBoOa@Py1Bz(!JkLp`$P3)a9^chcqS}v_nHb-48dlPA zXav5%kDeD8Dverjf<}m^(_OGh#3r;ojPrM8dZE7RoU2v4z@4wDR<5s{Bc7~Jx$rwA z@UK0~AKt0y?zvqbSOloKD7$bcd*nz)+Po^h4v`iYgH;alA=sc zDmY0*tiM_KGER{mRG+zLxN85v!uP4dFgt~5icr4pszRWOpu3z4|9^w^g8ueG);LqA89`p_b*MQ(PH|+&w zlFp1NLZYu;@!{GatW($HHRKCVbE?d0b-I1-TE%$nEKK(RQ}g8OHSpV$@C%+aSaxSE z@I99z&ug#~yIF?l#+;f(gZc<>i2)&Rq!09hVhZiKxjW6tY<)pW$VZR8q#k*W9&5UO zsR(cdtzVy?Z3@ohG_=E)Xm7h%UcoVO<3)|a<)$~am=Aq|!K)Lh&x2f5B%!dR?JE*^ zRXUfDOX&Ca8Ob2||B={yK4t#{DEi$+WjgWx;me;^^&)E{_+ExUeRdLeIi5XTy>duc zm%2&!oxzX`!}FRUJsq!5wUqNK!_+r+^MEiOtnRt4Oy3dJy-+J8rTv`E%;kxuyrAd& z&2HysrcIt#yls3kd!rc{YIvWa4u4asifFZJM=~{)*ltl~kdN<@1D{jMTF3K94Zgm6 zkKBCSQ#@YvvyJ2qsx{!ORb92_hjWUm9_e)Iy~`f1xUk#l?fwr3<{x0hIVp}mAys3z zdfWmXhIyNf3~b`=gyg|eYzhbmG$meWAJBJ+Py0kaB|!}*AxOGMMlr66;EljvC$1Y1m3da*aPRhDP4Lvt91XXzi`p)vX2G8c<$?MXXVvAKZLw*yI za)HfmJvFpSYc%G{@Ke3?3y^!o89;9 zDXd_;Bzby>IglP)HknhTpyxUx9GLf2hKCMZgg?^Z@P66eJKZ%RnZ92B>To5SNO$mN zQIOQuk&FID@yitcSYA)!1IkfmZa*b91wZLJFlz<>qc-DL7Qn=uP&-yXfma_v_Y3t? z!V>K?0u1syVo)_&^e^W;AIS++drW?ujq$PKff>f80DYFb{^LXZ07)+{jdz4gxDz$Xy(elD?0wcbh^W^uj%mE)e^0A$d@)h781g8{nWQ=7;@H~&mF>F8 zD7M?_Wyw2&6fE4;@=pV=Ix;0%e+*hCFHhUK&8d}R<4zR0*eW6VU9Fxpq(~GGf4G&3^+G{1eUt>m|bMX$a}RyoT_IR(T?z zaeLDj7P8*&1+s7VwQrf_4Oj`?XsC;<$T~JmHKjg~sGP?$WwEJVun1V`gewJ#-JdD< z+cOr={md9euojT)F*xf>VO1mxy>I9_xHKntez{mR-Qba2Pkk|JOB(v1^5ClKEuFHq zkGiba2{uD$_ku|%E6mTDxPubiz}$s5eTf$5@$1=2W7C`?9M!-3JIHZO7RX8q}8%Bq5so0)Tyv_Z9T;8wru)1A0KwMnmAYpqz z9NjXyf0LFd#tr>|4WHI$KZ304{DbI@Eq=m+YdX48^J0Rx&h&mCDR60wrNNxvIVP#0mI%%`Wbv~x&OEj( z9fBF*hex!t5=KO`L-Cm9mNJ=P%m3Vdjqv{+aQ*2eVmEi22oWaS4~*AcFGOGjyV0fckcxwDD`~4=kxyukd0<|2sHu!-*i;cOywS71^>v7%-fi$P1HNPX zxeNM|JY4(`^QY``X@=1+$*WPW-z0Tv^o<|Tw@vx3X2b83D43L9skKqitT298cE`u# zN%lxQPsC{W)3kIE+nTWjPB1{eAHDy5;OQr9jlBxN3s7fTvB6!+d@uHn7ek>eB$uS% zjMfnr+d*rP7?;(TUmTO;dJRF>gpO}q@*)5DK$`c6R^L)T=$f({pY{jo;A|te#paPg zHx<^ZM$b9>t)#W>S02Mxg1$&b5RG8xv;eqR`*FlgFE>)fjzKy3{$NEy{R?v=VQEew zl7^=cH;U+RgMxI9u?G3erP+9sd3m>DoyXEzsY-P^KACs3vxf3&3EF_ZVSZOV))EE z8nNt8c`{aYi3AjhL*^`~agW|#=ZAzo;b>yzi}g1=-sV`E6GfcdnPo^6ci%H38C)x3 zy)SbeoBBGI#O}OQNq`X1V0x<1)iE+H{YMhK#t*f?T;fta5=F*s-LtX1DV~(#;Ur`V zyWeLg{RV6BJo+RG?ldoB?KQY?%a#4l%BWn0#``2n?HjlE$X*uLPLa8m#@*;K7B3xI zEp>mG*1eaADg(UtBIf@hFsFCFVYdmkeS{v_PAlAD-OiMmCXG(xJa2&E5ba-~mJP9! z63!Shyd@mh#pCqkfl-;0Lg|H?l^pXt+r}r@NzFD|ER7}7SLbLiaaS-o@h)9?1H9St zJjo4eKJ3Jah38z52dmNSm5-mmuT^Tkk8;`)-33+2y71~`v)&T-6EpD&xSC!e1p0V^ z+C<*^V(bDMe>aEHD*2YD=6p_4;%kOYnSz`lQ5{J&o*R4h9{E(?VQHf=s|Jh=9}7C8 z9oDmLE~C(7--AbBQsrVwKhM0`?(~mP$6rtVrzMozgRJXH%A(gg$B~7+RX`DygC@rS zcEsDb)I01Qtfp!DN|nCI%gl6`u&18pzHD;Cvw~#rE2Y=%t!pyHMhKxzv~0@^lobu7 z)WPwz(=`kBTM3&_NIquH%zf!_)VkQEC_{5WE6^aAggm;^@!SWZ84dV_%ZK&u90yVz z4)Y3m^;f)fSP8;5`YriXB^n(#jBXLdp7}cul1$6Ka`Ooj;0jR2@ID*57k=lF%8V#C zy2a)jtZPHL{Ofw@mks4l6YI`#wl9}0^o<wgnio$esQyy{;GXOfy{MflF6_iZ|? zWcDoub>cH+ZaGPZ@KS`edeR(SjJPt>;ZUfRVr0dWABrHXkLAW^_um^huYG}sOFf1T ztM_oq#z$Y*+N5P<_7!|}}G;UIZgidTSwN4KO^0jZ5}RkzRQj_Ws8vf5gDWYp{eK#gn; z+n3%vK`1I@(WNdhFR`t-l1LxsJe;eOU6Y^f@IJ!BU0FhK zs1soBtj~8w_w+A6bH5^fKe4&x{fIul_=-_s3%qQo2`I&Eo8H`K^en1lICQe8n*h1) zf2py9<^9W(4`xdHJ^uLv?*sz)xT@W^h4YF=S;j$pv^#S*GBi)fsYmY270>u*J?qXiy0hNh-Z7zO9O*0FCGv8>3% zpBe$!+uzf>dO82VO)2>%U#5(wA*N(+x+yDD+f#afRO2phgoN<;yzdq#A8#k}VhO2m z8|KmbgPpukyoV9zdl?=yc}rMjgib{0FB3lGj2mfw{uO_=%zw8&_f)xV;=<@R7-mYj z?sC^!z(icZo=43C*Ls2z35M3R3kk|~sLJ?>nsYyN+<_Nwp)*{LNSJ5{%Ej@lKgKX1%6oW*R)HVJ{)Jer|WL4{1}a9}-KnQp{c_^6(|g zct)_QA=Y#hsB1Hue2t91nw$cA4O64JRuW{PmT>X5zz$`q-M9Q8n2H*W8^gV}piv;y z69a*W<1rk1e=ADZYY_CaOCq!kVzTesxV+aZQX`mDxJBkk5Oa1PM0;>7#n7wb5dK|* zEb!&uQFYj%Wdi$o*+L8}y&2!pHBHdKNZR94R)L`mIUTExjzHBXynqLF02oVHZRHod z{)O7zT&2leruJ!viTJ`53TC|K`PdoBgj@hPN@FUap0k4O2zQv(HO@@aO*XxkwSZF2 z4;Uf0xMszTP=#!xI*<4_+ACyl^G-|R0^}7g26KCIaw-q#OXfQgmwfDGcnq3Ie0R$k zl*>@(Rg<96$GswtmCiD2jSqUp$?&l9g@rcj7Vtnx)|G{9(E7?kEP5?;VykI)p)5_sz^DpPIgMP^)~%7%=IC5v(`Aee~2uSZ; zLJ<)`Y0?p-D7{9dgb+gSh)4~PLhmN@gwDzRe(S9Dt#clH-mLrqi$BUOFvinro8itw+?DI%V?V%rNlOZeC+cIMP0&4%?7jQ(wMM;b?X zsQ8EwB;(wIrdJhI)jd89`DnNOa28OwZ5Q5gmHEVL-toxDfkGRfyIZF=xVc!eFi(5N zLqk-!P2tGbc%@hs1>BLioy5|}QL5S<{ir}$VYS}$tIT~+Vm;XHAJ$)+t&U8FoH86T z*Ka0rK5VN4fkYYf62)G?*yi$#&;o2%9+y8-6uE9}TzjOL;^NsBgy4vNc^#YI6Mq); z=$ezK1i<^;MxJe7wP4Qa!QTH%?aPAxFNx0omumZ;M$gOLCtrXec6$Lg4ZiLv1-|W# zZY?33F5qRWgFP0!&iPn!BC?e8taKB7e; z%&p83#5bl1X0)@p2P~PwUI^qtwu{ruz*hyZd`7wFlP4`q`%{st`gwv^UL*;i-#q3z zLtNbj%#?BItk$T)f$OnrHLB;2xi1+8Tx(j)NPT`|lT(;#9Q@I5jxw!bOw2Hhc6#GF zh_ctvUAX?a!a=kgV(;M621Qa2T9PHc;SR&xtCa1>fnG?jhwt;Q^%OkJ`;U?Dh&THG z4*mb9)rDG)-fG&8Y1C`uy<{!+DZYWfn=0??lZS3Jm8w)S+k(GygEzNxGU+5S1&^Rp ztxzgLKi^Q1Po2T9w;idXwDW?zoy%mu_AXCwm47wL-vo$NJ!rnY<5Sie8sGArY>RXP zzJ19$+?M@vKZCVNAP@BWrS4M0bTa3A_AmFD7XUmR;@i!&bPoWgOAYz`G{O`Wr2aIs zo5T-?e=4A}ujp+5N##d7_f_$pl;zX<|Kh5Be|RS@G5jH2B+=o~M_?jkJ4g&bR88sg zYk&Jv{BvB-!km3SGBexG_$76YPRa?N7D4IpDgCVu4K zSk}-~aM6B=-LNrmtw)isv_qZXsv9ubm#}@xXB8SrRg41JCKc~(B?TG?{eIsxQ}u5c z9%!V#b28`nItMV#ce6(t6dwzO7X+B(wVWu=iN0)ZdUq*r-P;>SQE^|8Mv#1-=fjxV zQ?@no-eQBNS~4P!e`t_jZBbRBZKJutVuOe~i3?7!gk1jZHaAg#vVxY#gUoLl^fZ0j zD02rqPCU9x;~Bm1zOv(l?s|~?U0t4nH78k>)wMWkl%Kf8(t41TgCf&L_WDtrtKI)H z9@4O9D&^VeeB;&U{Y2hCH{L<06f+fxiTFrG*Q&}cb3gC8^`(%zv1Q|Ky(MkN4jlt;W>|_{N$wWh zAa$GjU_HDu_LvmU>qr~rx0FQ<&!iwv=fqfJ{1dNV_f}_%p*2_6i^-yqQXBrw`|g?Y zv)WqOP;_wV2v4G!{@sv~9kZO>&fV+YvPrC-@|Q5)_mW`jLDF`g#7#c^dhrUx>g_9U zcTgOy<(Oi88zBCvs!FE>#Omw&LpJ+e^lS3JaT>*X|3|-BbJzw^P&||k+j}D#&r=c9 zcQCZ&rSZw>wJz-sstsC-qS~kw=Bk;9eSLq8;&=HbQ1#Gi8o!Oy)sX;*736YrDX3^J zH$SryJhqg+W^F3mF|de^%$q~U-ZF~yO;`@dTzwt%P$+ST`9!#O8q6*Udql#Ht*=5T zDpeDK{a&$6EbeDxFB9Duq{xr}0`M-;fbnrDNAWn|AxoV=%ZD&_EwIG&m5s7tKsr#v z8#S1|p340FZlS~VHx(*Tw`R+~0HU@Y>wC+tu9II84$>{LoJ9Mj#Tsv6{ObFuu83cy zuosQ{>99LKE{V?>3hG?{oXAhq^3R{|cT1D||2B93lWKDoNz$Ays{SsN`M5^g{Gj6w zy?8I+ogzEY>$dv#wqWFru<`6GeDRM56e#H5RI>g#YTzE?Uq_ z4}2)vt7$tQxuO4&lun=CY<*BeU2bpy&3^pzw%c7-VbGO=Ncr3 zMjP|r;1ZmsZQEH;YstGHr9L{P!h)z8d)fLeM$+uM-uUOc%Fhz`<^y3-;XQneoI zDztkT(p?pQ=w_LLhBem%01JQRX$!gjN5U2ycCaC%cuSp(`}^z6=2^|JI&IvP;RbN% z>&xS8^u5vBaRDK;{k&n4uW`;_+Ca23EOaZfba&XT>P>3YK^{QAVne5D^Ks)E4FheP zkUR6KIkA#D5w$`e#;%6AbCcmHm@#i!Zd6U~MupYInbiG#a(T(`(bJz2=nL}{P zanCub<)CIr;dpPfB=5A#F?{>b@!#M02Udo1fv2%0d0}U3qmFr@zi>kbq@Q&2{+Fs; zVjGp!R)wzOdH5MI{46n?7=9pkKGot~p^HK|WDhyiyoXdJjn}A5kiTWgQi$tk^Toq-2vZbm0}eRv$d`97syCh1Ti)A^6BwQk{ImL+^#K1EH4-GRHpg_ z+<3b_q8dzb^7chdKmT}xItAr(hZ<_~Iq3C5BONsr!!{GzYSnP1N$gg~`D*yd;ZWGo zarhpu;`y%b`S|%t*Iy*^Lhs4W*GCo4N5ct;;pglp1>xI@r#*@+b-(mkV59GuRktd>gWe=csTlQn_?>s=+N3SYbOk3h8PmI#>jB zZMU33&(}6jx2=WytOv54|03$g=C@j(ZtIes@EP>ot(Ef2_ppfI0;R+9=5cTQ3$S3t zrj>FrWnaxDi4lP@jEHa-=nZk6jK8jniBtHJ`-dMCZGAQ+d=}4%VR!3!l}pKH^s+Q< zs$0K2VmDRa%fFP_X!D4@RKMwA*>6{dKn`P=o3E8!&GsMt6xwN81VNUL1y^S=NZMRF zbJQ_&Tq9jN2mg!szSV$#%kiAF@RAwYn7V9GJ-yzGnrMZZa+%d9*+N!mafKvL2rS8q8h+4}@Gx;DBOV~kwQarMUq2+CZ73dO zXzugwbems1G!X&OpS3=l^E^jYVcW+jFGp@K8LdpLyBIOQaS$9&eN0FCANgtg1M!Ar zE}C5rtlnQO7k(y4?(%xBb6*Ts=4av{r{UZpgR;1_u*24mPNUVUg9QgD2XR?xK&q!f z<21a^pIkttcGoZkQ@Jiab^AuQ9gSF!-hcXPRn62&ZorAMXbFR$V-O(rR(*AadrAHODHp80^xd zdRdU&59|8zVRo6nWt0=m2OkcwOCxmElR38RhKVLpPRsAnUg;O6a9X^qR>+W@PYVai z@P>6nUMMBM|0BAa=hsW4kDTlN-ZO#KK(Ew{`edvLG${#2B^B< zvaIhV|C2G!XU?;Ef~ntr^NTYt68T=;f`t z;l}|`B)6M#6zr9zo{;NUSzlEoA*Ro`&9&&~*J^N)ky=<SjvV50r zyR{e~iwi4JJQ_Mr0^<<=idz~N+AU(qa29gDc%9G&; zJS1p)e!p<`sg;}N#9HyVD$Lp`v6cF>2hG?=e@M5qvZTO~QJ1Ss8=QH7pK9o)b-|3~ zeUGtTg%!{H3bKngJ_#c4+2FIk0mt`6PQuG~jK6p~M@=TQ?!_z>-Ol`mZFoSm;^$XQ zr8bO%#|+Q>{90Y0aQo;1uU}dpygf4>7g>Mj!FQR2XhN%gn`v*#yT2QKdM~wvWS3|4Oz{4{+I@?c#CfM z&fM7A-o1SN!%Z?OyWE@)*2+Hbdxgs%JQ86{hI`?@OHNXgUPUs|FaGDHM$h069%`67 zj9`vaf+Jb?sMybI6s_A8Mr^NK}$3&Az9Fh?`bw;nlyeO9cpb)J;O z`ksSklT;v3^1+!WO0QeDaus#7f0PL&^TtVLS5e+&2_ZD@O|$O3JMY`H{u*Iw@s~JV zWHcLo$UxPBxB0!XpM^6ixi@(yt%}^hCaR)sus=;ey>@I-rN8>px)O5M&81QGd37aN ze5*`c+TOZp(RWjW_>?qF0cpLjE1+rfaKyOXJM9;1*P?T8eRN==3&_T<$UxH>8ttCw zXWj1I*Bgb?2ce5upn^zjsp9Ezcx`I<9nadoJl%$;5sF906?SYMK($O7Uw%h-NmdRq z=?-es3gg38E>rrvx1+`P6%Gkkp&wIpsF~+IX^=tq#^X0b2rhI-rD}=7C&JkGM23EE zS_&&w;3=c=LOP9Y?Bc7=G&K&E>C(z#bYf-Fcvif;VFl^02$L2~t~RT1v1VdPxc_@{ zEBC*Im2`uMmLtW@Yuz16|MHBoRaPa&n-Z7o=|+4i{6B*a2m+EUc;k`Utj=2A&=>H z!`sDnqEC8o&6Lyk*92Mjb#L&ZQ(X7?@=*HD=6rnpUuG9G1h#5sSQ0x4t1u+4_WhVs zefF)T<-sNsQ&G8XAeo?m8A0slw)+dTAos!Atrvppx5-4srb6EjA#S2#ZGyk>nHnP+ zh(T5!$%Sn%-v?n+e}KLNr*Ypoyb$H}<>nKF7pMV?T52~*z8?4AGT$QYJRcQ42$VR< zZV4QB;H{{G*%^sgWR!bG+Hs(zU25HQ5o zJE;*A;umt=miCRIl86k8^}O$9JAtp=n2hQM z!B6`Gs9a#G#VT;jn>0!1hG>7$3Zt4@^Qbaza zl!tORDg*Ie_-9`Ag=$R{T@4!FjFVL&Htk)Seyw0HCSqG)%ug-z-H8fK?H%9?v_@A{{)k}6ny_v7juH6FYCR>z*{ivM;KLn-me%d zJ^it8>($aJm*83d1&P&-*xAAxlSls^9rC{K)u?uGV_}tlbgz)ZOF8 zn2LdikFp?4i4G1iz`yr z?%bJR--l;n%`Mv(ljBYfrd3Phm5es#EF~|uCBIpjcWN;Uwx)|-XTRO7yeFFn zruxzIWUZFByyvFU-k$K+Xm;;=oh~G>zhTwBkv?_l_B3v8s$y24(pI>#=F2Q10IK~P z@_|Hd(QW^UFR7>)4L@_#JapVv`CEL}WIEVAx1*oRjw@O0C*<2A0$Sn^t1#_QRdWv& zLAXYhvMXF%AEsAl6e8T#p!!Lu3uZsrK6~FMgn0_wx6*J(AImABTmp;(lime73Rq*g zwb;+vJFt~SGZM2+?;|-lqETg1Jy9-$Rpzr#aD+@1TiUeDY!JYaYc`cLE>bz?Cu{%R zia|#uqlfG3_TpLBV$yK?$ETz=lt(?wpbkBz;-!mYMoOwCom-k1U9yl#N5Ktya!aa@KRci|FP71W^=E*U@l0W#V}DWPZxQ%c^=4rE`)Wu5OG}=^eQ6@-(RUY zycUTHibJ|T`a`73v4YcKU7;-dJRD5^Z=3|5r)_<>^)xRv2=Gv}J+t&Xg_l9I*QIx3Mjl2}fE<)i4FAkP$@ z+?l2>cQN}ZjnfOp^Z)SHcNM=vgGz63QbFz%USV72T|2W8|o@3Iss;k69)dNdirp`SzghPA;l&+ z{XRHN{AHT}L-m9}5J6eVqei^~;Q&Rh6R5a$!lG}^V%?-HEv&OWvv8Kpw1170<*lQ2 z@seyFHEV9NS#kW%MPks=HNWh80+zcD6}b_=U7lANTq)E4$hspjZ+36X3+GK8elvw@ z==L#|R)Lp@Nvi^%*zk2Nl^pVq{L@gC3Tgn3+~Xhl^btq!dxYn!T~%TH!i+=%>uTVgGwm zfOMJj1(zRjm2vXczG(#QNc2B-d7v-zWji;5qJC>JmO1r5a;JqXH zbGhq2-ek69o!9s(RXr6!Ut)s>e| zJL{m|n{ip_BD5f4_~Phpsy|y3FMO9cv0UMsh1XUoII|I3y_u?+`;N_fze#CZP?+d) z7X&G9H*0=MoNu_(hBZnNq&F>$lM<6X_^g-b;sY^Brya7mq!dQq!9L99b4i*0{n~8o zZ+fc~-T7C7bw1`?s$5raW$gEh5tJB0BgP7X+>C$cN5@u`U}}n7c4f7&Kv~E+fK8{U zPwrf3*9Z~>pCS;JZ@VSVQb#Q@K7E*Vtuc~b=h5AHbKy5m+cO?Knm|7(uEY3MCy?AIRQcvJvQ6#8BX4 zFlrI7p3fEnzxP9 zPo!vN{@}|L!0O^FD%{URH?}hWWT=g7t^=lODJuH)cLMpl(hnewH&c{SUy~i}oh5v> z>}sBTsH+9?|C~`#PCl7&?j% zc;Q$$>~Pl`cB_3pt3!s$wSrGrI$^}<9&u~3Y&Unr`(@+Jq7DSrM#?c>d?9ywC#fvf zpP?9fz+dkB?4WeOm=S`Ga4xh(i`(c2ebrFH;L@(s;Z=8xONQ! zgTS1UDxk!_S3stEvujwaNS+z7e!>*#kTO30A|Kr00iVIwI>A&~gsshpPB2q-*SZGf z=Oo1q$p5<=IHXi4;|SD?*0`m#W|T);POH5q5((CO45;YY^&)|{)3T8aUSY;G+QZnj zTISK2#4He_PsNgpq{JnoIxkv_7yq7GPcas~aali}Wf#+MAJHJ^DDfhugiX!ie> zDz$iUro!)jD`M9uJ~l%1fZ)^`So9eLG<(Gon+XcKuUo=6^Ts74w&|mW&s;FSR-#Jy z0YTiw=RKaA3p%yx2hY(dnPH`mwlfIhO*wQ64RsIo1v~l%f<41GC!eznz$}6*E@maG z^IJzx3n(xsG$Y0$`j2+>Z{Y35$>CqsN}%dhD-{WMN-URFWWQOyMOHfFXYiIZIv@z= zl+1kHdJFfWy(1wo>MN*j_2%FL)mTZQQM_89&157?w-4?;*E`*!#fkp6!S=7JNE&OD zHYh5`3Zh7oay$`#TpUDjaLs1TMzPAt!H=Vay!A~M}X1_FUd3k%yaEN>SLk~B42 zMdB|lH0Xu@0JYb!A!EiE0$C!ruOFZl+%{ z+$@zdXc9%BL@4kxSsFN@=#FqVv@9x&1?#fVzJ<=S6NU((Jnu@0_%t;&9q&7@Wh944 z6HB0YFP!j<@*<@o`9S3QaEvbH+FOP`68XV2YlFQzrQ<9O1eSf-K|&+W z3JP3Jq%2r-Ym~LH%p*x@<=}E)QUM+9s0;ZT!EX0AHbg&SC{c$Ykv@PBNT{!m889}- zyUAz8@kn4c7Cvl9z;CrU3^sjQ>RfWz!IwR)H_$im;7^Dp&3|&7DO>J1B~g7f40SIn zECf}9>U&qBI~eGDBe`UW-l|XIRHz56;sP0Ztel{#ku4foY5a5(?20Zt!IxP?1>e@6KU)V|AJf5LIg~}V ztE+2G-5RNsk>?Bwm^92)sp(Sv$8%9nlE!DCPNLBKI%vQ#4np4^-KC==SME*SXPI<` zRJJTSgCcNiU*-%GO(#V7*|?Pyl6@lOuE+Fhra9O5sFFrmc3kdFPrCVMA*`6|Rd;&q zALUe44{A(6!ZpML+j|+7xJui2!!lXZG zcP}X1BbN5#>b~LYvi48|8%&>;w{S(V0bqMlK89p=avLv=_%mejqAW{0NwX^UywX_i z*j9ifEOpNyQBa}R@M-3yn{Ka37~J`(l1K7{4cHl`0zrI^1L@h740jt(;`ZR2;05D1 z5~Y2XylQri;7yyr^TpYN#Xmor5&s>C?Yfqb^fjs90Dtt-;V_vJN6fmLR8eo;47-1@ zr7T_&wa@bl*zc2;Vo~ArMOo^@;RBrVena8(ZB1$$dIjFmTo70=b<(Pzz=tu`RS4~< z>*=BKZ?JvKeJw&=Jr{WAtH$fK+LAl*E)!0RNaF&Y4Zv5wb ze=lb#C=^<}gMEU1{QPRezd_+O2pH^p^E+=(@mwt%aOjASMOD2lp8u27P{my*29#A+ z`uj1P_oD{Azx8T`!{qV-u^QgSPOR&0GxS8GR*M)?CK*iZsc^S$`g)zt_%OMLH1J%T z^wmO}dH?HbNJ2Vz@de)*0cVp~7rPuHU;X$8Nfvm;8dP`;DEt_M zCfBtg<*{Lg^}J} z_}@~VsE1WcKtM?F)4Lm3JRbjRd4lp8tmg3TYnn-`@X1Yo*}eLT(WQhtu{LN@9W*Y% zZzz&2bYOL(+%(y4lOpfRpT5Ls-%arbD#{1U%qxKH23v6df}WCxG7^|9F@I|TfFQ(- znpr?hKr=66w1u6HZ^u;8jt>7qkX>Yuwd1}Y9WHZ@ry)-UQ^W?b>XfkpJG>H zc`j(0s*)kRu`tc5!#ld>=I(A68W|7)2UCH2G)7wM0(U2bj|n0(6em|NM)BOnvs1Wi z>0d*-keo|IdLlyrv|gGN+$S7eQ?`R7j7&TrntC44@k%7?zKV%q2Qb;^Jyh=(g(S=e zpT^h*EOHh)`1~z5U67>gKpEO8$l{)LIZ-SCLXSCf^?)Z%s~PF}q$IcV<5iVa6>{Tl zJy5C?wf35Dv~U(AkzHkw1pkg8Z9Rszv;_Ku1P6x&oSq!vXloGM7*WL3#b+Z!aBHdy zmyN8>`|Y!tS&FtyTdMZ-s2rSdsOj^21lXf2?{}{)i*&d7G_dj9s*J?K(QS>;6w7|v z_~3oD<-QnmGp|DQIX#NBp-2RZYa?4DZT)esrMj^wJ7f}5x=pv#yhJ`^Wv=bo3baa3 zo()cLhhWxgV@6izr@4j$W%C&E@Ps9=K*zvvb`*B)uG{AFAS-iqA0mW#i|gY0F5M_% z$P?2Ty0Cm$S5s4v@E7PK*6OO4C)m@KRinPXUY08?;1LT02bg4Y{Unr=!EK8HaW+5W z9}>wL$*B?GXSVKTeZqYDTw5~Lh7Pf>bjR?xSin~=^zTy0Vh?U#^XOee>>cl z1;2f!2?;y?)z!7Xf&8WW>sJDifj|r-1l$Mj9?DWPjm~+g>ErW9o$XMr(!0S4{vuqp zQo@eZexf`BQtAe70m|N!_z&FMGILE=1+h!jh-aD#9|EKHN|!D9ANZj<8km`vsI}%x zwR9DykBwcK%uh)Y8GC!pRVXhC>m-(`#WPwrB^%YbUJtDaSB4^LMqQ1J^;l;ACyEvw${+2fa*Y9n;bK>6@*t;$A1UCJRL z(OWl)BEl2jfQ%RCQ57qL!8MVdkSD2>4`IJa?~|65gjt|awWxyo#MQ;=!>Kw}X%9@Z zFERHRC%hK6Hh6K%u>lk@v^fLwU73jAKze-6(f<`3^sNRCuS0zQ4omQ4AU({9( zh7^e{tkHoZnrKiJ#^bJ{+A)0;ZNu(~fLFIhMGn~95-Ed&wnZGlU-(EO=scQ{OPfqw zwmz?l-(I%@Ds}_4-qe}HKDd6<`K($o>=D?AJM;R@o)|N7U(GJG8CKU^2MrHu2oDMg z@Cgfxj6;J1H|51p@c$lDHnA;W?+t=>9GKU!T9uO4zfSl6cMuDX4THM@qD6PmiN?b>2)v=@5rh5*0@-_7}nDpq85PHxUU0Q)__ADo+~n}_F5)0LVvFL40j z-6{UfpSm5D0;?hM5I-3VLBN@%h+{C_)?ECd2Kf@Df@-LHp-{Zw9;)CUc7`igY_SVH zAIb-ewMD+e4=zX1k7~f$X-%AWO$XNL(2;bF=XK-mo?_h%(%D1Et9_Vh%oGZvD9^D; zjB@}>i{jDnz|HTW{|h8IO2x1_gYfnC-sm25b>uBkjRp(JkuQ6TyCoMwKE`#e_s!Xa@;!O&$9)8mp9f%@Zg8E1%sbT3#dNHd7s&Em&mIGkV$+M!u zVVc3`X9dwDwt14`FD!lp392wBlFS~yGEcx+NJFj==@a=~F(f-oPEY1f`1?z-CPqJD z!S6Tb=)@+2LcrSnb_0*rMtq`j!CO%BJj=L2`XTI_A^il45S>F2CGh0_L2FaA9YYOZ z8Q2v5Ufd_rmBGtQ-TNvT(M3iEQ5TFYhc;G;u#RmQCd=I&b@x=D!Y3ugE^V#GJc!Rm zdSaUMG1v}OhCJc5ysqrO;=+F~on5{Od_Iq_+VCqY_`JX96&UWwV8pY4UH22e$H3Q* zqnE7;fRDS?W%>7e?`p)Cf+B!T{`v-AC76c*ZVV4p7lmsR1S~3p8VFlUh?i~aJqx$< z8YyS4TsKH#?I|+TwfM4=;Q)RcXf(bGQR-|{&i9xoW3d$Ndx9}+vV5w~BdM7VL6rQb~UDKH9RxJ8v_c>SF@zO35>M_BzzG^y{oviE4} zv~-zUm20_Vp)|9%wj?egGa$^l$fROyN1(3NKO|E7Pvl478;N&Z{;2GqBuAC14}`uS zc_b?%59Hd;xE~)&#lS8fd=e1~)@-y6uDO`(`xlbm{NS_s1B7mPwfpDK-oZhTXLz6| z*bbah2pW;#F={qApWcMZ-IK+Cf13bas??|x(ub*En~Y`r;j=)l5xwhCWM;y3i zcI`nZ7e2t);004ZJbb}IAucl;;?@4vQ=OZKBO?>-0!toe*{{s~etF*kj>6FgN48zv zYiRu7>FFEl8c5u-IbYpMT{_`$+r(my833X7^?`?gS=EbIcnejK4Jm}3tPY=o13j$K z4c-eUM^oF|mzxn)I9yeH-TwIanxDS}3*FHH!MrMW5Z@Fa*s=gLg(0S0+%NqK*3e{P4itg(m`=02|I3#f9`qOY*>l=ldyBw6&i z)~VD?R6Fw4ZJsj)5w=r$81R^u@J&J$Dg5N*U70pK1*yv8Yfw|bdPb}i|O!l+1og!OsX<6cISSCSP zUF6=;t(1X8>P`OSCof>?g%7MWeAXJ6ZG9rZ`#SLP?powMg6cvNjSqhxW)eF^3i!4% za$R9Ty95k45P%IoX`@o~N$>uF&%}CMjNdg$m%q5cpcoW%{tFQsYavaY2?Q$0W987i zTBMSoS-~PF{uyzrZw}=Om2>w;R45Vo`m2hWK7(&K!?qqpIqPZDu5>`6k9CIckUNL8 zZ8j?tFNIUQk=lFoYJYLMK-b#n_iks`qwapKDQB8`iD;F0}mH$G^KdQO_MUq3b zManTVORMz*d zG0In^_c_*`ffdVqf){ksEovlt-HPxMe*8Ej#1C)yTO?KN4emzaWwfTt7Q(y=+shIk zklh@fqZ2N6C$5L2^9>;}+K4(t4K&ct$1j*Nx9L?ZU;HrxyTajC0sE<~I!VHDaS`=D z5{@B-vjeUoXOLbhc=xDo1DT+kkjOyX!nwOuLWaE)69PKsynd75BT0d=ydQj}miL<~ z!i`&dfFA&Fc&sl%QGaLCYla_SiXd3+z#%_?Lg2AQvI8&T3v}#P#>XEk(aL4yeB`(! z1gmMXhD>#GpGC#S%Z(}r#IVQy@h$3DT>NrP-QoIj_pb?j+uYptb|0w{b(QwSA_9qR zSH2^76$4uSH@+~Om>Y6%aMl4Pii(JM%rtlh1P3&=KwC6TMAS*F(z?A=R$OogHh&Zs zfO7vKbRYa&xI_q=Y>>igIxoS`v)2<_I%tdn3b-?WOf(4=J;0bwT9sY;-BAZ+bO}7< zp_-`fF-7oMl!#+bUpC2)c%X`+6TQA0F1F{BzCg z7z~#qL6r^G-NW@DWv8xh$jyL%gUWJM+`O3@YiAWmIAb7_&|5=?BPcI4IX$D7A75%UUSo_uJJaO?3WCvCpnh&*`a&R3i+Gig_~P(1pp$gz`F- z^xY}95jO~GjRAhz_c{RlPY8H-5Qo7b3P^7p?Lq#6*rDK;aKMADVbU$^*c}tn1BUkA zUEI+C6}Q&povbb}EqBD{l|&4~3_uA+ z?WOC`%E#YB9$?hBP~{-Q4WpYrt;@z)K{Pe+Uh-K#i(Oe=vn@6(P{&l@=$;bCl@$_4 zQj7uc!`MR(78ls%G#7rfv>-3O49 z@nksW%DSXe>?-us`OoGbz`c6_kQ^f5lz>Aq6F239586@~%KA>Vi74=K-i+(Tw~}ra zF%*8nniq1i*rA#Tn1MG0dhebr*Nu*jE_9rBR3Tr^Jts2eQg@SP zy@mN--K!;b2uzlesHA$-sfXk54ydXcK7>RT3=ZD2^>qYIy|%sGHjE{R#Q!l{ z{xXNnM{d4AZPaF0sc;RckCxh}4j7186mv>zkhYt6F+aOQycCd+nC$_l%^-deO52z) zH^&R6uo_7|*f+s@X(pVxSF2U`JW`9jpZ|LN%z11_{u?5g1Y$q@iSH>WBXw<4;BW-E zHr&rIm=}}1elh%bX)-(I8M4#I%MLu8?Te&h5Eb$G zfXlf@MkE9T1_spg^;zaTvt8m!I+j5vOa01<~zu33U zBB1mIHCq^yxI{Guwr-1j`_&zMWmYVXY~z_nK~6a5BQh9eB3me;4@BT=DP zV$0%z&lh|dI|t)esP0ja#u!fB3-26nh8N5J$%m?W^qC$`B?!B0Eq48NEwlPlL-n7F z%bMJ3;HuyfeOuYDp0tdq4{ZU#hF6wPy`GH&9z4D=_{^BS5XeMB zw83;RRGGJ@xNbA5+{-%E`bf|UAYHsqBZf11gF%J!i7`*@`( z+Jh?q1~;$>v+{Q*bWP^Nv{-JsNRyK223`kuW0y|vxq7fsY@J0a{=Eo-q;}7%1qwMn zp1iqc`Mp$7;K=LrMg&OSpiJL3|H?62W?z@)>NVNU*YOUqgQ7RR^6g*6&)FYJ%nU)ky|*cm)I zSt0-W@56 z^Jr0IOI)rP53a%Ft)Y(pOC(Z6E_l~qgfe!wy(T*{RSJwDCYoK!JQ)KIZt4wj&OH{J zB_4iDaSfbyyA5ZuVBryR&b(HNiaaVdrsmesS`--jHuK)B>f4{tPM`CN8H_8qeTvtG z(3wve0xregl) z8#va!dUfEz$s02NShO9cfp+>-vu?8M>x}GUan)Qbatw1Z-`C<#kR#& z1EZPbV3~dUhoN889^H!VT3GXwHSNt1>~g6YU#ka4ZaYa?RHnm8nfR1YVs~*$c(C<} zIz%pq0Y2y;nKz`epieb#27k_<(SN8cmGX{Pra`tWl^UP)d+&6t}sdB zH~oHa70JP!-kW51*#=BaH_GS{TYAv zBMDp0D;(Bp;N;Aa*87ml7Az*&_n3Jdd=LQ7OWd!MoU}-x)ZXXNpbix6$sh$nDWJCy8~=RFuou$G)moXofm>!TX>G zcj#^TkhlO_%?^%qAK}{teFF6od$QDNU@shpa%{7_S}^+&TR&mUR&#-L?Kg=}&4^ry zf*)B8rmc94R#h!nhI?x2&D3r?MOaxTmT?Br)M)(OWL2gGO5x1JD`vlQ!{ z(Z@W}8PBkiH)8LnuwEk%A?32AR=w&j7bZIv&JGjN}>h;?RGS|j!bvo>sbYvf`$CY+G z;bCsieG8<^Bq;2`RMSd-!;zc#I>dP+;VBBh7S<5MP0#mc>+JoG!gk2y+HaRQ*`^ph z;`P3|PdKToaSG6(6$WzUB&P=eOD-5K|tKjhHzb`8*NR4O~FD!oR_@Gf%tO z|38C>`w@yagIWN(@D2y~=fUEIVXsL~WcIjh;g1l7Y$c2p=etj6u_FQ+-~?92{9~bQ zQqV`X0B{3;Wz;Pg`Rd8=53F}IY}L2?|6%ORmY zlY}Hqwv6SHWk^B@$(A%^&oYLFY%wIu5MzubB+J;%gy=bS-Pe6T&+m87eLw&D!)s=~ z=l491$eFrB35JtmP8X{tV*KRI|^VdTbYM6kG;BM z7AMP|dyRMT8igYPe|{}XXPoum38#|?o+C!c2v9Yurjth<6(DA}2^#^pu?(~Bv0s7f z?^EcUUVk3YmJg+MZXiY|Upl7)m4rEJmnk`3oR_ehCUS`;A9)gNl^>ax4E1@P%}}iy z@T{==dC{T88i%&LekuxfpoXk#h&UUOGFL`_cenCH0 zI)70=G)sXZ`ka+we*1%z{DJe~p%l}?W|rvQ8QP});j>8~%=T^*UJonocO03o+781z zzuP0+TAA`A_?`DzCiM^K{rJCPK48#mN764q8WC@-e18?t__;ZGk3Rpd-zvV`b{Nb+7Z z;3=@u$T&UqIN80T*A)}6)9Co57I#Vvi&{Ga7UcZTwP1Q*qWjV~sdF=Mcbw714F zGcc90;%b|zXF+PWi)Dd<*pX-hy?qUBO9&)PSdf-omc}lgh|gF1zHV2no7?+J$c)9w z%)(83{Vdkq%-J)f2fP8$yqZg&r{RYC#g132@y5BU@alqiZ@y@f-uDQ**il#I?+NV@ zHMb23SSb>+mP>jxFz9FA@+f0o|$Z6)~5fL$GFVdG;WK2U>H;;Z?Cn)z$<{q4x5 zmvooW-ri5x@YWEnE}TZFg2>8_L+(|9oDtZY_@*R7F-SxtKL;GwH0iDBVTwModzSfb zK*q%WhC!9#<>m8#{5g%P!=1I6JmxmT6uGtNOA(h!B^o!5J>aQ*~OJv5an zvcy8j)QdjC(V9DVxI6Opqk~*$Z(Nk8YIqwC9q8h>+5r_vI*Ecnwk8>h2(d_5*1TRj z>k-obqS(5SjJkJE%f3jpaA(o`Y=hUO$ulA9|KaR48YgXR&a#n4UCLix7N5LQO7Iwb zQH3b5ZAYJB`9bZe5qMo`x0zFjfOedjp zTS8kUaGw6hzrZl&**!QpQD$E3jB= zDS9B%OQu>@Au8QegJlrxCqpmVw_NNQn;Yt)M$dvB%O%Sgs!iCuxT{tqO7$ z@Pi_}@C^OWQ*a5JoBiov#9Eg-hWL^ry?J_dGiV=7VKw0i+7b_|wvrr##99{;mNpm@ z@rbHnPrvpl2M284N?S#@CcQRB`%LIPGtAm%84+B=wiy^{;)xk-n)1Nf$$<*U=+vud zFXbuLEe7E@fz{0B#j>=^{3o3i9a)_?(_n%NNf48%w<=sy;0-u&gliL&5TKQuKH;oY zLlvG{kPDVHP_T(LDlu07<5cnMu)Ah`ZlD9o9qWFQQhCkbq(C+FiCefMDduBtw6jKf zCx6U$63=zW&Z3u6+Gm?fPNe3fj|9wrZ^CZK33fmizJMz%HIA%rQyg-MEvBBQv$}69 z6*x0UW80^;e*Vf`xOR;Hs4wEO%li0itiqzxh5czTtf!g5{RnMzq!rVpzk~=0SP)!a z-}Kv8v*Y6<`a%MnHeV-R-8Tz6=zw#G8JDkC{>0c@efxpqrRLey8uMQQZ0BDkICBRf zuk~VV-m2IEXU5p^IEgi)d)@F&aoTE!$zqnN_RZdosa(MhcBcLNN(ZG=$kFvsXK+=^k;AD2v!`(U;+kwExVTN;ZqH0S zp6`4B4G2LswCpC_cOnlG%e9ZsJ%T&V!pT&>hN^5_#gPX4!Jxue+z2YpE(TI&>%<4- za*Zfu^TfU%)US90@nl(%L{k31^)72*Ex9a8xob^Y+YJn=@5RsxbTR_h=&k+`v1Q8i zY=9QPQeE)+mro4IVD~HMG;fukb<6-=yY?&UIVQAC2>GUbUwNY_EV(=x?+~o7iBB==}&idhK8nU ziGFAd{)vq*(6R*hkvqZ82>te{H%jeOE~^p7#TIvbHFkDg6|Tt$6n5=;ff?7`>y(|@ zsWokSC$QP&and~B*U|gHl!nlTa4_LK>#i0LNJr>tr{EoJHUXfk=98V2S>+al85PWLL)9Wvl5!qY@D*?ktIFzu>3ExR1 zPhZsJ^w#Pp*;q61@zW*ftskCH8fJboaAe7EegLk0gp(0xT1U*kYCO&Diy+K8D{(&! z-=Fj67^(@XRtY^Ch~(!9L@xK^b70}OTc0rQ=9~s4P!cn#DO#cv`KxznF%NpB0(E^E zC6-hOu513dxZiy%$-T-r?~3CK{U+NI#_rOv2i%$R;IKsDgL=RtS!#f);xGSXs-!zJQCb-(K zy7zZ*2AM`=j4-_hN9a;;A5}Q#=jn+do?&4KZTzbx{v$Lh43f-k33=sd22*&GbLPbp zTYS|u#lCqjY_=lY_ypI}Y){Ud2@fC%4&m=s+u^|ImrNOu+6%zw*n6sZx&?mg79Z23 z*TrP9{M_E4o~*=G4dF9P4ROI3va8knw4P%6CA1}|MjJN{P*q|azGB5egtqCh44^T~hB*aD3x+tA(F{&Cs@`+ZLTsX#|2 z!*gg0@UO`-`m;mAbmLrfq@{MvYi|41l1<|VmpFf%Xmpi%W+VaLVgAQe#<*S&Ut}}h zS?k7!Y7F#vN%vq%NXWMb%`{WG>j&&XJDZ!n8d<)i0fb7%(+eP36@eVE%d?PiM&P}r z_+wD!H8XAMvMw?&RW;?jdedYL6F=t<%q!;QMAk^SuR4xw_soE0bgp=>iL8YFywDzk zIBE0AQzWa9{{bY(-O-})fW2_GpfyEmY>{@AZLEeR!jRNUU<+4`F%U=e)p2T zxSAjfsuz>e{u)8FD6nwr7p1TVz%Sjz4SU3));3pHsk_*24!Se|sL`1pbneNUp@AYj zTJ*evXcUgPPI1A(q?1=8OvH~|7;}*P%DKg$Eidx`lK`n09~&()_lh%uK=k0y#8$ai0cY;^&V>Iv14%#R5IBTqlha1VvI0i+=`5gS zJj?qrPfX`@&6sD({HDK_uy+8(CD&S>&v-LXBjci2;?d~HN1=Q2RV|F8a6gB}!%NLk zMkTr^lM+J-Jp3i(I_8}=>Nw(GC}7G<=bLIvek8-&@mzm~Do6x7x>IRa94yc${6@JfuUzxEJSOF65HjoM z8XjXt@AD%Wegz`~G%}vHQ5e%kh~E82y=(PG3ZFmT^w3T=mB_tf(igcCEN`X4*{_m* zj8UWFpsasDt|>pQUtuU(M%D_uw|5r6dh`DA>x;58BZo*_IuW-y_X|lK^z|(-$mx?B zNW~|&n8-Qk0Uf=VpUr>ht|_{C0`c(C=s8KD@cZ&<9dF(d^@M$p1BQj9BVU!$(mV;qHJz74u! z;9S2g?$1Hf0_%L8^|S5BcO^`}Mng90kax{^DbX*Wiut0uj3rS2UEv4{=R?><2SR+M z9s6_t!yPI|K~q62ZC#r{9#`=zU{IkL$ zuI%1YVh9-WMz5I(HXGmB*xZ~A9J=c({e$`@*9k+qt4AtKUc50(xfcSmW=j8gKm5Yrt5|PRx zOZfD<_(N41>y!zxCrB<@k$4Pw0x_H+S4vvqJOFgLF$bmO&(o`U2<&LS3eeEK6f)($ zrFVIT)Qo=^&8O___S1b8Ld{J72tszJ5RPbK(>LKyPe0aeAbl|P#KL5z`iL@H)K`bu zY<}zqN6t+@^$b%@1}uN>wSLNxC-4qyyX{mwm1*0y%Wc?6y+sW&exm`@cZZJiU&XF@ZzjV!f_fX&ugI zQu`!r=BupHv5K+1Y`e`}TV*=-CEfBj@+m>9-4bKk^eUkxmiG-fZ5{ikXo@EeW`a%( zE+yZsx?ZKEhb0yn_(i02XdaW;;l_~7~9?aZ~IVv$V04lMjWa*YU=Za zn?I-;#o}}GQbT~!a)T=FiHT>=()qDWrW{*zvrEN`Ppaj4IfHjZ78{+=A5$5(sQqOW zmLQHzyQ-nS8o(r5pjWDyE}Karn?6Vs1p|OljFdWnJdZs7O<7qiu@F^uyE65YOaISn z2^~J7N1m9J=ba2G&vtqiLrZf6sZayUtJq8r{g#f}`p$^ft3`7_h|V*%kTR$ifae%y&h{MP z>Qsp~0!*Qtl;MePo?qQmART@BQ6Vp(422@Er{I*Q!@~OTf}GNZl>m!V~RZKj1s$G!!NlRc;?^ys&7j zr_%2h`<+D4AE_7;;$WKwX^Ob9qs#~NbBwfvFP(aj2G_p9uZabNCc-jc&IlV4IK*m4 z9BLA`@j97-+w^wN5Rv5_%I0R^`LR)V_Ph5qj?qXNjJ}BZJPXmdTAcE0oEL8p(jjYb z(zni@Bc=;}=30?q;$eG#4MAEZ7zjWW>B5icWm!6{SsUE_^*0VcbY(KgB7Z!Op(!-1 z4W5(AkBN9 zCy#oR+sV>U&6|P9-PI)>Aq~2w2$4|G3vYMMcM`zv>Dl@mtQuUfjWeP!52l#)`6NNG zC!o|ISvXnzXZvz>NYOD{=e3NfEo?$BnC5a2!cDEz47Mt$HzpFMfUq z8wd)+a$Du710Fr|;2;ou>tk02%23I{sAN_XH&+GF25_J@So4OkKnt=uEo>D}4esC5 z(p`hicdb^R$%(57XR{c?P4=5D=Ubc@Eo`(X`I6mxq-PebcErS*l^g3TNPEeF8C;^F z9wivb@R{9GBEm|niu#Xc_@W1o#kNgux>t~o#m&r9SgUaVr5AYrYu*>Bokb;)5!jbq z5~+Af6=cA@%HorNQks?2v6xn|oIg1&Ar2UUk5EYue%skkhWkG%mwAgW_~Z|Vm7#U0xR&3*%jfz8x?>aH`7ALMn&Xn2Wv2Zof5x-7x0JSD*-0 z!i}3JL&FqK`XX+Y8z?1q3ap-gPj<=eJ??FoOAIV`D0w=B52_{q|CB?!TdO~RdY@ga zCJlIK3qM6s94g2~1COy5s_CZaulHSD6XM5?FV||x)pgzq4dKvB*S#HCiN1ia4m-=P z=n<0!GjU=LGL2;)VX9o%$=?%2;kWfusb119i0NNWr)@&tKqI&>Bkjr)rK8h0iVg26 zA9>;e`brN~fk31jILLqiDD$WW=!l>AA4gbJJyneL^izk#y#Wn*|Fyarcor_{7k2P5-d}lvJ%AE`vy)F*6YRL0_iV-0)&LO%27S#oSr-#L z!|rsuE5&5MGEBb*L`^=fg|f`OEb4YTzn`%_3y9M9IaLCiFieC@P*)e$8h@IS622M- zziU(6XeEcJe>N&Y)i5bzu`BXLvEPLF_ER1PhGy#sJ^uJAYDz5Wx{TG^Dwn#LPFMBx z?v#15lb<$}oY{c5G+7aHZgZDzEp%yoXPN@Et;I585x-!^F{(xr#-=#wQmY4tB_Hrx z@Q0dxp1A<|GS6S^=e3x2S-j#RN|8O|^&qPc=SL{pG@J=wndPO%SX$!VQ9Qw!6nBVN zB~dcIujgR0)WC^q<$h+GaZ?qV;F`U7WChNj4;%&L*~&VcaOoIpl_DhW)YoWlRU66V zjw-;+!C~MUB^x{75~TjJ1Vfsi*J*%yjq1|rYJe>C^22rti9py0)bbph-}F|3P`7d7 z)yi)HnaS#MvBV4VyERY5kIg)&8{vR07`5r$Ig`p3;50&rf@}FNWVbu%>wlS9K3WZJ z1*L=pzJ6(j7|!zGIB-woV7PiCx1I9IT#+nI(3U(VQ@CSJvj*? zi7;+OX`>%mNYwsgJ38FTmj+`F6nnNE#q_q{oH}*KU!&+jdm5}*w^R{QMh?{~0lpwn z?giiN{kx8ml1kXwli#!tZ5kI0yXJV7szEpu-;@(QIZ?SU@zc*g-s{#{`nUeLJu0?v zARZqST)z-kx8q)AXM%2S%qA77z1?sJY!a9X%nWZH4jDSW9uO2y6XK9CLGB$yO1eWl zX|N$`QfkAwOTq`v0%L&@qd`4#&md>E$$Z3&ZMK7G|I<9mu>_I;OOB#8G367^skCs& zD;of_PvfQGqM_C0rfQU8tdS&tti;y>UM1`%0&91t|2p||zD}d*qI<>Jm!@WB@}=@i zSvx~3HXiL9RP;8V=t^w-+_J8wj}vzv1x;v5C^(q z)4d$(VU~hUnJN7=wY%7|=1XS*g_@ax!cg8tVyAY%;V>>;x}6C5z7|Oj-R_4y+{|L<;npc3xT7!8=ptXDHnbm!i zIb6S20jS_alahGZ=kBp~x#X~WU>Hv6mqN;}f2~7V;-#_CB~z_?bj9`c1EUSv`Xidh z)zSw7SV*JH^*B=;@aihON$3){EO6BlWji$wZ-Z5;*0$@*bob;d$x*M;<`?v*;_ZQ2+^FB_+ z-*q&}9X!g`M%WC*l9xEpoof`zMwVH~BmY0>Rir1Ek1{O%3J4CU6^cVq`1P^CozMdU z{#U~8$!B%LBUF#Y8k}hK0tP?$$EMIcyB|~;IJpT-e`nW#TB%o3+)lDM*=>Lw$Y6-y zRO{O4_HTP4Xy->B>G0;j1}68b`W`nYpbgxzjB|V7Df(Kcl^P^R&e+8ouDmekJB)8N zEzz9fM2Stf%EVsMw#k3qQ3g@nBG>1W((gUrCIh3WR>RMjdfeDczflu9$H4L?OCWN4 z6^JVfG}H#XDwXXcST4Y!H5XxAAK!U0G1^(k64H1MTx<9crmFTD3QQWs0Wte7L4ZtJ z%A@h}wWX7c&1Oz_L0RJVpGlOsEwb70=!qnqQ$k2RlK!MHEKrJA!*t*LM7=_C%vob+;_7=wA^7XT3Exev%xrnyCk8yxyn4->pr$M7-|Naa!HiswDi{S24k)fZ=+@Zi z%&(|b=6~-K{qsPu{`lC9F#!5HgX_pLGiyX=g$1AMVBUg-%*;6H(rt@qTV-AjppmM7 z(~?6Gp4LJux||hQ3BvV0c8bqf6*-*jWTwSzW4NK}E8}f@z1bi&zLAf1=ql$eB+S!|06bct{8*IejrM%_SG>7-Bt&mJ?c!DQULr060hyEEZS!|jMn#HX!C^6*Xb2lkI|<&AEVDr zHzh8nVy^xNMBtvcb-3JNo$98Y2}rhG*vITP1WK^OXUN_+rH!(>?MPxZJaKrPa;id* zAemBF<&sNYirq>i238Xns569(t(JOR!#GceKD|fq<5*}&55^BG{FFp?QMqCAak4R+ z?56T|1A#UF#IJIU6EQOUOC=qCGp9}z1YIS&A=?v;`ICj zsn#&#b{`;*>bN1>Cp)ep~a!P==m9k-fuMJT6}0k%B+N|XU8yuEM(=AlEAnFP^l zjAK~N6CE6)vA zs8i%pQu~&3yyUq*ntEy_f0}x{X;A>XKnAy#9lz`n(+Vu!$4hQ6Oo3KF{zud**MHo9 z?g7LRIC^(5rWLNe7*`7wT^#7h(<_Mw|5};m2pTZ$vP~T>RQX zFB$MLtJDrY`+&cGe8Ijy%TPG>6-$4r!iO9S$J+ww5UFD0CXD};x zYWeiOhn$5#1C`{CdDC}IkoGvj7g#vOzBw2gQ53nbb2x1 zRD_1o1~Dn5%|P`cOgga22|Jkpr@D=Fm0nJ~S)RoTFxhY%4ATbl>b*7XebHq1kA@`! zj>?cSAJH6MPE}3zDRq`mU~~;DqUA@rErDu6fX3@JH*tMvTR3~)Aw}~_3RFt@-5t(u z2^|c70Swm&FS9im%jB~Z)|P*+{Bze!1QK__67S5PGh$qBEf9pva0;okmGhFUBdi1< zu|Yf3Su-xqe;X6{{YP*DY|oR{rUSGWs9?5N4`y&4b3MZvXMOq`>yamJBF~OKjeN8l z-!^kN2&sx{oh!R0R0lM+H$8Vud#a^^Y+ zE)gZI5gT?Hc9QoY&IrCaAQ7!*7R@&{&~E(p`JG3;axr6bk7@`7H&HcQaN4#M`x?__ ze|UYsy{sh$IF^BZ0w|RlFb-E_a6`Aiq2Hu68ULZi=5!-w(4D3c*2_FR>QXlWOa?xCXS#I!-E~(H4h(xNuaC5WV_CUf&yg)rP z&a$6!Er)Wgi_x1hTmCEtdc8a$=Bd^vN8r@zp_*s={kGZ1Z;0&g2!-V%UCCkHW^8Wf zMlFqvO&%DvPXULofFMoe#N#GtUGsF)i^xF=FdXmwT|U`(W^EIZH{$xm4!7&7{PNTD z7~nTH5C^NOpBfxA{7{57lGqBplG}NY8D@uU=)b6mi)15xNeZpKo3BY|BfO zgh;irUV^z+f{93Cdba?00gL(31@gN;o6p zG!NtLpGf37fy*tv%(0i}C3K$bEAT&%HWELEs)rgN>`hT1$#KmCeo4P{@Z3mPv#D%B zPN!}k*hk|_ug1v6YVItWj_}+<_N<4$lVA&MnvPE!8Vm;z=QW`3 z4)v93+WQLt3e9}})s+N%*VG{(Xjznkf3oYP)aoRXSf_I%Gcygpvz}%4ADS_iK%TUb z&dtiP#pf|;Lw(q-T(!UJO-=RLPbbjj}R1?GRo&nxp-CAGE zBCt}wSH1D6KxEJ2o-q0vs=mRS+Rc>)yU$lxi;%J@Xlg2Hr|QY{x1Twtu^)~FqwyXo zvd54Y*VQu|Qo2#ZQ7@V2TxlcTKv?ICO6YPaRcq;4LR60~_+BtV?zO_ZE&qXvnT?N$ zB_g$*B>d_eKB1d?vvphtuMgN^pCmkniJwryPKfv-b|h;bknB0ykuFDHdb=bfs|Xs1 z+dSfB@&OqV57+#YEqBgGjQ(a~J2o4M6?H~4QoK!ND3p_jO>R@-gxE*rO2c)EF1fei7w2Ie*_u<_k_z#9b4-kf{gGiw1O<}@Mx^n-oE zAC;ecZz43-ps&vNR5Q78j6Lg_0o9E`2UVwl#JRU{67NuXU5U*Y*n8Aw?1j7@nt`NE zUcZr4EJX8IY9FW~#GMhvAY_x~h}q);VL9hc3dOxqI`U8g0~l5Xk-~8Sgx<>SN;%pl zr&kf%TT5fd)aaH!BB9-;d#BfY#rwoMU2#7RAt1zYL;^ApsK`0!ppj|RGL->4u7m~m z1TL15ifubo<}Nc9I~1mbznAbu71@)$H2UNZt5l|$6XX5Bin$3W)*Le%EZ`|?MCSFzDc za%y7}=E*joA!}Rp=P;vBw`)sMB%>w7{kxZK!v}6g4?pu+tH(@yulI73$h({`jwk6P zzkeNbF_y`nYF>p748OH>cu_}`&;2Cu=$~{{tgV}}MusVn=FG&`27K!@Gvo$Id(t#?<$V~Pa%h|Yr0HJ{p4};HPIcF1Q`TCY z6~M5#SodPP)6=X(wvSTqa@&)<>j$C2r6g1>U<9^(3h9^O5(1Y5njBDXq0C6J3#?~3 ztD#q_B(#uw;?QuW#mK4ct(HYbRYY$kE#F$l@q|tB^CV-*2yO%Y;xCTMN7#*~^hQ90 z*gBr{MK%G&{ud|2SD&FuwhSE+T|&gM^Vppa4sSt4{dq~C{u zrWm%{Y>>e5b<{)g$kPiHheF^T1vRc}iYc0Vj}nyWaQ&tPq<>I?dmp2Uh4I(ezbUtr zf%NS}y=8MbYOLd*ltAw%&l~8-<22Z2h;2t}uG46kUOq_ZJxc`%pzzw;%Ga-~+^)dF zOwpYbS_EJOC!ZUAeJ0HtljoirsmN}GoLup!CoZ&_E^bf_?=GpKGt}q_j6V+ob*NtZ z#?u*sQ-y;p8u-?AzE{m}*x_J@HL(R&Qo^k!p6cJ*9vx&TH&tFFjt_@@iA;m#no4*> zTkfAHXTClMu{jN|iu3x)LRkc<2h$OK_N-+}VCn+jNoggy-dK5M~&yyd1KEL(oDqDW%;GAg07xIHEafXnvn&L?atX*-)#Ym^6sN< zNzPDuYiaPn=#7SRBbpS>bc%aw3O%xZhS>3rkmwit^i8V=o>K>r(85h3BSYn z87edQ;<84rb!p;yK+a-g4JrqAkvr&NoO?bpl~A)6!Git_UA-b&M{VKL`olrzJMxf+ zTmIq2djXT;vBV9hpcpA(I^6)`6_i|l_ z6jHW;YvmpWg9!-^>VKb1=L>+|Kqr(|DsN^s*g0E6E}8*}X!Y;37ejsd)`wd6+T%QU zf-A2+c3)OE1)=$p19fcHHs;7SKchO$TO(HTV^|xg*oK9wUH)gPOOy}2;uZQVXMe!d>S>A^{L}DG}+PXY(FS|b` zg0hrSJzr(aa+DA2EuL)Baw5U2{pflC*|xxkxWL>7zu4>w$hYeVVb0rV%Gj8l_iP@+ zN6nfgEAu&n!BL=c;i@HG)qt#DsF?xcIG?|=uX%>Ts;RQ|yWJb&{7CXnKgl)Q~d zOf#vCFHL&e#jk{on&N0%+jPM|h0GA*Dc2zl+7!BvVO(D1Pm{$p;Ncyn3>FR`RF82m z0(5w#(B@KWp!Mgezi7egR^a#A2e0mT!>dz^`4d@c)7z(-s?jY!58ADU`*Cs~`{~~l z4hrj?*Ob%8MZZUj+Mlh9Iey4#HIdh!(HRj@g8oelN_$fYy**0#eE z%w-^EEtaR95o^X^5jUx2L(Jt2K{0+JxupC01DkjP}+g%943pN zm}|1%fCo*@)lY-n83DRw)4y@S`lj=(?r)XD6!YQuM3o~?Y-{5yxs|Z)>~qwX_F}!A zd<*@zVW&WMxqXquQ=(m-BP#J=1wBOV23-2f+Q5E3qFb5BWBp>Xih zyIKj|;Y8jh1j6z(s7LFF2hLcu*(BB7W}JdnEHu z_k`_;cef4kS!8z~jTPbd4k7IVPs9?_jhZkic!31`T@||wU#5hSS%3=`F(^(63&j#kZ+Nb6!?WXRRqjQ?%Cx$Ffw@zOv2;8&Zig+9AGaeF+}~+2`od8?v)Z;mG7K-;x?s_ znEv?VWP;bwe4CEs9l0OW1sC80QO;rRmVBfm?^6T zdS7iyXJVw8FTx_HDa?_?Bk(=IoK|UvdmVa)YvRV4tsM_*6nWoRCW(D4^KWF3i06Nt zXAF|Wm;l^9Fh=TZAhK?9b2V^#b*p>K>#0B8M{sgk8X$vOC=_T0&AxR_=8GUN2>R^& zModcgjFK%O%J5Z!BXH1dE8Lv$(jBh2CJQGsT=owLGv(ytxQm2bWOIx9s5LRH{~wTn zft<}F_53TY<(;CLyd9aN`D(w3fvMFZ7CMCYL4jM0PYT865z@SWGlMQ*6j`F82uFMo zDcfWqRA@B-7og3|OANi?5-<(tTHrVe0tNhGy^cNZDghZi6DKnc-Nf3~MjYgf5sZ6FCsWW^BViI^ z9Q&imN-pynnlN8B==A6T=XHoGs(IF{P66Bs9Puc@RV+czRXwXSxg!};t*o)r=%t)d z{JfA%^{>_XiyMrsC{ACYcQX8Z^r4}lo}6haFho`DJX@{I*zABAc&jGeijd3da#kuZ zkbxXx3feaWV#X=WZf$QOh%QR08)X#GJP;lyz=&QbS@t|&KQ4bG`qLk1cOc!TRP)s# zXD-KMY2Re6j&JnC3$E2CBi#*(Fw=B2A}H(ov%HK6xK_<=V9Q3t(Y+BWG@ktkJxEi4|_F|AqR=y6~W>21vNJ#TOq~%7m~#gd6Yg5U#{A9qza) z`9I?Yhsqm56JS*!UT`t@8CtoLv3MV-uX^39ZSPtG$%U$pt3N05H#_L~2RpF-iyiP) z@Z=&8knLw`m+WwMQAl9!t=4?Vr5}5)gu$H*8c;N4LPu{m z@dOs`yMGg=A{-{~O?As&(Ut1|z@6VLovJ``dIuzl92m$K9P$qYchx~+C7u;{t6rB$ zGEO$kB`mIQ@2q$$l8U|nWn*i7l^Rix`xVsjkd>}#q_-zqkN`?v!pxu2!%jAqkvuUk z1_H|CyKhybc}oe$7=$I9`!K&zi!((L824ukIP+bC3}Jib<6lO!nLbmv7ZYNvVtvnv zY>EGS?RvP9X$po!X*S8W!uuO>-zF%~#ef$i?(+hG{YUdhc?N>cY6(72@4+^y|H?F+KKLK@c4tycTydUvyI|e@j_mF za>cO+jNcvzz``V5DrOICQJb!S189BIG3`O^G1Ee_i{iD*u8oAFK20$67pYUphU-&K zGuC;*;m9T3Q&Y9zfCDkbsr%D!aTmZ|rE}aQSZewN11_GLWPG?|fVr2e1RB=pswj5A z<9u({9zxLiCqhX38zB__FN9EPdiEaOq~E3ggb*(OjS$qve~b(b5>9#kP@1!GRC8CGphw)~hGRq%V3gfS72X z8;F25IxE{{OWHY&Jb0)j49ILuczNQ{HgnICRQcqN4Hq<7c>O{m5nev(K|{?0%kfCx zk4xHbwAkpC7&o|n&_IoZIGg21+JKj*#%2lX!i?(6j!BCX z80%9`;x?`%(mi@(pF~0%9(@2hMkgguTj&d^3!!l=PT@_jdw*fFU5+8mP- z)z+Nj*u&)0J?mS$V2T=e5(_Kbw^lV&8*l!YDLsP`@iKnH5ogJAZRrX-0VGEKJNeckPo-fM&{JadLnC~;H;Nf!g9C7*@bG)xj8}Un5a&p&KY~DLkvqDTr$A=C4VHIc z%%P4v&t`bS6`4*6Kx)~SUwXYz9MoKu5)9flmL)hsgr#%S9V@eX#GW3KrZYw z-|BKp&OLelMz08+?=*j?`QS@aCI+l^F40+8BvJZ}$Em5?;C@3%+7&jk9uXOCOZ#i; zP-@RP>ErcI%RG0Ha66k=j}k~#kh|95>a*dl`8@T|#74N%%@>1C6{1P=8%~mg#}7rm z>J@ZBR1iHBZ=AL{y5Wl<{BNMJs`wvH2Jk}vZ=itw8z@}-Cs5G-3n*};lRXt*#JWJk z)s8Lr*vVF^%UUCne^_WoHNviy127Nt3w5gFAkTB?;m@rppjoI!-HU*Yp^{3CQyC`M zl?4?@`*O3%6J8pMGZQS2Wn;}x@|vCGX`lMGc5t1d0($=tbs;l!8O7<+WZ>C`_d%O8 z0;o^v^p{a7@Qu&UgFJLwM%0wt$G!0fcQNi8ksxz$OTqeZ9Prw$-psQ8jT8Vp-$M$` z+5bQay2(7xGQrq`^YzxU)yjLr5AK^KQFIBw)26V@QkXT=XRb$XPKu10devwKbaK6+ zGyfzCp6@|(yB~C&QcBn~SdRHy>p7qDyx!xcZ`9eG5j4iR zT#<)X?D9c_^{=o&bGV!fLNO_(P?DHviB0V_KmD(?fp-9~yUPj^%G4K3;|Q}pn?b1* z_BJ?60{-&t^2F<*f<$*}fIi!f-0k@;PrvX=8i?MPnrYmlJN84Gc`t3yEwM1=IT*9) ztqxgdq8Jw1Nv9}UgqoMMPeq0e;WxISo)~gO2Q;0?D3NhZeU6PW0iP_=s!Im5+d}WL ztk_-2`3nU8y1E1A4*f*dFgFW-LN4#RS@|o$T2dpwfPFY0$sf}-QF%SX_sIt1`^IyU zyiZ#uxoC**BdV@JvLlSHpMo!R=>|wF@@!GR zq=Vdd`co!Q7}l=5pPK*@FCpf%MFf2|~){ynp==l!R zf6$%}7jbARH41~U?^;BX<8Kl{>@@WRvwN&7NXMQEixY@}iernuZIknxYu&%*Q#YY> zN|1frH3u0QMn}gS6C^=Q9xS@>^cG2!?>Y7AVoF`6a?PcM=p~#yUw`*Gyc%^a{TrvK)pm$$4Nu z=(M>now6XB$fZaNNXHt2JJB}`CsC-`z$&{vkJ4r$nBMiUZ}T#p=MkDNvb>>FI+HT# zRA<+nmHDOu)tC(~Wh$(4&r6bbJ~L}2&L49=DP9La6)oVDB)&AKf^(60@+gS@u^^AV zrHU*>3(2zimr{Au5AI7PnOsaG<4qf{Ux&cxzn<1OuJ#PYppHSTSn}bmMEA8KC<`>3j>|cGh7I6n(b68aP}kx(NL&965QVZg5U{z6xHS)RlLpz(5FMcT$L%amTZi zG;#lWhAQ~@M`Qs}!CyPJha$k;ED_tLk8X0_P>jD{y!Rb`gNQ(ZGuV{dwjEb>Pqch0 z;n)Zo+KbRK^+Sm=o%~0ob{&D!6Xt2wQyP^qVkDDb^5z*HZ_Ea4|x;#ID7CX`+Q^nC!Q+X#6*e0Qz6c+Y-nb ztW?p|<0|`N4ohtNrm-QtBoNo#u%n(&w}IsWOi>tV_vvV+yRAutmSQ-gklS6p*caU{1bo@ptcqrr9k2$t ztfjt(M4?}+4=kQ1A@pUL)wQ}X}%);%S*(Y3F@@KI8>0J|Ejq2amw)XGFzcQFC zHxNs}e`C$Fz*-k#?8u{D$}P`7238F%a-i2XcXntY!io*_lH}(YFuLRO;F>6)5-eGF zwyxh-f^cm8Gqce7&7uG}^;*q6dyX&HKuuE!vz6d9e-y-;I_Ee-i2f_J&{&01VK*6d zA8!V8jrN|!Uoc{quMMZgZLMRqvF9r0=k{!$bZ|jjW{mNOyxJ4`Rwsq&CJv;@^F@-5 z#-PDeV(l#16san3%lAB6WMW&}ECF6lJjNkEgXzA3`Okuf8N-d^OQq<^`xuyf=9{=l z)c*q`RDZ*WvahU8#`~qKJnNdllwRAK_{-v9EZ;Qtb7P;`F`eho1lhuR!np#T>qo{m zz+(VYc0h8UAuDQXv~U@4N-%#-tBK^4G5HKXkp3iq7*64+BQJWZk3=0nYBf44ybhO3 z8~HoB;87)?Fak!g+n0bW-tM!#%?Ai;o(_N+C2N0TUo*qd&vb4W%u97 z1qUT;ukA@L4oU5XUQ#41gmQz#Rm!)7= z<^f^7y9MR@f!iJg~M4z7o za2KRdQ#yfTpm)yKa0fNZn>I4de+JuKx^(Y`8sde&Abr7!lc7Podj?d5^BV|ov|j+X zK9FaXU?km#r1W4OC@_OLSVzJJpe8% z(7=A5vmRtn=0q03yv2L0lfv#h&QpkD)e624;xwX8Yxhqu5?8v{OXjfIjMAoFwe4FK z_by+~dK_xSyWX})6-1EygF|xfEgir8a*W?Y^BV|aJ z9m`D!)TuGvn%eD&WngztDJC1G(FU@=hgc-%U?{fAHMmJMHhM_5L%xaJ?|gU4jvA7-{C! zQHN+U**~T9Su;&B+t!>+q*Z_EYK!kUXQ`nk@s%2fs3~zBHW|hK_~wQCl=8B>)@v>t ze8QNj+IKU_@5eOvQF;g}c%G_DQtdwZLA{%=Y1pM)7c)K&?B?{{HJZPXBBIYuk19Gr z5Nv*B;X@@hbv&t+oORndw3=&{E3Y+l#Iwlc<5w7u$_4VkC@&JjUm8^5L)8JFs4J- zkkSThKT4KVigyYYYnP|$C||hEw@?K67vL;HNJ@k!=vv>)#Bl5jFvCkc)ZmtQ(mJL& zrb%bamb_&ylPKSk`gN+)Il$K+^}`Al0mxVKjATZnJ3yJ;@KsWpjmjsSNPW@uiIo=B zr=Q*b`d|~uINA7|vEU^m{c2!7;no}H%%(dRXu|s(3t27jfS7s8asgqcUP$ zV#wTxA8s}mtzhL^uM_+#v=A#7G4<@FjxCC{`^-d&HY6C9e5k?sdVud1fjN8W8KGOj zG!F)hGc^xgk0Tml)JX{jcC`B9GXfnL%{tt$!A`T@{;2elzU6rzYum7i)PI!pC zSjLX)3_bnHRAaC7V6qUpp>x#HPxr^x+VM*m!EGTTXD7g z=UhJTy`huc{?^m$P+c3(gX}+zykJJPLwWOzR-ONaIjVPJaw5} zb6-3}?hT;Zzp}LIshCU*ZML5e(w*@Zoh|`=7j1fc^k%msU-G>Mo_1Yc*6*vn0E?R_ ztW~x-iLZM^;VB$J!D};A5Y77$Kb&e5-f3*OEWvVYHp$=X1cAC1F^a8%=7S~i*z7Ck z1$o`t@tNyWC)!Ih zL}nE1A#Zl2YPU|~E7F8wL&@&TqN``W;pI|FDmr~mrM4h`#uy+IxgBHZ*p4ymsOMT( zw@A2oiv)Ucmc)OweS7i)g+*@1WalGwexHT>o7wICwOFsr{cfZ|I}}()Ga2@?re(yo zR?6s9b-yTOk>?6%Bk;SbN(4EyT0P1USFM&hxQTfJqvBM3@mW#EaPH`ඬWtrxo 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

5Nn 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

-7n@K!CyX?|TC?X%WcLmay61}joPU!nP^ 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

=YPUx)=wYt?muThCD&} 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"alxqK}EXqps}T%hux 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
  1. &3mn+;isMbndxx&zpM@+)LtKCif0K}Q}~ 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 #5NkRM~487rSi>8{+B1LsSr-@ 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:zsB9?#RZLrJQuxdt;z9oZe&(>ylNGhpi0 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

    oR%=y09C29qKW0!(|L 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%0DnqJ+xyyI6Dhl5uJZH?fJp&#}b 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%0Ab+C8<(g^s*p1Xz_GXEP}I;cP1 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 z zb~bnSc7d?+{4GKcZkMn3!;?9<6Fxhnmpmg4V)FfL$v(1(Es(E8=VH;flK$Fp*dip#bT0++ZWox5ZqD;nwn5$*JAUz6oWKa*sHWQJx$a4*8n z^EmLO)LAIpC*RhG%!FxTY*WR78s}0`0u*)GpRALtjl<-2xs@)d0ki7MH>%0T^G7am z2z+Bv)P5JtN^yIk;F)X^9G0+YU+-VCWA_b)b#JWb zjxu@_M%T91LHNayEwWz+sKo@GeU)Ql)Kj?YN~o_umv6+*jk=jVx`03^5y0{^@|z^V z%={o*dhk(6zV#i5Z`e!g7Z%5qoh(q)0rXf6x4Lbn%a~S{*_&`1;+WwKp~{um>STco zuo20QP5OlTaBV^dvAacYjr}-saOC5Qhll=t`2chxc0jQ?uvss%XaD=*qI3{wQFmMF z&VGNF{!abzh6S#~nZg@`QkLu_3{o2>$Y&N{m=CB-0{8ZB8oHd$Fef|4e&`vL+p2i7 z3ut$rsMNSLtHO8{sN5AAvgb0LS>HA=)HgKPH+X6AhaqTG!f�xt%yRdFuxrA`|;l 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

    0LdhcE{v?5KeQ9hT=Du!s96 zf@6&Ffx9s%4x+Uzbu@KrTg8b$D*vSVoASQ5<@t`t%bv7s-N--fctDK)$Db57EU~zV1$Q&E+PO3pge*pVL}VB0UHtcZ=F>MV=YA$tf<1*z$5Vn zyN?LLaRjS^{~E8d2{d@Q6v7(ZLTw}#9`v37f$sVdTGd9{V6}N%G$S1Nmk&l1^rfZn zFE5S=muAGmYcf%4_=kz8YJ5p3Y7g4q1oy~5wU%T!!nXxRb_|@A3EbdXTbwuFh`+%a zAHhPSHWNRZin@<`oQ~SY)uB<7xIOWaoPvoe+}`=*yL2S2+zqO7_Lft@hG z+d@}n^ZdmK%!U6R5C-%Afe9|f|L()jBt}Bica@jPAp9#b^l zT3XsEKSGgwLz@XmHc(+2A%E9r(!$RPOPl9KXu=@XrPdg)n6|9#w{1S&_he;a>@K+UN1 zH{oR8W!%EaMrZWm8^bf0VcS5|DLNx0Z%G+eQDUMhBDC>ae+oN z*FMK}YKr)gp?V@~WOt0|0JN7Db(n7Yde~BHB7k>IdU(d|lMnq`wt7J7&`j;8eUXX3 zkbpu57p^stf|lJ+`xn*}^#ha(TV{XE-2PM_ZMsXAOEaCudnwfFmyY_8|Iyd_L;vcd zm`X-{QT;`uk|^hrQ5v#8#uQ@scbV*;Xj*0XcY{pA>uEU$;rr7kB4Cq(sM`={7|xlk zw!gFvNv=arJcdqsqbAjzt;uX!&UkW)jx&;M1aV#?|2N?>n3P2wWlU5WOnRY?q9;D% zr=uq54322X>-uX8xD#zuuIicxKImqxSn1v_xix&E1*iCaq7XL?UP~uiK3y9j�}@ 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�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�)+%jf?WZj3j!4#SKJ~5%%UW>1=T_IO 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

    Hqui}PZd4Q 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%0AsO2wl7Nw!F~j$~U)wu@v3OLl9??jhO3B|BWQ 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 z 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 z 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

    q-_W>Ou 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 Pg zidiTd+$V)uMMsL|Haiw*>I{`emEn}G{4P5|LyD9x%QsB1+N6&t@YRLq<>nUV74huL zd-dSR*9*%w*kwmo1?eJdE2_`SvL?2LOK3~H(lK^3w&(!OyK3oi1kB6TRk-o6d8P-vakHJ=NceU&*bIZl~qan+|wi`EF)4OzIiH{4W8vpR6` zaJV~5xKAB6DCj@nbbi=L_4Fd@`bUJnESj05nN}X|Yo@`SEclMaW>zVG2-qnHW?W=n z)zON2R`K#Tyv`!!BQjh55V{*o3_}y>v82tmNk%26>GqT;rICLQ z7%`=p-wU@dkv7lrhk9y~^4S>bV5}B{OSb-Us)biSN+#_c-FWHfM)8Wx)zt-iua_%* zI&7Zoy@ogAIK3Pl({ zPr$49Wzld77!NX0G%W2kE=6!JeM2N&T+DWVM_bQ~$gDsWl-zTrp-|zx+`8LS7pV_S z$JWXJ-RkFPhsVC$I)T$_^D>@Y;z{?3Tc+KG(m$Gnvr+C|rcR`L7MEI;R8}&!?UU;) ze>W8+?p1;GT-@2Sy=NZ)w=7hISrhm_1)F4ugNS3fgW$K(b+Nl8|7Zna-hWtO(z{VX zhqIO9b@p=?6!gvHF1+QT6+VrA z@2<`I6#u{Y_e}!**J-|d0crpPtRxw$M41?T+}|<41*uV7QB8h*9+IvqvaFD2kLjVosu|8PIU<%%bK9)D4*dm8Q-la^Nw+6WBp8LaUKLx!9*r)qVz5-@riWIJ*YtUlBT?TPlR*Tn_Q;?*fVcG%}4()8z};$!&l<4Pm)k4PW;vhPfgZxBEhp z%x%%7A=HolhXsRyHOvn@WPkpXj$~cs_;PJVVcS^xD;*0@)ES_XT>$gZs{q-tsYv%o z^E&6t4+~IBvnB`{{NjfaPR0k1iw`@CtQ#JGL_&<|u(Ht7P)$x=VNT}cmU-9Levzh5 z*QBZWVI8fY!Ymfut8A_xy0GtcuUmUz;d|TPhZWZ?o@{t{OsmgBQ_#F-*9tsa zjQr#m3&qGEr?6the}_IBs1Gq_2v5M5#J_BQq%dmGLBdvjM5oXn*pzqaygO_j_r#12 zLgpMdrNNU<8Atm$$`w`otb=OTO@==Z&c!t(5OcH8Os}-iq$Fj$B2QhJN|V5+a0zk^ za0@7KE%wTDI-)G~t#HlrJats2QM?j;C@Rc2QwVpLiMX18G(x?F{}y@WQZ8z|C26Sf zT1(<@LRM^UP=>rsRgzvRjR+SqV{$_gq>FNIS$bJoiFLX%VE!>S%z9o{bb)N8LzTBg z4aGL*j~)x{8NW(W9>D3i^fh5%!08@q9;M&5lJ$0x>mtngg&W?3-p&_7ygaS6>{sE) z^35w=G9NY4qNRA|5S;&u{wMZ}%Wo^`&Te-stuvdzsfyAd8QZ1;&7-g*ze9gz{Q%Nt zGn-~U51oQj>F`<=)fHVTY%FEek6W3lCR!O*;rpikt7dPc7ZD%Z;{kC;h zM3J{9qPzew$zMlP;IbxgRAoXZOvk|R4!X(c{Z0}b5lVo}RDb?<{W+W)L=h1eHvpkJ zHcl0!@ic0()I%w5DrQw5j0jpJ(q}pu1a`Ef=W|%L&isX`oD$F(~_A6 zl7;tSaF<$&WWSF1*{b0|DKCh>^$={O{-tzD2+q(bJfv(ys4LudtHfAfm_a87nvaQ1k z1}02lZoT-vufLogCP5KYot*c|t#{T}tunU{n8pdB^Yot|JTKsKq+V)?2 zlaoCnHav+~w7qndZqL;mWmucr``%qVjYYzGZVO)GCv({oL;{-7C-X5VXV=BtitH*P zUO0ZyKKDd>ozlPd;FY7u>`~J<#VyuEZ1!t+De*ZknU@MS&iE@1(x0!hM*5b5zV%e} zH$S+|`dCI}uKXr^hu`Qr_1LYT^G)oS$5jPwfg5BH%f?LzJ0h@SHmF7sS0FZSm&L{^ zdKu5#Fjk;9Iz&uOs_Aw3qKu;yviLr=eLZH%c4zj);5IyA14Mf?0?9U8Ot!Fy+keZI zTk##FHERTV9Y5(GtdpYg_CEDo4Mm^HI_CLUK`(=#@d^aRmx%ZYeQPO_%1llFa=t@jT77Z}KiljF(m&YnZ}9`Bz#ZA1CW|b2BVEBpeXNkLycs7`gLRrh zHC5F4tT?cC<{n*mt~V|`je?G!b|xys&XllYLc~mnsmUE-^LX6izypVSsyx0TG3Q)< zQf7K)PHt)Xrz$KHrV97yN-}Y&A}ckr$mfE8*_fSy**AqhBnQ=0mbdkF)PZfG&=MzPpk6h>*8mU=?3* zWKH+}%k*&9?VjTI4qiHRvHg;F(e)d>-6M#F&AzON+#qdO+W#$`v=QksWL=Un);RSf z%V(Z!N_J?4n>zG|zFS{4;zTSFP?VOGo;=oCm+M*Cumh6H3({yWQ+Pov!-a@VMr> z`_OuqMZUUVvgMTRQE%pdpZe3_m0ghHHuq9>xAD$)8b_>W!Ik2piLCF+@6&z8vqhiLX|5DVq^-(F z>MwL(>e77D{89p1^~$ho?w@!glvlD06x6{gKU}CAE0Q#12mD{wHbA%Tl+mrWGP>0t z=+^6GhqUBf;U&fu<7GPpU;n6ax}Z$5YmSWL(?(X`$iAoj5W1jG>3BDK!j$at%!({T zyQZ_ey{Y+Xty`sAo@dilr7zhn|BO8bJ7J&v?N1aAIdX;cuj$_@7J3w%(0bo3R7Pb7 z6$KUW)ba+|laRa!ld{P_*o94_{J~lwLf(EIlU| zo|f~;bY>DYC$7;b4Ol|G5{1s>Lh+D(P0lX0&jD~lm(3E|GUyzg;S^7x+wVm#Iuf>v zG5>8C%Z3|V#RxR~UQ$E1FUknYaaa2{-){O>)o;A7+m}kqZlhQV@WN?+<$&S$mzU&)jnFY# z2@p^Ke?fKDeYajj3zGStz?rH-^3?e#E%H%x%uF^{5wkILariEtc(Zkf**mKzWQG)- zRE6Z0WS3`ELY#63J0yFyX!k;GFn;5J^F6iSl>W#Yt?v?FZkZ1=nXzP?KBhcS8^QnU zt1>$3>#;@T_f`FCtTp$Ri#6FcO= zTNqr&fCR+^^Q^K%bg$phzPEPo5oNpcP1};Ah-NJgEf25Y>8^I;x>An5VOV<2=*g@U zBq-H4DVR^l$x6&LElSEu$;+=O&$#V(m%P|0sAOsC*)xC)N5BfnGd?!Tcb_S<>hHw@ zluTpO*xV_Q*yeai^B|WEDQ;H!>YVc2GI@74O)L+&;8PG>(ySyQDrwgH*dKJ+z1y+U zV@ye%XTko8!zE+TH#~?WfskNVXK$pUr~Qp}x>fq_cA50Zb zI7G8z;*`IE21)Py2PVo1Zp>uuVtrHvp!_?{s97#OLFXVP^#srMTES9wc;dE2%eLvm zN4*G3*2zCIz^*S&1c5c!G~iHT%067N)TfjDF2%Pbl%A_hA(7?hOIiz1iWv>J z(Af=O(L}J7ZfrDRGnxSKVIxi0jAnT-8iPw15JUWWV>~1RCWd$`d0>sfMhuY48c`Kl zye?F!@>6-IL-RTc+2U++4EcSt92uhLLQ4XwVO>CENI<5q7T1&L=D<#Ao{vCc-2B4E zg~x=%1;qy>xFxxr1E1kkl7BggagTA0_PY_L%&N)iRJR=hE^X}t^842QBWR9Fi*T07 zuq0V0qEnNzsU_pD(ar5_a}QnC!IpK=wH<6Nh%Icsu}75i81!SasI*D8dRa5+mV(6d z{#YBjLb#oNIw_zup*o=m9hCfZ62B>aPn=V9Z9qqG!>LH6-Z9rM{Y14^N#Yw4kjcl-%^3qN;{W`dSt>{DF!Uz>KysnDI334-c-$#piNZR&jqw z*q^vJ8P!dXbAgW%E+&<0`O<;L3rRdE5o_UgV^T&5?j`9+Ju|3D;^6@YD(n-;Ez`h( zs!h{Zk44au#BCEYp&vG*uPXvh`JD3e?eJD2K1CX`RWNL!gIOG0Oi*t|CJb0oJ(8tm zyM?U^xt2SY{Fxe2*w zwVcWwj8twkA#dGo>udkN9ny+_39>cyrKW2DBR=reUm4i+1R%FLEwb8oH%Z+ht#d)r zXVe|{A6%dC1QW0TX~|E5VWddZ-Z`OJe9YXi?LjF=)u%gspZEUQLP;gks$zu9Laj9X zBb0b!^+9Pdxp~=zSe$s~d1M4sR4GIA;6grDL0C6+maMkOu`h#DqzzjHKoDNTtAhwx z;nI&eRH>rFiuNjNO3s(omGdMgH9I9|k471}KXkw6ab0YFh$dF8Q)iR>)E{&wcb+~N z8svV=-%H}0!P(09FVI(HR%)t_O6JgG6qZtj22wy*ZEyzv_SxvLgQj!{L^6cl`Ubwn zF0;r4-$d7>v|!aexmRx#8oz2q>DOoXL7ULfu#kwTka$&u7AZ%%)PfX3Z^K4>n9BgQ zEThZHYRz#;rn&rXWBQ!h0G^MN+cYU6~({=OZ`C z7IWHMZH_vRzt{t$lQi=gF4x;on5J*8GV8vM`wNQ!=+bEJBa$-1yerJUgU-Fk=C;$h z&1~*vYTm{+kTUmjw}#xFaA{S%@F6KL8GHG?>rAy9d~=i$H*l%7sRY8&&mbKANE-Po zc)U=gE~e&&#hlTOg8+i*MxID>+oTJJan_n-YmKcAKaj(!ZG9 zE;BYu8kHchJXX^Shrk^)kX)(1QQpb35%LOP z9DA(?N}<`;xSSx;err#M^7!7p`)m*Kbhi~wPDj_n9!LGjO}ey}&V@+TjV<27Hu)d$ z-yiG}6ssl(R9*D+3l6C|9^zY{e13EB(@$^#s62Mw{OV59N2iG`H5V_`HC;T^a;(jTpHJ6` zHpN4*9ub7k$@|iZgF?%e0;ijGN+0r+*01h+Us||%KyxiYbFE32ga*N--31n^|LUvP zql&uFcH!2Y0~sPn*;zdnAqpnOxL!jX^xJ zzk}m``~EdT112NiRKA!YRN;Rm?W{L~F1+LjVZX>52L99TMl7a}Epj9b4qS%&@NPv^ zJXoryud^YR(#`%k^zd*d$pe-Bkk zCP*LrO+okH7FjNCqbLnRzT__8=stghV4Zc;-Hd)Di+PSNGwWq~kv>MC(0hWMaf{fJ zD_w_r?dy+_->3Yo_^)fNZtFhWYj?p3Qb$unm-&_)Y&=@+=%PG-`qF^{4~Tn(`yzE- z&zza%i(Lrm>DYh2e~V(6CMUlvOUKBE8|YjYI+9QCPVVU*JFNDv0KmpJ9bK4hIKZou zDv<12514qS!kF5x690JRW~;&eNVhD@rbJPF>bys7fHnsLfefn(t4@bozz9!+cctQA z>EnY^V8GJy%i_+2xS9?V7t=wXb0{z@rh`96wP`IK`GjM4P1aKJ310njVHVz=qbeen zU(bJ@d24U3Qci#%VpaS353283lqdtXA74yX?UF{05Pl@!nV%KV|yi?!UU1FMFaoV#M^lt9duHAD3{6Ye~Vgt^m1*=b-3(QV0 zO(k3qTNt#_H-L|dii!_54R%UObwq6&ifyfs5}?-+E|P5uw+xoSvV{Iyhyl?#^i)#H zae)7EjR+8;4u*#EF;P*lg~zbT(KcbhaymdT2qKP&DTk2dMgE(V8Mg)Ztkcsiw=s*8 zx=<9$tJ7-IDpsZ{<6O@;pFtB_wVC2tBh4=v&_T=faFw*m9A9MM(I}2f3kJ)+bNE4I zkRzg#iYv-5l{IcIRfZftZR>NgAy7GUgBjs2W?#*3DmvVzJmRzd_9)!b`LApi#Dri;Z$K zeTIzkW}C(}`aQj+%Aj^foVK%Jw075Rp~Fgsuy+(}imMLtL}D1;VjRvHM!*k0{D5IN z$6^Qk@C4O2J4I-PcawM3c5j47=eWwEQ`tIht!O!UdtZr9eTULLkD0uCGKZ(9kOBMc zcN`jFv%db0yE#|<`lqh9zWu5DEh27UH|{IgE|bUf#yW*@$RzP@E4^`uh?`i~U1Zmq z+^1a|6h`44@qQ)k^1%0xJi#KlUrcD^DSZCvug{R~I?Ua<_GD&Au8%t8{rYb^Z(Zkq zNkSRhr(u8BfoA@5q-lQ$>C17?AT&-iFkv6_I_B=|bKdRz@$>tRD;tkgIu;x{hV70% z4!&p!zR4AzFKo<5@Uyc~!1rNqu}7%P8s20lMOtM%z`B79i$P6!X~^3?TeHrTN1=@T zGB>9QRA*G42Z*uqmS_AWne!aEe1If-woFdgc}bFOJ%`r9&^^EFDWoXO!{nvCCd~awa~jq`sich0bImlJ)_(r zJt8y1GQxE)p`QU+fhg=P_(fozM$EFrq~gTF!m&?)Y?`K^{UA{xHEOB?b?%15`kJvf z=;S}j1uU(gj!kY%Y^WQ1mA?6+43nxUvR<~ii#2oL%YY)$yn{A#?9%~?#E|a=n04j} z@8f9tm>5n9jj76nw%EtfoqS=sm}RfW%eIQWCke9z`reVp^cy1_=<=pd2R3~=un8U` zk*#L+bT!JHwIYnV^^OnekH+QlnS^QGHZhxsdRwhkf*gT+DePg;)p4zHV$tEE9eCmn zc8u;&Y+&8u{T_Pk_yhV4ARVZD&mQ0re6ovu;w;clY}hB90n2WYCgM4VPz^tXWV*ZJ z!zNmN>@h$X_+j$)n*ZBgGq8OHM*_@Pg+!_V-`MleFiYltV@osj!kh4&_~;sK-qVN8 zGMob(@OKeM3i2WgyQ)BkE{29i|WeX|IJ2cCif&JtGVVX7h7UX>>7J-hz$f06#?l* zdhfl9bcPwq(0d1I(nLVP-eOGe-E4ZYXYh=>zvtp+zx)5ce5sei^tt7n&*ypG4-~aU z207Lj@`c0;p+qR~P@hq`v5f)3hu^(VpT9w$Gj2!ubPnv%N1nVWU!NT+NkKIgiKTkO zvT~vq6LK!Y4<)9ofV9xcv(@Jc(DsS(=dx3k=4HdpeH{%0wv{dV z1mSp+>hy?dei*{>!ld}~x&g&6=swJr+ojs1o}SCdA!I?N+MKmXwNsFZRoa96zM9ZG zbHA0nuWtBVB3T9CdOxvVTrR`JMC4|1DD3~Io*#;OJ~2f^o8eI;ARa{mVwbrN30Fa- z(@vA)qTvjh@%0ALyp9#ql)02oN|Q8L%hN~QKg1V z6K!B59+hPg_O}~!l};F>9}hfnJVhT^=>E=DUBx2u*?aV@$?@SQZszno3*8L%)*U&S z*fU|o$F{p&_UMLJqu#c`MD3)Y_lcETQFLXHDx$NYqouvQ)JAnW$J%l=3@)?0Ij2-> zhS{7o1i|}&>RQMS?xP36v<@_&fy|TG6n5)_GM-@xQ{|c9LB!B{P{S|zS?xnh#JhGCmx)>Pc7~d zr+&}jz{?66_8~Iq4vMp~p?of}EHy7XU)|Zz(qIO$}=w%RzI+7~4ZP9blW-F81SP*qn%Ob{N!5 z_3!7<)rvnr;W|(de0}Z%8Szzzes%GiuW$aWU_%e+sQlXUFV=i`QbqjKlho=-OSo5H zsALJxcg+qb0iOO|p+RAY%L6$nsvx@}n@%sVKT7`3Xj$^T>T|_Kan_%ZTE}thb#db+ zsYEYM`;0RcXP{FM^5NXQ`ZvW*Fw2JmI3B5vE(*+z7%3mA9jaA_se|)^NT|@zTHjOE zD@h@A&mLW(?{m`4CYpqaZz(z3@DMKo(4mAZtoVnt@ipXA+NIh8q^1Vxg#@N&c%!fi z;dy99YDH>s8rT(5jBh7)@6AtRd_CE;qwJOAguV8N|9sgx+2`~PY3637&7@Xr^*D)S zGkn?eR+|-HF~}VBB(wB0MzG63#`C&NeODW@ZYUcM?H!M1;(lze3} zOwgOewTNrXIgfKBp)evlzNi%S$J!!*4V0k`^+@RqAjz4P^XN4BrOG?4eQhp%!WrKa z?$*diKHHSq++ITGMd$dGz-5rIIr>y&nrk{qEftp!qb6K6sXRtlMm=a0n$m{mqJL;; z(HZ;(;b@>kcxQ$xuC=A9C7y+{xC6!FbgQ{aps69!ztc4txCH@U7YKx#@;UTsH0aep zD*P2!GOt9LRa7^JfCLO_a89A7yhi;npIWcto(>iM|A#7|m@X`-tW$rgrtx?M=PJ^x z((s}*)is507r+82S%ubr%OPM+(lMuHy3JDuWqSwBIa}9~TB_HRR+Cp(H%`*J@dxal zSI41V9jpp(J2QHwW3~lJFP?|q|1`O7zRr=ShFGg=LUN?K9OSqAgRDa=!_R~!Dnr#S znUSTcMx2}1qsX{^C$l<;@80k(_yZ?yvJ*&13FH2$b~bmjLsFeffL~y;GDJn#266dm zj{FayecuqJnAYr8(Ea z-ro1g+{O=DeysgSK_nSoPfWF_IijU{P>h=x~eR*L`&ScsGKa z8kz4El9QC1keRF)8qNRs%A8xhY?a(v9p4IU#_IRD(@Azo$QsZd;DbLrMrT?4bl6`Q ze0_)srJEH*nV^czOjL}DQ-9|==KlA`QI$9|`hNySCQLb13~s=-YTfv&D~)AzBSoLj z)(kkKDY#(e2`R}DO~LiP)w2uo3Z>nb9v#scqsp!I5?4J2_8^isVgc9W%wXzm8n9n} z{{&B4bk7i#>;Hb9t^s~QNx4KN1hef8=cIQaJWy?w-%G7^-z;WcGgFc`-kz;6!eRA6@?sdyAWg(|r+(;2R%XG`T zDMcyuX=SJMm+*nfIj!?BoYkH6JN;Cj4WIf}7Q4sGZY$Ba<_301Q809hLg#ikCfjQ+$?cw5v(G&M(&DL4A6K|zDF(i8QAVKJ6)2{ z5MB^hQ&H7W(TrX6z%_b6&fcK!@Fh;ACvrUci-m-SAW~6JIaKbmCM);Lk`kh9^uDKu zd7^F7-sSK7Ot&w-`}3bS7yPvE4YvI!!#7AZ(&jPaR$XQ1WSNzjRT)(ZT6|qbsvkPm zNYFo4if|m+F*f}T_WZK_DpGf?^?IuURxsoxM(aM{9Dr#e=r2Y#m_-SBQVIfc6vn9k zDC?2MRYcWCS6D_0@V1r9NkdI5GAL-}6&5AS)8rK@H9O0MSbx&!T;_3cNbqlU=(6sf z=mF29@f>nJ5KbhaXNKg6y0qXE+JeSN;~YA|A|_%uO>J_S99b@;S#gzot(k;B6b6^t(l1lKYq2t&4pHKq%a9aK$at zB9uN25Y-Bxdhm3f?5=LUd{b56r#NypSa58GIbE@x(D$i<{MA&)gxI+WiIW6nH)#$* z&dbaE%Y&;#eu#5E@7~{94nfQseTawQFxTBhv0vPbqEUyiD~P=wjzH$@sNCT6sG;B+RBMQjp(+BYnO5K#w^k$%KSO2C0kZ*59LUAxnwyP zcO^<3cFfgvoC#oe;#vbPR!W{jG4M@J^LEiS3#6DbJN6C#0kzvIr?aOryLYLbEJHg5 zg}yIj?3JnPi(Y9%z(yZ7bZHIvqdml&97x0s~uYsd|gS_q; zmIS4ixWScspx;LZ%5E2p8W*Av7`!#aT*1suaU$rKkpZU>vudZ2A;G83w8KI$tuhv*)e(=jvT7B72^dqgg!U(OoMR%~S^ zN3fo?+P8bpA?HF+P%oVrczZCrKcX;y$iB0FB;eAFFK^MA*U7Nn#k7k09J(wzJES05 z>ai!qBFc^o>jJKedzau+>ye%tLPnVKe>+C!Gh6Yh++~@ynSgK^DX9yLt41>POrE>= z?cl)hz;J(8U)O~$yLWbdy5YweutEoL8r?GPNjpcbXuqVpb#KapzO|#TIQ`}bV4k#U z1=+@C6jSbqO5X-QI51*iH9ZI2CU93z8;rx>wUj?!25liPpDv)E!OTyZ%Nn*O1I3ectx^5kK^b^j>- z4qrMsJVN#LA93Vi^$kT|9AApe8b)yR3&92)#rM|3KF)sP z$$N6`8XC;|m0H#~7M`&e>Lc5OYQSaw3&DdBIuF2(u9Kfsf^M#SOR@h0L`>c+>7+}t z=LKhbfvtnmb21!Q;OmIoMfm(#(NoAK0*PA5pZ69#xrhR&0ewO4!^ERNeQ(Go6F*Jl z^TAe*`#o%j{YCN$r(1}UufEjF{+raxChX3{RQ~7Xi)Em6yYkF+GhM{iBTEo19Q_Zk zZ~5AAHCy)efz?tANB^G(u)}b_=N+W;5WBr|KORw^F1p4RK^Z?@ zexqiv-fU2?aogcaKxuBEL~2%ft0L5jC1;bu{Pm_QBrWpzk=yHPj*hnoo|g?jF@~;P zuanN?J1x2lG^dB^h0tEx+jawr=|}Q3C1{2mx@iAr5S`Xm)>2kqu9z-aGw)wGr-E-y zoeOCbjiNK<(|sV~f7q9X(K@vxc%sMXo6;z3oZ{LRE=YYQGg$HMNV>XdUZXl6TK^dDOkUclv$khLVM&aW^!rKiXXEsyr&p(Iax~(G zk2&0@uCS1;tzY(wJpf7rnZxPV6w}eTsRjvVRV&-|(eiH|3*2-V@A6egd+n~fq0T9* zr1}N01y8?_rmBUIL0Qr{2O*I&0hMvPEuY@67*7?~B!DQ+$9PA0hT{m@YXnh`pRKpO zzZ-dW;+Kg*-rv-Ei_6IyK0@n2_k(800iT`NpsnQ}9Q%4}_our;t!7K?n?^1TbI%vxC8iv5@>M8>eug4pKe| z(S5>I9;DUW?iEGxz__4cQK_0tdU{d9h|5&>^X_I}muR_%d?dwdnCI)}Fh zA<|z3K7-06b64`I;m0dE60HxYNpQJCi+iQ(8KJ?a!==;@2;W7RZ2>b3nT+!}`!r>Q z8mbGVKq2ZlIXc!gHO&#rvRr9db{P-ZbPt7v#dze1+dvJ^-_8Dw+j^dnr0Q?^8xzoQljal}P-_EsB>kiCnOGt~Wt-*eP(o&3-uUKOlD zyPx0dz@B$q6r_o&^2(3=sfPZ&_oF^QA`V|-&%d{LwCGCqgY>TyyJd+i#cvrApL6C) zopM8)+gdssdvUYlZ0TBvt@p0sa7mEBXfb66n{6Ga2-t-P~s!J9b3GIy}B75 zZbZ6=H?-Du*GkXf$lf$$i#9KZmeErgAyZo1-kF~%Y=9Lws5lX4y+4l zifH!Nr*=9kW`|Et}A_Ljrca0by?NeS_-{hBd4o96pctz@j~E= zTd;kocYdfMv0~3yua_R1=>@WBZmYejJgU6P%HA*i zuJ{KGGXwyVzOh1)YM28x8Ffry9U@I9PlCU^^M4|3^Y9xy|j0R`j~_Q$1L zxOK^qqU{ilEdVf?VG6;QnrgOZoE(wv9rkVzx&sjar=m}@0(u5sw~oCeu7{F|2Vr+B zwUW~q25!hFY*e@KHmasQV9!u%iE^UkkwYHM{ylsN&v9wJyt=ifr?SJWLI|~YKjLMl z*dVn|+}VrNT~7D2YMy?|Vsx`dv4Tf;<{`X~w;^zO%y!eqGUm^o#Vfea&dAdn(i-dM z{7jASGGn@HH`|4;VEccK52#tZ!qIOZ@|dcw7dYLH@w<39oeO(b>msK+p1?dB{$$Vi zKcqod`LXC}+5kCSqdUr*MorV&NKgGGOL|L2qbHfjYa}LeESSiI|DDFZDrZL85Pq}V zBEjhNskss+S>h|6{{{?}RT6{6PcjliCR;$)RQ}$Ay3kTLX5hmXMJQ6qtVQ>Jl`)g4 z(tnFs3{Te}xqBQAiUkiPZL1Bmt?yvt0egj~_lR)Ze&dNfjtXjIsM{{zRE|Z`>-t29 z9r5_YtyG-yh$}0=DW9U9}U_ z(Fv-zoozZuH%WZBg$(YLlBskpHe^(Tjn}Y25L=7uc5p!0)9ZFabwg8aI}+`dPQ1vY zn6&j4-AbLdUZ*d!s!KRtf#{!DCGQ~1*sPo zdG2H-d-yHTTT{P*MM$ojy@J2pN*}rt?Z$nQ7Z%luT={8G} za_tJFf1>u&D9G7XzR8)45kvmfJD}xkX4CoIi@^5SI_vk{uzeWPG(=*#$l|t#FNr*) zKpw8)lKGI8F5k-ep`kNF=C#FsM`S>_Ut~yRN=}ICOlBm3bT;A1+k8-RcKbY$s7j7A0SjVbb%pTu=>E)#K9xVDa<*_Cq)^S?*^H6Zf<>MpB{0Hi&i8g zC5l@ga>TJ2it{e#CWmTATWd>uTi=4PQcq-DKEIhw-LOX;TI`Y?R-(}q7ndq@v%uGu z8u1w>G(*PDqY+QgaP z&1uaFBU!3zs@qwtB|u&bsXiw3mJd}8RVx^GMV=HK=MxtIZ$PepS{U7%Mcs?29{4d4 zY!{!@0HF4)0W(cjYRYm2{D~MH@pXs6AaTsh%#hXvOp~KorA+866S(e>2&^n! z(n)C5gw;9B^P=>b-Bil6`40LdvQ(5!qb*%c z7$90bgS2PT1JQF)+L(BQCsB%AarZ(l@T~ywxg~E72jNm)buMz4W_d2a{a06(ri$&nVbdaR@Q? z5Ats34;NWp5*B*^Aby<7j8etTjms-OOJZ()3MP>TSfcj;%CqzJ4UYxyg~Zo|siW`F zX(e=HCKVO`VDIq|;t;l!b%3RA2r0~+e%fJs4^o(IFcX}ccm_H1EaD1{pc}W3;{ypm zg;ZQW#yKZ>Br8aQbAn6a?5}?tW+mo-ES5VaI45~xSX|vBrFoEK_|si8BMNfLv(P0t zHrXX`4ZvmY2M!Sw%Fet273OvsY#|T6%VKerD;K{P%b3-M5_0^=Byt>!<&Oq{99Ne? znV%`H{tm4WPqZ#`0zo_Osy~;9805UH!g{noGN1rKK)%02i_8v8i;#lc%G0XSOLGc~ z(do!85ZB5$z#88rvd3|15v9cjYqln*& ztLj0$?I)Cop!egt&LSsTlyBwEkCLn~apn6Qfm)6()ntWbMWjb|l?ZVi0ptFlHi+y0 z&GmYoA4Ju0vn=KFbKm_u=YaUiX-+o}hiPuUIO|_1VS-s|`mb1y?aKA0>QIe@IVH-1+IKyzPRZTl*V&gNq&1?yJ5Z%@TSeG zBgX33(vbW}#h#@kU#Vc<$n67zA^``ADfG#TC{fjdqcY7wez-gw;fmAQH9kbQh(o$@ zrp4f7-qndoDP##jO(F;CG}T4WMzV{t3NvA|P9Gt~A;rOY;mxf=l*Yd*pe(yIyF9Bx zK}xEN>xyfQ%Y`UUU)w-;#R5PVea{oNPrHg|re6Xh?~L`JI=CRH2&Jvk^c?lP{G2>> zRtcp27t?w|a{M6!1cUrdx?g@%7tEW*<#tFNEmwMpR9sVhB#S>0XBl%kL=&V5EjV*p zs0<<1TGIjMF+>e|n8C%#fBUHY00EXPvVO4iN

    i&bO}8eU5kNO@vI@)>;?3^|T40 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 rp&%Z55O?sctDbV_?RdNAC5I~S>D}!o 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 +%ZILaVNXHLug%~B($M1_^LN16&#w>!qkGi6 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 z

  2. - + - 8.   Dart 环境 + 8.   TypeScript 环境
  3. - + - 9.   Rust 环境 + 9.   Dart 环境 + + + +
  4. + +
  5. + + + 10.   Rust 环境 @@ -3779,18 +3788,27 @@
  6. - + - 8.   Dart 环境 + 8.   TypeScript 环境
  7. - + - 9.   Rust 环境 + 9.   Dart 环境 + + + +
  8. + +
  9. + + + 10.   Rust 环境 @@ -3884,16 +3902,21 @@
  10. -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

7.   JavaScript 环境

    -
  1. 下载并安装 node.js
  2. -
  3. 在 VS Code 的插件市场中搜索 javascript ,安装 JavaScript (ES6) code snippets 。
  4. +
  5. 下载并安装 Node.js
  6. (可选)在 VS Code 的插件市场中搜索 Prettier ,安装代码格式化工具。
-

8.   Dart 环境

+

8.   TypeScript 环境

+
    +
  1. 同 JavaScript 环境安装步骤。
  2. +
  3. 安装 TypeScript Execute (tsx)
  4. +
  5. 在 VS Code 的插件市场中搜索 typescript ,安装 Pretty TypeScript Errors
  6. +
+

9.   Dart 环境

  1. 下载并安装 Dart
  2. 在 VS Code 的插件市场中搜索 dart ,安装 Dart
-

9.   Rust 环境

+

10.   Rust 环境

  1. 下载并安装 Rust
  2. 在 VS Code 的插件市场中搜索 rust ,安装 rust-analyzer
  3. diff --git a/chapter_paperbook/index.html b/chapter_paperbook/index.html index a519968fa..510014340 100644 --- a/chapter_paperbook/index.html +++ b/chapter_paperbook/index.html @@ -3638,17 +3638,18 @@
    • 采用全彩印刷,能够原汁原味地发挥出本书“动画图解”的优势。
    • 考究纸张材质,既保证色彩高度还原,也保留纸质书特有的质感。
    • +
    • 纸质版比网页版的格式更加规范,例如图中的公式使用斜体。
    • 在不提升定价的前提下,附赠思维导图折页、书签。
    • 纸质书、网页版、PDF 版内容同步,随意切换阅读。

    Tip

    -

    由于纸质书和网页版的同步成本较大,因此可能会有一些细节上的不同,请您见谅!

    +

    由于纸质书和网页版的同步难度较大,因此可能会有一些细节上的不同,请您见谅!

    当然,纸质书也有一些值得大家入手前考虑的地方:

      -
    • 使用 Python 语言,可能不匹配你的主语言(也许可以趁此机会练习 Python)。
    • -
    • 全彩印刷虽然大幅提升了阅读体验,但价格会比黑白印刷高一些。
    • +
    • 使用 Python 语言,可能不匹配你的主语言(可以把 Python 看作伪代码,重在理解思路)。
    • +
    • 全彩印刷虽然大幅提升了图解和代码的阅读体验,但价格会比黑白印刷高一些。

    Tip

    diff --git a/chapter_tree/array_representation_of_tree/index.html b/chapter_tree/array_representation_of_tree/index.html index d6a5ee02a..aa28f15c2 100644 --- a/chapter_tree/array_representation_of_tree/index.html +++ b/chapter_tree/array_representation_of_tree/index.html @@ -4870,7 +4870,87 @@
    -
    array_binary_tree.rb
    [class]{ArrayBinaryTree}-[func]{}
    +
    array_binary_tree.rb
    ### 数组表示下的二叉树类 ###
    +class ArrayBinaryTree
    +  ### 构造方法 ###
    +  def initialize(arr)
    +    @tree = arr.to_a
    +  end
    +
    +  ### 列表容量 ###
    +  def size
    +    @tree.length
    +  end
    +
    +  ### 获取索引为 i 节点的值 ###
    +  def val(i)
    +    # 若索引越界,则返回 nil ,代表空位
    +    return if i < 0 || i >= size
    +
    +    @tree[i]
    +  end
    +
    +  ### 获取索引为 i 节点的左子节点的索引 ###
    +  def left(i)
    +    2 * i + 1
    +  end
    +
    +  ### 获取索引为 i 节点的右子节点的索引 ###
    +  def right(i)
    +    2 * i + 2
    +  end
    +
    +  ### 获取索引为 i 节点的父节点的索引 ###
    +  def parent(i)
    +    (i - 1) / 2
    +  end
    +
    +  ### 层序遍历 ###
    +  def level_order
    +    @res = []
    +
    +    # 直接遍历数组
    +    for i in 0...size
    +      @res << val(i) unless val(i).nil?
    +    end
    +
    +    @res
    +  end
    +
    +  ### 深度优先遍历 ###
    +  def dfs(i, order)
    +    return if val(i).nil?
    +    # 前序遍历
    +    @res << val(i) if order == :pre
    +    dfs(left(i), order)
    +    # 中序遍历
    +    @res << val(i) if order == :in
    +    dfs(right(i), order)
    +    # 后序遍历
    +    @res << val(i) if order == :post
    +  end
    +
    +  ### 前序遍历 ###
    +  def pre_order
    +    @res = []
    +    dfs(0, :pre)
    +    @res
    +  end
    +
    +  ### 中序遍历 ###
    +  def in_order
    +    @res = []
    +    dfs(0, :in)
    +    @res
    +  end
    +
    +  ### 后序遍历 ###
    +  def post_order
    +    @res = []
    +    dfs(0, :post)
    +    @res
    +  end
    +end
     
    diff --git a/chapter_tree/avl_tree/index.html b/chapter_tree/avl_tree/index.html index a2c3bf54c..bab89f654 100644 --- a/chapter_tree/avl_tree/index.html +++ b/chapter_tree/avl_tree/index.html @@ -4308,9 +4308,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{height}
    -
    -[class]{AVLTree}-[func]{update_height}
    +
    avl_tree.rb
    ### 获取节点高度 ###
    +def height(node)
    +  # 空节点高度为 -1 ,叶节点高度为 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +### 更新节点高度 ###
    +def update_height(node)
    +  # 节点高度等于最高子树高度 + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
     
    @@ -4465,7 +4475,14 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{balance_factor}
    +
    avl_tree.rb
    ### 获取平衡因子 ###
    +def balance_factor(node)
    +  # 空节点平衡因子为 0
    +  return 0 if node.nil?
    +
    +  # 节点平衡因子 = 左子树高度 - 右子树高度
    +  height(node.left) - height(node.right)
    +end
     
    @@ -4712,7 +4729,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{right_rotate}
    +
    avl_tree.rb
    ### 右旋操作 ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # 以 child 为原点,将 node 向右旋转
    +  child.right = node
    +  node.left = grand_child
    +  # 更新节点高度
    +  update_height(node)
    +  update_height(child)
    +  # 返回旋转后子树的根节点
    +  child
    +end
     
    @@ -4943,7 +4972,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{left_rotate}
    +
    avl_tree.rb
    ### 左旋操作 ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # 以 child 为原点,将 node 向左旋转
    +  child.left = node
    +  node.right = grand_child
    +  # 更新节点高度
    +  update_height(node)
    +  update_height(child)
    +  # 返回旋转后子树的根节点
    +  child
    +end
     
    @@ -5404,7 +5445,34 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{rotate}
    +
    avl_tree.rb
    ### 执行旋转操作,使该子树重新恢复平衡 ###
    +def rotate(node)
    +  # 获取节点 node 的平衡因子
    +  balance_factor = balance_factor(node)
    +  # 左遍树
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # 右旋
    +      return right_rotate(node)
    +    else
    +      # 先左旋后右旋
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # 右遍树
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # 左旋
    +      return left_rotate(node)
    +    else
    +      # 先右旋后左旋
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # 平衡树,无须旋转,直接返回
    +  node
    +end
     
    @@ -5768,9 +5836,28 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{insert}
    -
    -[class]{AVLTree}-[func]{insert_helper}
    +
    avl_tree.rb
    ### 插入节点 ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +### 递归插入节点(辅助方法)###
    +def insert_helper(node, val)
    +  return TreeNode.new(val) if node.nil?
    +  # 1. 查找插入位置并插入节点
    +  if val < node.val
    +    node.left = insert_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = insert_helper(node.right, val)
    +  else
    +    # 重复节点不插入,直接返回
    +    return node
    +  end
    +  # 更新节点高度
    +  update_height(node)
    +  # 2. 执行旋转操作,使该子树重新恢复平衡
    +  rotate(node)
    +end
     
    @@ -6343,9 +6430,41 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{remove}
    -
    -[class]{AVLTree}-[func]{remove_helper}
    +
    avl_tree.rb
    ### 删除节点 ###
    +def remove(val)
    +  @root = remove_helper(@root, val)
    +end
    +
    +### 递归删除节点(辅助方法)###
    +def remove_helper(node, val)
    +  return if node.nil?
    +  # 1. 查找节点并删除
    +  if val < node.val
    +    node.left = remove_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = remove_helper(node.right, val)
    +  else
    +    if node.left.nil? || node.right.nil?
    +      child = node.left || node.right
    +      # 子节点数量 = 0 ,直接删除 node 并返回
    +      return if child.nil?
    +      # 子节点数量 = 1 ,直接删除 node
    +      node = child
    +    else
    +      # 子节点数量 = 2 ,则将中序遍历的下个节点删除,并用该节点替换当前节点
    +      temp = node.right
    +      while !temp.left.nil?
    +        temp = temp.left
    +      end
    +      node.right = remove_helper(node.right, temp.val)
    +      node.val = temp.val
    +    end
    +  end
    +  # 更新节点高度
    +  update_height(node)
    +  # 2. 执行旋转操作,使该子树重新恢复平衡
    +  rotate(node)
    +end
     
    diff --git a/chapter_tree/binary_search_tree/index.html b/chapter_tree/binary_search_tree/index.html index d757340a9..4a7737261 100644 --- a/chapter_tree/binary_search_tree/index.html +++ b/chapter_tree/binary_search_tree/index.html @@ -4053,7 +4053,26 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{search}
    +
    binary_search_tree.rb
    ### 查找节点 ###
    +def search(num)
    +  cur = @root
    +
    +  # 循环查找,越过叶节点后跳出
    +  while !cur.nil?
    +    # 目标节点在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 目标节点在 cur 的左子树中
    +    elsif cur.val > num
    +      cur = cur.left
    +    # 找到目标节点,跳出循环
    +    else
    +      break
    +    end
    +  end
    +
    +  cur
    +end
     
    @@ -4484,7 +4503,38 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{insert}
    +
    binary_search_tree.rb
    ### 插入节点 ###
    +def insert(num)
    +  # 若树为空,则初始化根节点
    +  if @root.nil?
    +    @root = TreeNode.new(num)
    +    return
    +  end
    +
    +  # 循环查找,越过叶节点后跳出
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # 找到重复节点,直接返回
    +    return if cur.val == num
    +
    +    pre = cur
    +    # 插入位置在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 插入位置在 cur 的左子树中
    +    else
    +      cur = cur.left
    +    end
    +  end
    +
    +  # 插入节点
    +  node = TreeNode.new(num)
    +  if pre.val < num
    +    pre.right = node
    +  else
    +    pre.left = node
    +  end
    +end
     
    @@ -5227,7 +5277,57 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{remove}
    +
    binary_search_tree.rb
    ### 删除节点 ###
    +def remove(num)
    +  # 若树为空,直接提前返回
    +  return if @root.nil?
    +
    +  # 循环查找,越过叶节点后跳出
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # 找到待删除节点,跳出循环
    +    break if cur.val == num
    +
    +    pre = cur
    +    # 待删除节点在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 待删除节点在 cur 的左子树中
    +    else
    +      cur = cur.left
    +    end
    +  end
    +  # 若无待删除节点,则直接返回
    +  return if cur.nil?
    +
    +  # 子节点数量 = 0 or 1
    +  if cur.left.nil? || cur.right.nil?
    +    # 当子节点数量 = 0 / 1 时, child = null / 该子节点
    +    child = cur.left || cur.right
    +    # 删除节点 cur
    +    if cur != @root
    +      if pre.left == cur
    +        pre.left = child
    +      else
    +        pre.right = child
    +      end
    +    else
    +      # 若删除节点为根节点,则重新指定根节点
    +      @root = child
    +    end
    +  # 子节点数量 = 2
    +  else
    +    # 获取中序遍历中 cur 的下一个节点
    +    tmp = cur.right
    +    while !tmp.left.nil?
    +      tmp = tmp.left
    +    end
    +    # 递归删除节点 tmp
    +    remove(tmp.val)
    +    # 用 tmp 覆盖 cur
    +    cur.val = tmp.val
    +  end
    +end
     
    diff --git a/chapter_tree/binary_tree_traversal/index.html b/chapter_tree/binary_tree_traversal/index.html index 5da6b1791..ba155cacf 100644 --- a/chapter_tree/binary_tree_traversal/index.html +++ b/chapter_tree/binary_tree_traversal/index.html @@ -4042,7 +4042,20 @@
    -
    binary_tree_bfs.rb
    [class]{}-[func]{level_order}
    +
    binary_tree_bfs.rb
    ### 层序遍历 ###
    +def level_order(root)
    +  # 初始化队列,加入根节点
    +  queue = [root]
    +  # 初始化一个列表,用于保存遍历序列
    +  res = []
    +  while !queue.empty?
    +    node = queue.shift # 队列出队
    +    res << node.val # 保存节点值
    +    queue << node.left unless node.left.nil? # 左子节点入队
    +    queue << node.right unless node.right.nil? # 右子节点入队
    +  end
    +  res
    +end
     
    @@ -4487,9 +4500,25 @@
    binary_tree_dfs.rb
    [class]{}-[func]{pre_order}
     
    -[class]{}-[func]{in_order}
    -
    -[class]{}-[func]{post_order}
    +### 中序遍历 ###
    +def in_order(root)
    +  return if root.nil?
    +
    +  # 访问优先级:左子树 -> 根节点 -> 右子树
    +  in_order(root.left)
    +  $res << root.val
    +  in_order(root.right)
    +end
    +
    +### 后序遍历 ###
    +def post_order(root)
    +  return if root.nil?
    +
    +  # 访问优先级:左子树 -> 右子树 -> 根节点
    +  post_order(root.left)
    +  post_order(root.right)
    +  $res << root.val
    +end
     
    diff --git a/en/chapter_tree/array_representation_of_tree/index.html b/en/chapter_tree/array_representation_of_tree/index.html index 93a7a947d..86188960d 100644 --- a/en/chapter_tree/array_representation_of_tree/index.html +++ b/en/chapter_tree/array_representation_of_tree/index.html @@ -3340,7 +3340,87 @@
    -
    array_binary_tree.rb
    [class]{ArrayBinaryTree}-[func]{}
    +
    array_binary_tree.rb
    ### 数组表示下的二叉树类 ###
    +class ArrayBinaryTree
    +  ### 构造方法 ###
    +  def initialize(arr)
    +    @tree = arr.to_a
    +  end
    +
    +  ### 列表容量 ###
    +  def size
    +    @tree.length
    +  end
    +
    +  ### 获取索引为 i 节点的值 ###
    +  def val(i)
    +    # 若索引越界,则返回 nil ,代表空位
    +    return if i < 0 || i >= size
    +
    +    @tree[i]
    +  end
    +
    +  ### 获取索引为 i 节点的左子节点的索引 ###
    +  def left(i)
    +    2 * i + 1
    +  end
    +
    +  ### 获取索引为 i 节点的右子节点的索引 ###
    +  def right(i)
    +    2 * i + 2
    +  end
    +
    +  ### 获取索引为 i 节点的父节点的索引 ###
    +  def parent(i)
    +    (i - 1) / 2
    +  end
    +
    +  ### 层序遍历 ###
    +  def level_order
    +    @res = []
    +
    +    # 直接遍历数组
    +    for i in 0...size
    +      @res << val(i) unless val(i).nil?
    +    end
    +
    +    @res
    +  end
    +
    +  ### 深度优先遍历 ###
    +  def dfs(i, order)
    +    return if val(i).nil?
    +    # 前序遍历
    +    @res << val(i) if order == :pre
    +    dfs(left(i), order)
    +    # 中序遍历
    +    @res << val(i) if order == :in
    +    dfs(right(i), order)
    +    # 后序遍历
    +    @res << val(i) if order == :post
    +  end
    +
    +  ### 前序遍历 ###
    +  def pre_order
    +    @res = []
    +    dfs(0, :pre)
    +    @res
    +  end
    +
    +  ### 中序遍历 ###
    +  def in_order
    +    @res = []
    +    dfs(0, :in)
    +    @res
    +  end
    +
    +  ### 后序遍历 ###
    +  def post_order
    +    @res = []
    +    dfs(0, :post)
    +    @res
    +  end
    +end
     
    diff --git a/en/chapter_tree/avl_tree/index.html b/en/chapter_tree/avl_tree/index.html index 27f251c45..f1051c8e2 100644 --- a/en/chapter_tree/avl_tree/index.html +++ b/en/chapter_tree/avl_tree/index.html @@ -2778,9 +2778,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{height}
    -
    -[class]{AVLTree}-[func]{update_height}
    +
    avl_tree.rb
    ### 获取节点高度 ###
    +def height(node)
    +  # 空节点高度为 -1 ,叶节点高度为 0
    +  return node.height unless node.nil?
    +
    +  -1
    +end
    +
    +### 更新节点高度 ###
    +def update_height(node)
    +  # 节点高度等于最高子树高度 + 1
    +  node.height = [height(node.left), height(node.right)].max + 1
    +end
     
    @@ -2935,7 +2945,14 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{balance_factor}
    +
    avl_tree.rb
    ### 获取平衡因子 ###
    +def balance_factor(node)
    +  # 空节点平衡因子为 0
    +  return 0 if node.nil?
    +
    +  # 节点平衡因子 = 左子树高度 - 右子树高度
    +  height(node.left) - height(node.right)
    +end
     
    @@ -3182,7 +3199,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{right_rotate}
    +
    avl_tree.rb
    ### 右旋操作 ###
    +def right_rotate(node)
    +  child = node.left
    +  grand_child = child.right
    +  # 以 child 为原点,将 node 向右旋转
    +  child.right = node
    +  node.left = grand_child
    +  # 更新节点高度
    +  update_height(node)
    +  update_height(child)
    +  # 返回旋转后子树的根节点
    +  child
    +end
     
    @@ -3413,7 +3442,19 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{left_rotate}
    +
    avl_tree.rb
    ### 左旋操作 ###
    +def left_rotate(node)
    +  child = node.right
    +  grand_child = child.left
    +  # 以 child 为原点,将 node 向左旋转
    +  child.left = node
    +  node.right = grand_child
    +  # 更新节点高度
    +  update_height(node)
    +  update_height(child)
    +  # 返回旋转后子树的根节点
    +  child
    +end
     
    @@ -3874,7 +3915,34 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{rotate}
    +
    avl_tree.rb
    ### 执行旋转操作,使该子树重新恢复平衡 ###
    +def rotate(node)
    +  # 获取节点 node 的平衡因子
    +  balance_factor = balance_factor(node)
    +  # 左遍树
    +  if balance_factor > 1
    +    if balance_factor(node.left) >= 0
    +      # 右旋
    +      return right_rotate(node)
    +    else
    +      # 先左旋后右旋
    +      node.left = left_rotate(node.left)
    +      return right_rotate(node)
    +    end
    +  # 右遍树
    +  elsif balance_factor < -1
    +    if balance_factor(node.right) <= 0
    +      # 左旋
    +      return left_rotate(node)
    +    else
    +      # 先右旋后左旋
    +      node.right = right_rotate(node.right)
    +      return left_rotate(node)
    +    end
    +  end
    +  # 平衡树,无须旋转,直接返回
    +  node
    +end
     
    @@ -4238,9 +4306,28 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{insert}
    -
    -[class]{AVLTree}-[func]{insert_helper}
    +
    avl_tree.rb
    ### 插入节点 ###
    +def insert(val)
    +  @root = insert_helper(@root, val)
    +end
    +
    +### 递归插入节点(辅助方法)###
    +def insert_helper(node, val)
    +  return TreeNode.new(val) if node.nil?
    +  # 1. 查找插入位置并插入节点
    +  if val < node.val
    +    node.left = insert_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = insert_helper(node.right, val)
    +  else
    +    # 重复节点不插入,直接返回
    +    return node
    +  end
    +  # 更新节点高度
    +  update_height(node)
    +  # 2. 执行旋转操作,使该子树重新恢复平衡
    +  rotate(node)
    +end
     
    @@ -4813,9 +4900,41 @@
    -
    avl_tree.rb
    [class]{AVLTree}-[func]{remove}
    -
    -[class]{AVLTree}-[func]{remove_helper}
    +
    avl_tree.rb
    ### 删除节点 ###
    +def remove(val)
    +  @root = remove_helper(@root, val)
    +end
    +
    +### 递归删除节点(辅助方法)###
    +def remove_helper(node, val)
    +  return if node.nil?
    +  # 1. 查找节点并删除
    +  if val < node.val
    +    node.left = remove_helper(node.left, val)
    +  elsif val > node.val
    +    node.right = remove_helper(node.right, val)
    +  else
    +    if node.left.nil? || node.right.nil?
    +      child = node.left || node.right
    +      # 子节点数量 = 0 ,直接删除 node 并返回
    +      return if child.nil?
    +      # 子节点数量 = 1 ,直接删除 node
    +      node = child
    +    else
    +      # 子节点数量 = 2 ,则将中序遍历的下个节点删除,并用该节点替换当前节点
    +      temp = node.right
    +      while !temp.left.nil?
    +        temp = temp.left
    +      end
    +      node.right = remove_helper(node.right, temp.val)
    +      node.val = temp.val
    +    end
    +  end
    +  # 更新节点高度
    +  update_height(node)
    +  # 2. 执行旋转操作,使该子树重新恢复平衡
    +  rotate(node)
    +end
     
    diff --git a/en/chapter_tree/binary_search_tree/index.html b/en/chapter_tree/binary_search_tree/index.html index 3834b419f..91b2ae39d 100644 --- a/en/chapter_tree/binary_search_tree/index.html +++ b/en/chapter_tree/binary_search_tree/index.html @@ -2523,7 +2523,26 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{search}
    +
    binary_search_tree.rb
    ### 查找节点 ###
    +def search(num)
    +  cur = @root
    +
    +  # 循环查找,越过叶节点后跳出
    +  while !cur.nil?
    +    # 目标节点在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 目标节点在 cur 的左子树中
    +    elsif cur.val > num
    +      cur = cur.left
    +    # 找到目标节点,跳出循环
    +    else
    +      break
    +    end
    +  end
    +
    +  cur
    +end
     
    @@ -2954,7 +2973,38 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{insert}
    +
    binary_search_tree.rb
    ### 插入节点 ###
    +def insert(num)
    +  # 若树为空,则初始化根节点
    +  if @root.nil?
    +    @root = TreeNode.new(num)
    +    return
    +  end
    +
    +  # 循环查找,越过叶节点后跳出
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # 找到重复节点,直接返回
    +    return if cur.val == num
    +
    +    pre = cur
    +    # 插入位置在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 插入位置在 cur 的左子树中
    +    else
    +      cur = cur.left
    +    end
    +  end
    +
    +  # 插入节点
    +  node = TreeNode.new(num)
    +  if pre.val < num
    +    pre.right = node
    +  else
    +    pre.left = node
    +  end
    +end
     
    @@ -3697,7 +3747,57 @@
    -
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{remove}
    +
    binary_search_tree.rb
    ### 删除节点 ###
    +def remove(num)
    +  # 若树为空,直接提前返回
    +  return if @root.nil?
    +
    +  # 循环查找,越过叶节点后跳出
    +  cur, pre = @root, nil
    +  while !cur.nil?
    +    # 找到待删除节点,跳出循环
    +    break if cur.val == num
    +
    +    pre = cur
    +    # 待删除节点在 cur 的右子树中
    +    if cur.val < num
    +      cur = cur.right
    +    # 待删除节点在 cur 的左子树中
    +    else
    +      cur = cur.left
    +    end
    +  end
    +  # 若无待删除节点,则直接返回
    +  return if cur.nil?
    +
    +  # 子节点数量 = 0 or 1
    +  if cur.left.nil? || cur.right.nil?
    +    # 当子节点数量 = 0 / 1 时, child = null / 该子节点
    +    child = cur.left || cur.right
    +    # 删除节点 cur
    +    if cur != @root
    +      if pre.left == cur
    +        pre.left = child
    +      else
    +        pre.right = child
    +      end
    +    else
    +      # 若删除节点为根节点,则重新指定根节点
    +      @root = child
    +    end
    +  # 子节点数量 = 2
    +  else
    +    # 获取中序遍历中 cur 的下一个节点
    +    tmp = cur.right
    +    while !tmp.left.nil?
    +      tmp = tmp.left
    +    end
    +    # 递归删除节点 tmp
    +    remove(tmp.val)
    +    # 用 tmp 覆盖 cur
    +    cur.val = tmp.val
    +  end
    +end
     
    diff --git a/en/chapter_tree/binary_tree_traversal/index.html b/en/chapter_tree/binary_tree_traversal/index.html index 4208cc542..44555295e 100644 --- a/en/chapter_tree/binary_tree_traversal/index.html +++ b/en/chapter_tree/binary_tree_traversal/index.html @@ -2512,7 +2512,20 @@
    -
    binary_tree_bfs.rb
    [class]{}-[func]{level_order}
    +
    binary_tree_bfs.rb
    ### 层序遍历 ###
    +def level_order(root)
    +  # 初始化队列,加入根节点
    +  queue = [root]
    +  # 初始化一个列表,用于保存遍历序列
    +  res = []
    +  while !queue.empty?
    +    node = queue.shift # 队列出队
    +    res << node.val # 保存节点值
    +    queue << node.left unless node.left.nil? # 左子节点入队
    +    queue << node.right unless node.right.nil? # 右子节点入队
    +  end
    +  res
    +end
     
    @@ -2957,9 +2970,25 @@
    binary_tree_dfs.rb
    [class]{}-[func]{pre_order}
     
    -[class]{}-[func]{in_order}
    -
    -[class]{}-[func]{post_order}
    +### 中序遍历 ###
    +def in_order(root)
    +  return if root.nil?
    +
    +  # 访问优先级:左子树 -> 根节点 -> 右子树
    +  in_order(root.left)
    +  $res << root.val
    +  in_order(root.right)
    +end
    +
    +### 后序遍历 ###
    +def post_order(root)
    +  return if root.nil?
    +
    +  # 访问优先级:左子树 -> 右子树 -> 根节点
    +  post_order(root.left)
    +  post_order(root.right)
    +  $res << root.val
    +end
     
    diff --git a/en/search/search_index.json b/en/search/search_index.json index 4cad472de..4c74e14ae 100644 --- a/en/search/search_index.json +++ b/en/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"chapter_array_and_linkedlist/","title":"Chapter 4. \u00a0 Arrays and linked lists","text":"

    Abstract

    The world of data structures resembles a sturdy brick wall.

    In arrays, envision bricks snugly aligned, each resting seamlessly beside the next, creating a unified formation. Meanwhile, in linked lists, these bricks disperse freely, embraced by vines gracefully knitting connections between them.

    "},{"location":"chapter_array_and_linkedlist/#chapter-contents","title":"Chapter contents","text":"
    • 4.1 \u00a0 Array
    • 4.2 \u00a0 Linked list
    • 4.3 \u00a0 List
    • 4.4 \u00a0 Memory and cache
    • 4.5 \u00a0 Summary
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 Array","text":"

    An \"array\" is a linear data structure that operates as a lineup of similar items, stored together in a computer's memory in contiguous spaces. It's like a sequence that maintains organized storage. Each item in this lineup has its unique 'spot' known as an \"index\". Please refer to the Figure 4-1 to observe how arrays work and grasp these key terms.

    Figure 4-1 \u00a0 Array definition and storage method

    "},{"location":"chapter_array_and_linkedlist/array/#411-common-operations-on-arrays","title":"4.1.1 \u00a0 Common operations on arrays","text":""},{"location":"chapter_array_and_linkedlist/array/#1-initializing-arrays","title":"1. \u00a0 Initializing arrays","text":"

    Arrays can be initialized in two ways depending on the needs: either without initial values or with specified initial values. When initial values are not specified, most programming languages will set the array elements to \\(0\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig array.py
    # Initialize array\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]\n
    array.cpp
    /* Initialize array */\n// Stored on stack\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// Stored on heap (manual memory release needed)\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* Initialize array */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* Initialize array */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* Initialize array */\nvar arr [5]int\n// In Go, specifying the length ([5]int) denotes an array, while not specifying it ([]int) denotes a slice.\n// Since Go's arrays are designed to have compile-time fixed length, only constants can be used to specify the length.\n// For convenience in implementing the extend() method, the Slice will be considered as an Array here.\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* Initialize array */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
    array.js
    /* Initialize array */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* Initialize array */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* Initialize array */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
    array.rs
    /* Initialize array */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* Initialize array */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    \n
    array.zig
    // Initialize array\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    "},{"location":"chapter_array_and_linkedlist/array/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

    Elements in an array are stored in contiguous memory spaces, making it simpler to compute each element's memory address. The formula shown in the Figure below aids in determining an element's memory address, utilizing the array's memory address (specifically, the first element's address) and the element's index. This computation streamlines direct access to the desired element.

    Figure 4-2 \u00a0 Memory address calculation for array elements

    As observed in the above illustration, array indexing conventionally begins at \\(0\\). While this might appear counterintuitive, considering counting usually starts at \\(1\\), within the address calculation formula, an index is essentially an offset from the memory address. For the first element's address, this offset is \\(0\\), validating its index as \\(0\\).

    Accessing elements in an array is highly efficient, allowing us to randomly access any element in \\(O(1)\\) time.

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#3-inserting-elements","title":"3. \u00a0 Inserting elements","text":"

    Array elements are tightly packed in memory, with no space available to accommodate additional data between them. Illustrated in Figure below, inserting an element in the middle of an array requires shifting all subsequent elements back by one position to create room for the new element.

    Figure 4-3 \u00a0 Array element insertion example

    It's important to note that due to the fixed length of an array, inserting an element will unavoidably result in the loss of the last element in the array. Solutions to address this issue will be explored in the \"List\" chapter.

    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 Vec<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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#4-deleting-elements","title":"4. \u00a0 Deleting elements","text":"

    Similarly, as depicted in the Figure 4-4 , to delete an element at index \\(i\\), all elements following index \\(i\\) must be moved forward by one position.

    Figure 4-4 \u00a0 Array element deletion example

    Please note that after deletion, the former last element becomes \"meaningless,\" hence requiring no specific modification.

    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 Vec<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
    Code Visualization

    Full Screen >

    In summary, the insertion and deletion operations in arrays present the following disadvantages:

    • High time complexity: Both insertion and deletion in an array have an average time complexity of \\(O(n)\\), where \\(n\\) is the length of the array.
    • Loss of elements: Due to the fixed length of arrays, elements that exceed the array's capacity are lost during insertion.
    • Waste of memory: Initializing a longer array and utilizing only the front part results in \"meaningless\" end elements during insertion, leading to some wasted memory space.
    "},{"location":"chapter_array_and_linkedlist/array/#5-traversing-arrays","title":"5. \u00a0 Traversing arrays","text":"

    In most programming languages, we can traverse an array either by using indices or by directly iterating over each element:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#6-finding-elements","title":"6. \u00a0 Finding elements","text":"

    Locating a specific element within an array involves iterating through the array, checking each element to determine if it matches the desired value.

    Because arrays are linear data structures, this operation is commonly referred to as \"linear search.\"

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#7-expanding-arrays","title":"7. \u00a0 Expanding arrays","text":"

    In complex system environments, ensuring the availability of memory space after an array for safe capacity extension becomes challenging. Consequently, in most programming languages, the length of an array is immutable.

    To expand an array, it's necessary to create a larger array and then copy the elements from the original array. This operation has a time complexity of \\(O(n)\\) and can be time-consuming for large arrays. The code are as follows:

    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: Vec<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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#412-advantages-and-limitations-of-arrays","title":"4.1.2 \u00a0 Advantages and limitations of arrays","text":"

    Arrays are stored in contiguous memory spaces and consist of elements of the same type. This approach provides substantial prior information that systems can leverage to optimize the efficiency of data structure operations.

    • High space efficiency: Arrays allocate a contiguous block of memory for data, eliminating the need for additional structural overhead.
    • Support for random access: Arrays allow \\(O(1)\\) time access to any element.
    • Cache locality: When accessing array elements, the computer not only loads them but also caches the surrounding data, utilizing high-speed cache to enchance subsequent operation speeds.

    However, continuous space storage is a double-edged sword, with the following limitations:

    • Low efficiency in insertion and deletion: As arrays accumulate many elements, inserting or deleting elements requires shifting a large number of elements.
    • Fixed length: The length of an array is fixed after initialization. Expanding an array requires copying all data to a new array, incurring significant costs.
    • Space wastage: If the allocated array size exceeds the what is necessary, the extra space is wasted.
    "},{"location":"chapter_array_and_linkedlist/array/#413-typical-applications-of-arrays","title":"4.1.3 \u00a0 Typical applications of arrays","text":"

    Arrays are fundamental and widely used data structures. They find frequent application in various algorithms and serve in the implementation of complex data structures.

    • Random access: Arrays are ideal for storing data when random sampling is required. By generating a random sequence based on indices, we can achieve random sampling efficiently.
    • Sorting and searching: Arrays are the most commonly used data structure for sorting and searching algorithms. Techniques like quick sort, merge sort, binary search, etc., are primarily operate on arrays.
    • Lookup tables: Arrays serve as efficient lookup tables for quick element or relationship retrieval. For instance, mapping characters to ASCII codes becomes seamless by using the ASCII code values as indices and storing corresponding elements in the array.
    • Machine learning: Within the domain of neural networks, arrays play a pivotal role in executing crucial linear algebra operations involving vectors, matrices, and tensors. Arrays serve as the primary and most extensively used data structure in neural network programming.
    • Data structure implementation: Arrays serve as the building blocks for implementing various data structures like stacks, queues, hash tables, heaps, graphs, etc. For instance, the adjacency matrix representation of a graph is essentially a two-dimensional array.
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 Linked list","text":"

    Memory space is a shared resource among all programs. In a complex system environment, available memory can be dispersed throughout the memory space. We understand that the memory allocated for an array must be continuous. However, for very large arrays, finding a sufficiently large contiguous memory space might be challenging. This is where the flexible advantage of linked lists becomes evident.

    A \"linked list\" is a linear data structure in which each element is a node object, and the nodes are interconnected through \"references\". These references hold the memory addresses of subsequent nodes, enabling navigation from one node to the next.

    The design of linked lists allows for their nodes to be distributed across memory locations without requiring contiguous memory addresses.

    Figure 4-5 \u00a0 Linked list definition and storage method

    As shown in the figure, we see that the basic building block of a linked list is the \"node\" object. Each node comprises two key components: the node's \"value\" and a \"reference\" to the next node.

    • The first node in a linked list is the \"head node\", and the final one is the \"tail node\".
    • The tail node points to \"null\", designated as null in Java, nullptr in C++, and None in Python.
    • In languages that support pointers, like C, C++, Go, and Rust, this \"reference\" is typically implemented as a \"pointer\".

    As the code below illustrates, a ListNode in a linked list, besides holding a value, must also maintain an additional reference (or pointer). Therefore, a linked list occupies more memory space than an array when storing the same quantity of data..

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class ListNode:\n    \"\"\"Linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # Node value\n        self.next: ListNode | None = None # Reference to the next node\n
    /* Linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the next node\n    ListNode(int x) : val(x), next(nullptr) {}  // Constructor\n};\n
    /* Linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
    /* Linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;         // Node value\n    ListNode? next;      // Reference to the next node\n}\n
    /* Linked list node structure */\ntype ListNode struct {\n    Val  int       // Node value\n    Next *ListNode // Pointer to the next node\n}\n\n// NewListNode Constructor, creates a new linked list\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // Node value\n        this.next = (next === undefined ? null : next); // Reference to the next node\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // Node value\n        this.next = next === undefined ? null : next;  // Reference to the next node\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n  int val; // Node value\n  ListNode? next; // Reference to the next node\n  ListNode(this.val, [this.next]); // Constructor\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* Linked list node class */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to the next node\n}\n
    /* Linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the next node\n} ListNode;\n\n/* Constructor */\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
    \n
    // Linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the next node\n\n        // Constructor\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-common-operations-on-linked-lists","title":"4.2.1 \u00a0 Common operations on linked lists","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1-initializing-a-linked-list","title":"1. \u00a0 Initializing a linked list","text":"

    Constructing a linked list is a two-step process: first, initializing each node object, and second, forming the reference links between the nodes. After initialization, we can traverse all nodes sequentially from the head node by following the next reference.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig linked_list.py
    # Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4\n# Initialize each node\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// Build references between nodes\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\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
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    \n
    linked_list.zig
    // Initialize linked list\n// Initialize each node\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// Build references between nodes\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n

    The array as a whole is a variable, for instance, the array nums includes elements like nums[0], nums[1], and so on, whereas a linked list is made up of several distinct node objects. We typically refer to a linked list by its head node, for example, the linked list in the previous code snippet is referred to as n0.

    "},{"location":"chapter_array_and_linkedlist/linked_list/#2-inserting-nodes","title":"2. \u00a0 Inserting nodes","text":"

    Inserting a node into a linked list is very easy. As shown in the figure, let's assume we aim to insert a new node P between two adjacent nodes n0 and n1. This can be achieved by simply modifying two node references (pointers), with a time complexity of \\(O(1)\\).

    By comparison, inserting an element into an array has a time complexity of \\(O(n)\\), which becomes less efficient when dealing with large data volumes.

    Figure 4-6 \u00a0 Linked list node insertion example

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3-deleting-nodes","title":"3. \u00a0 Deleting nodes","text":"

    As shown in the figure, deleting a node from a linked list is also very easy, involving only the modification of a single node's reference (pointer).

    It's important to note that even though node P continues to point to n1 after being deleted, it becomes inaccessible during linked list traversal. This effectively means that P is no longer a part of the linked list.

    Figure 4-7 \u00a0 Linked list node deletion

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4-accessing-nodes","title":"4. \u00a0 Accessing nodes","text":"

    Accessing nodes in a linked list is less efficient. As previously mentioned, any element in an array can be accessed in \\(O(1)\\) time. In contrast, with a linked list, the program involves starting from the head node and sequentially traversing through the nodes until the desired node is found. In other words, to access the \\(i\\)-th node in a linked list, the program must iterate through \\(i - 1\\) nodes, resulting in a time complexity of \\(O(n)\\).

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5-finding-nodes","title":"5. \u00a0 Finding nodes","text":"

    Traverse the linked list to locate a node whose value matches target, and then output the index of that node within the linked list. This procedure is also an example of linear search. The corresponding code is provided below:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-arrays-vs-linked-lists","title":"4.2.2 \u00a0 Arrays vs. linked lists","text":"

    The Table 4-1 summarizes the characteristics of arrays and linked lists, and it also compares their efficiencies in various operations. Because they utilize opposing storage strategies, their respective properties and operational efficiencies exhibit distinct contrasts.

    Table 4-1 \u00a0 Efficiency comparison of arrays and linked lists

    Arrays Linked Lists Storage Contiguous Memory Space Dispersed Memory Space Capacity Expansion Fixed Length Flexible Expansion Memory Efficiency Less Memory per Element, Potential Space Wastage More Memory per Element Accessing Elements \\(O(1)\\) \\(O(n)\\) Adding Elements \\(O(n)\\) \\(O(1)\\) Deleting Elements \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423-common-types-of-linked-lists","title":"4.2.3 \u00a0 Common types of linked lists","text":"

    As shown in the figure, there are three common types of linked lists.

    • Singly linked list: This is the standard linked list described earlier. Nodes in a singly linked list include a value and a reference to the next node. The first node is known as the head node, and the last node, which points to null (None), is the tail node.
    • Circular linked list: This is formed when the tail node of a singly linked list points back to the head node, creating a loop. In a circular linked list, any node can function as the head node.
    • Doubly linked list: In contrast to a singly linked list, a doubly linked list maintains references in two directions. Each node contains references (pointer) to both its successor (the next node) and predecessor (the previous node). Although doubly linked lists offer more flexibility for traversing in either direction, they also consume more memory space.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class ListNode:\n    \"\"\"Bidirectional linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.next: ListNode | None = None  # Reference to the successor node\n        self.prev: ListNode | None = None  # Reference to a predecessor node\n
    /* Bidirectional linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the successor node\n    ListNode *prev;  // Pointer to the predecessor node\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // Constructor\n};\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
    /* Bidirectional linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;    // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n}\n
    /* Bidirectional linked list node structure */\ntype DoublyListNode struct {\n    Val  int             // Node value\n    Next *DoublyListNode // Pointer to the successor node\n    Prev *DoublyListNode // Pointer to the predecessor node\n}\n\n// NewDoublyListNode initialization\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n    var prev: ListNode? // Reference to the predecessor node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
    /* Bidirectional linked list node class */\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;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(this.val, [this.next, this.prev]);  // Constructor\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Bidirectional linked list node type */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to successor node\n    prev: Option<Rc<RefCell<ListNode>>>, // Pointer to predecessor node\n}\n\n/* Constructors */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* Bidirectional linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the successor node\n    struct ListNode *prev; // Pointer to the predecessor node\n} ListNode;\n\n/* Constructors */\nListNode *newListNode(int val) {\n    ListNode *node, *next;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
    \n
    // Bidirectional linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the successor node\n        prev: ?*Self = null, // Pointer to the predecessor node\n\n        // Constructor\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

    Figure 4-8 \u00a0 Common types of linked lists

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424-typical-applications-of-linked-lists","title":"4.2.4 \u00a0 Typical applications of linked lists","text":"

    Singly linked lists are frequently utilized in implementing stacks, queues, hash tables, and graphs.

    • Stacks and queues: In singly linked lists, if insertions and deletions occur at the same end, it behaves like a stack (last-in-first-out). Conversely, if insertions are at one end and deletions at the other, it functions like a queue (first-in-first-out).
    • Hash tables: Linked lists are used in chaining, a popular method for resolving hash collisions. Here, all collided elements are grouped into a linked list.
    • Graphs: Adjacency lists, a standard method for graph representation, associate each graph vertex with a linked list. This list contains elements that represent vertices connected to the corresponding vertex.

    Doubly linked lists are ideal for scenarios requiring rapid access to preceding and succeeding elements.

    • Advanced data structures: In structures like red-black trees and B-trees, accessing a node's parent is essential. This is achieved by incorporating a reference to the parent node in each node, akin to a doubly linked list.
    • Browser history: In web browsers, doubly linked lists facilitate navigating the history of visited pages when users click forward or back.
    • LRU algorithm: Doubly linked lists are apt for Least Recently Used (LRU) cache eviction algorithms, enabling swift identification of the least recently used data and facilitating fast node addition and removal.

    Circular linked lists are ideal for applications that require periodic operations, such as resource scheduling in operating systems.

    • Round-robin scheduling algorithm: In operating systems, the round-robin scheduling algorithm is a common CPU scheduling method, requiring cycling through a group of processes. Each process is assigned a time slice, and upon expiration, the CPU rotates to the next process. This cyclical operation can be efficiently realized using a circular linked list, allowing for a fair and time-shared system among all processes.
    • Data buffers: Circular linked lists are also used in data buffers, like in audio and video players, where the data stream is divided into multiple buffer blocks arranged in a circular fashion for seamless playback.
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 List","text":"

    A \"list\" is an abstract data structure concept that represents an ordered collection of elements, supporting operations such as element access, modification, addition, deletion, and traversal, without requiring users to consider capacity limitations. Lists can be implemented based on linked lists or arrays.

    • A linked list inherently serves as a list, supporting operations for adding, deleting, searching, and modifying elements, with the flexibility to dynamically adjust its size.
    • Arrays also support these operations, but due to their immutable length, they can be considered as a list with a length limit.

    When implementing lists using arrays, the immutability of length reduces the practicality of the list. This is because predicting the amount of data to be stored in advance is often challenging, making it difficult to choose an appropriate list length. If the length is too small, it may not meet the requirements; if too large, it may waste memory space.

    To solve this problem, we can implement lists using a \"dynamic array.\" It inherits the advantages of arrays and can dynamically expand during program execution.

    In fact, many programming languages' standard libraries implement lists using dynamic arrays, such as Python's list, Java's ArrayList, C++'s vector, and C#'s List. In the following discussion, we will consider \"list\" and \"dynamic array\" as synonymous concepts.

    "},{"location":"chapter_array_and_linkedlist/list/#431-common-list-operations","title":"4.3.1 \u00a0 Common list operations","text":""},{"location":"chapter_array_and_linkedlist/list/#1-initializing-a-list","title":"1. \u00a0 Initializing a list","text":"

    We typically use two initialization methods: \"without initial values\" and \"with initial values\".

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Initialize list\n# Without initial values\nnums1: list[int] = []\n# With initial values\nnums: list[int] = [1, 3, 2, 5, 4]\n
    list.cpp
    /* Initialize list */\n// Note, in C++ the vector is the equivalent of nums described here\n// Without initial values\nvector<int> nums1;\n// With initial values\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
    list.java
    /* Initialize list */\n// Without initial values\nList<Integer> nums1 = new ArrayList<>();\n// With initial values (note the element type should be the wrapper class Integer[] for int[])\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
    list.cs
    /* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
    list_test.go
    /* Initialize list */\n// Without initial values\nnums1 := []int{}\n// With initial values\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* Initialize list */\n// Without initial values\nlet nums1: [Int] = []\n// With initial values\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* Initialize list */\n// Without initial values\nconst nums1 = [];\n// With initial values\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* Initialize list */\n// Without initial values\nconst nums1: number[] = [];\n// With initial values\nconst nums: number[] = [1, 3, 2, 5, 4];\n
    list.dart
    /* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nList<int> nums = [1, 3, 2, 5, 4];\n
    list.rs
    /* Initialize list */\n// Without initial values\nlet nums1: Vec<i32> = Vec::new();\n// With initial values\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Initialize list\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    "},{"location":"chapter_array_and_linkedlist/list/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

    Lists are essentially arrays, thus they can access and update elements in \\(O(1)\\) time, which is very efficient.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Access elements\nnum: int = nums[1]  # Access the element at index 1\n\n# Update elements\nnums[1] = 0    # Update the element at index 1 to 0\n
    list.cpp
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.java
    /* Access elements */\nint num = nums.get(1);  // Access the element at index 1\n\n/* Update elements */\nnums.set(1, 0);  // Update the element at index 1 to 0\n
    list.cs
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list_test.go
    /* Access elements */\nnum := nums[1]  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0     // Update the element at index 1 to 0\n
    list.swift
    /* Access elements */\nlet num = nums[1] // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0 // Update the element at index 1 to 0\n
    list.js
    /* Access elements */\nconst num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.ts
    /* Access elements */\nconst num: number = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.dart
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.rs
    /* Access elements */\nlet num: i32 = nums[1];  // Access the element at index 1\n/* Update elements */\nnums[1] = 0;             // Update the element at index 1 to 0\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Access elements\nvar num = nums.items[1]; // Access the element at index 1\n\n// Update elements\nnums.items[1] = 0; // Update the element at index 1 to 0  \n
    "},{"location":"chapter_array_and_linkedlist/list/#3-inserting-and-removing-elements","title":"3. \u00a0 Inserting and removing elements","text":"

    Compared to arrays, lists offer more flexibility in adding and removing elements. While adding elements to the end of a list is an \\(O(1)\\) operation, the efficiency of inserting and removing elements elsewhere in the list remains the same as in arrays, with a time complexity of \\(O(n)\\).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Clear list\nnums.clear()\n\n# Append elements at the end\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# Insert element in the middle\nnums.insert(3, 6)  # Insert number 6 at index 3\n\n# Remove elements\nnums.pop(3)        # Remove the element at index 3\n
    list.cpp
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* Insert element in the middle */\nnums.insert(nums.begin() + 3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.erase(nums.begin() + 3);      // Remove the element at index 3\n
    list.java
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.add(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);  // Remove the element at index 3\n
    list.cs
    /* Clear list */\nnums.Clear();\n\n/* Append elements at the end */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* Insert element in the middle */\nnums.Insert(3, 6);\n\n/* Remove elements */\nnums.RemoveAt(3);\n
    list_test.go
    /* Clear list */\nnums = nil\n\n/* Append elements at the end */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* Insert element in the middle */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Insert number 6 at index 3\n\n/* Remove elements */\nnums = append(nums[:3], nums[4:]...) // Remove the element at index 3\n
    list.swift
    /* Clear list */\nnums.removeAll()\n\n/* Append elements at the end */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* Insert element in the middle */\nnums.insert(6, at: 3) // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(at: 3) // Remove the element at index 3\n
    list.js
    /* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
    list.ts
    /* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
    list.dart
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6); // Insert number 6 at index 3\n\n/* Remove elements */\nnums.removeAt(3); // Remove the element at index 3\n
    list.rs
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);    // Remove the element at index 3\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Clear list\nnums.clearRetainingCapacity();\n\n// Append elements at the end\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// Insert element in the middle\ntry nums.insert(3, 6); // Insert number 6 at index 3\n\n// Remove elements\n_ = nums.orderedRemove(3); // Remove the element at index 3\n
    "},{"location":"chapter_array_and_linkedlist/list/#4-iterating-the-list","title":"4. \u00a0 Iterating the list","text":"

    Similar to arrays, lists can be iterated either by using indices or by directly iterating through each element.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Iterate through the list by index\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# Iterate directly through list elements\nfor num in nums:\n    count += num\n
    list.cpp
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* Iterate directly through list elements */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* Iterate through the list by index */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* Iterate through the list by index */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* Iterate through the list by index */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // Iterate through the list by index\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// Iterate directly through list elements\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Iterate through the list by index\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// Iterate directly through list elements\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    "},{"location":"chapter_array_and_linkedlist/list/#5-concatenating-lists","title":"5. \u00a0 Concatenating lists","text":"

    Given a new list nums1, we can append it to the end of the original list.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Concatenate two lists\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # Concatenate nums1 to the end of nums\n
    list.cpp
    /* Concatenate two lists */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// Concatenate nums1 to the end of nums\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* Concatenate two lists */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
    list.cs
    /* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // Concatenate nums1 to the end of nums\n
    list_test.go
    /* Concatenate two lists */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // Concatenate nums1 to the end of nums\n
    list.swift
    /* Concatenate two lists */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // Concatenate nums1 to the end of nums\n
    list.js
    /* Concatenate two lists */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
    list.ts
    /* Concatenate two lists */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
    list.dart
    /* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
    list.rs
    /* Concatenate two lists */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Concatenate two lists\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); // Concatenate nums1 to the end of nums\n
    "},{"location":"chapter_array_and_linkedlist/list/#6-sorting-the-list","title":"6. \u00a0 Sorting the list","text":"

    Once the list is sorted, we can employ algorithms commonly used in array-related algorithm problems, such as \"binary search\" and \"two-pointer\" algorithms.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Sort the list\nnums.sort()  # After sorting, the list elements are in ascending order\n
    list.cpp
    /* Sort the list */\nsort(nums.begin(), nums.end());  // After sorting, the list elements are in ascending order\n
    list.java
    /* Sort the list */\nCollections.sort(nums);  // After sorting, the list elements are in ascending order\n
    list.cs
    /* Sort the list */\nnums.Sort(); // After sorting, the list elements are in ascending order\n
    list_test.go
    /* Sort the list */\nsort.Ints(nums)  // After sorting, the list elements are in ascending order\n
    list.swift
    /* Sort the list */\nnums.sort() // After sorting, the list elements are in ascending order\n
    list.js
    /* Sort the list */  \nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
    list.ts
    /* Sort the list */\nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
    list.dart
    /* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
    list.rs
    /* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Sort the list\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    "},{"location":"chapter_array_and_linkedlist/list/#432-list-implementation","title":"4.3.2 \u00a0 List implementation","text":"

    Many programming languages come with built-in lists, including Java, C++, Python, etc. Their implementations tend to be intricate, featuring carefully considered settings for various parameters, like initial capacity and expansion factors. Readers who are curious can delve into the source code for further learning.

    To enhance our understanding of how lists work, we will attempt to implement a simplified version of a list, focusing on three crucial design aspects:

    • Initial capacity: Choose a reasonable initial capacity for the array. In this example, we choose 10 as the initial capacity.
    • Size recording: Declare a variable size to record the current number of elements in the list, updating in real-time with element insertion and deletion. With this variable, we can locate the end of the list and determine whether expansion is needed.
    • Expansion mechanism: If the list reaches full capacity upon an element insertion, an expansion process is required. This involves creating a larger array based on the expansion factor, and then transferring all elements from the current array to the new one. In this example, we stipulate that the array size should double with each expansion.
    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 Memory and cache *","text":"

    In the first two sections of this chapter, we explored arrays and linked lists, two fundamental and important data structures, representing \"continuous storage\" and \"dispersed storage\" respectively.

    In fact, the physical structure largely determines the efficiency of a program's use of memory and cache, which in turn affects the overall performance of the algorithm.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441-computer-storage-devices","title":"4.4.1 \u00a0 Computer storage devices","text":"

    There are three types of storage devices in computers: \"hard disk,\" \"random-access memory (RAM),\" and \"cache memory.\" The following table shows their different roles and performance characteristics in computer systems.

    Table 4-2 \u00a0 Computer storage devices

    Hard Disk Memory Cache Usage Long-term storage of data, including OS, programs, files, etc. Temporary storage of currently running programs and data being processed Stores frequently accessed data and instructions, reducing the number of CPU accesses to memory Volatility Data is not lost after power off Data is lost after power off Data is lost after power off Capacity Larger, TB level Smaller, GB level Very small, MB level Speed Slower, several hundred to thousands MB/s Faster, several tens of GB/s Very fast, several tens to hundreds of GB/s Price Cheaper, several cents to yuan / GB More expensive, tens to hundreds of yuan / GB Very expensive, priced with CPU

    We can imagine the computer storage system as a pyramid structure shown in the Figure 4-9 . The storage devices closer to the top of the pyramid are faster, have smaller capacity, and are more costly. This multi-level design is not accidental, but the result of careful consideration by computer scientists and engineers.

    • Hard disks are difficult to replace with memory. Firstly, data in memory is lost after power off, making it unsuitable for long-term data storage; secondly, the cost of memory is dozens of times that of hard disks, making it difficult to popularize in the consumer market.
    • It is difficult for caches to have both large capacity and high speed. As the capacity of L1, L2, L3 caches gradually increases, their physical size becomes larger, increasing the physical distance from the CPU core, leading to increased data transfer time and higher element access latency. Under current technology, a multi-level cache structure is the best balance between capacity, speed, and cost.

    Figure 4-9 \u00a0 Computer storage system

    Note

    The storage hierarchy of computers reflects a delicate balance between speed, capacity, and cost. In fact, this kind of trade-off is common in all industrial fields, requiring us to find the best balance between different advantages and limitations.

    Overall, hard disks are used for long-term storage of large amounts of data, memory is used for temporary storage of data being processed during program execution, and cache is used to store frequently accessed data and instructions to improve program execution efficiency. Together, they ensure the efficient operation of computer systems.

    As shown in the Figure 4-10 , during program execution, data is read from the hard disk into memory for CPU computation. The cache can be considered a part of the CPU, smartly loading data from memory to provide fast data access to the CPU, significantly enhancing program execution efficiency and reducing reliance on slower memory.

    Figure 4-10 \u00a0 Data flow between hard disk, memory, and cache

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442-memory-efficiency-of-data-structures","title":"4.4.2 \u00a0 Memory efficiency of data structures","text":"

    In terms of memory space utilization, arrays and linked lists have their advantages and limitations.

    On one hand, memory is limited and cannot be shared by multiple programs, so we hope that data structures can use space as efficiently as possible. The elements of an array are tightly packed without extra space for storing references (pointers) between linked list nodes, making them more space-efficient. However, arrays require allocating sufficient continuous memory space at once, which may lead to memory waste, and array expansion also requires additional time and space costs. In contrast, linked lists allocate and reclaim memory dynamically on a per-node basis, providing greater flexibility.

    On the other hand, during program execution, as memory is repeatedly allocated and released, the degree of fragmentation of free memory becomes higher, leading to reduced memory utilization efficiency. Arrays, due to their continuous storage method, are relatively less likely to cause memory fragmentation. In contrast, the elements of a linked list are dispersedly stored, and frequent insertion and deletion operations make memory fragmentation more likely.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443-cache-efficiency-of-data-structures","title":"4.4.3 \u00a0 Cache efficiency of data structures","text":"

    Although caches are much smaller in space capacity than memory, they are much faster and play a crucial role in program execution speed. Since the cache's capacity is limited and can only store a small part of frequently accessed data, when the CPU tries to access data not in the cache, a \"cache miss\" occurs, forcing the CPU to load the needed data from slower memory.

    Clearly, the fewer the cache misses, the higher the CPU's data read-write efficiency, and the better the program performance. The proportion of successful data retrieval from the cache by the CPU is called the \"cache hit rate,\" a metric often used to measure cache efficiency.

    To achieve higher efficiency, caches adopt the following data loading mechanisms.

    • Cache lines: Caches don't store and load data byte by byte but in units of cache lines. Compared to byte-by-byte transfer, the transmission of cache lines is more efficient.
    • Prefetch mechanism: Processors try to predict data access patterns (such as sequential access, fixed stride jumping access, etc.) and load data into the cache according to specific patterns to improve the hit rate.
    • Spatial locality: If data is accessed, data nearby is likely to be accessed in the near future. Therefore, when loading certain data, the cache also loads nearby data to improve the hit rate.
    • Temporal locality: If data is accessed, it's likely to be accessed again in the near future. Caches use this principle to retain recently accessed data to improve the hit rate.

    In fact, arrays and linked lists have different cache utilization efficiencies, mainly reflected in the following aspects.

    • Occupied space: Linked list elements occupy more space than array elements, resulting in less effective data volume in the cache.
    • Cache lines: Linked list data is scattered throughout memory, and since caches load \"by line,\" the proportion of loading invalid data is higher.
    • Prefetch mechanism: The data access pattern of arrays is more \"predictable\" than that of linked lists, meaning the system is more likely to guess which data will be loaded next.
    • Spatial locality: Arrays are stored in concentrated memory spaces, so the data near the loaded data is more likely to be accessed next.

    Overall, arrays have a higher cache hit rate and are generally more efficient in operation than linked lists. This makes data structures based on arrays more popular in solving algorithmic problems.

    It should be noted that high cache efficiency does not mean that arrays are always better than linked lists. Which data structure to choose in actual applications should be based on specific requirements. For example, both arrays and linked lists can implement the \"stack\" data structure (which will be detailed in the next chapter), but they are suitable for different scenarios.

    • In algorithm problems, we tend to choose stacks based on arrays because they provide higher operational efficiency and random access capabilities, with the only cost being the need to pre-allocate a certain amount of memory space for the array.
    • If the data volume is very large, highly dynamic, and the expected size of the stack is difficult to estimate, then a stack based on a linked list is more appropriate. Linked lists can disperse a large amount of data in different parts of the memory and avoid the additional overhead of array expansion.
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 Summary","text":""},{"location":"chapter_array_and_linkedlist/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Arrays and linked lists are two basic data structures, representing two storage methods in computer memory: contiguous space storage and non-contiguous space storage. Their characteristics complement each other.
    • Arrays support random access and use less memory; however, they are inefficient in inserting and deleting elements and have a fixed length after initialization.
    • Linked lists implement efficient node insertion and deletion through changing references (pointers) and can flexibly adjust their length; however, they have lower node access efficiency and consume more memory.
    • Common types of linked lists include singly linked lists, circular linked lists, and doubly linked lists, each with its own application scenarios.
    • Lists are ordered collections of elements that support addition, deletion, and modification, typically implemented based on dynamic arrays, retaining the advantages of arrays while allowing flexible length adjustment.
    • The advent of lists significantly enhanced the practicality of arrays but may lead to some memory space wastage.
    • During program execution, data is mainly stored in memory. Arrays provide higher memory space efficiency, while linked lists are more flexible in memory usage.
    • Caches provide fast data access to CPUs through mechanisms like cache lines, prefetching, spatial locality, and temporal locality, significantly enhancing program execution efficiency.
    • Due to higher cache hit rates, arrays are generally more efficient than linked lists. When choosing a data structure, the appropriate choice should be made based on specific needs and scenarios.
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Does storing arrays on the stack versus the heap affect time and space efficiency?

    Arrays stored on both the stack and heap are stored in contiguous memory spaces, and data operation efficiency is essentially the same. However, stacks and heaps have their own characteristics, leading to the following differences.

    1. Allocation and release efficiency: The stack is a smaller memory block, allocated automatically by the compiler; the heap memory is relatively larger and can be dynamically allocated in the code, more prone to fragmentation. Therefore, allocation and release operations on the heap are generally slower than on the stack.
    2. Size limitation: Stack memory is relatively small, while the heap size is generally limited by available memory. Therefore, the heap is more suitable for storing large arrays.
    3. Flexibility: The size of arrays on the stack needs to be determined at compile-time, while the size of arrays on the heap can be dynamically determined at runtime.

    Q: Why do arrays require elements of the same type, while linked lists do not emphasize same-type elements?

    Linked lists consist of nodes connected by references (pointers), and each node can store data of different types, such as int, double, string, object, etc.

    In contrast, array elements must be of the same type, allowing the calculation of offsets to access the corresponding element positions. For example, an array containing both int and long types, with single elements occupying 4 bytes and 8 bytes respectively, cannot use the following formula to calculate offsets, as the array contains elements of two different lengths.

    # Element memory address = array memory address + element length * element index\n

    Q: After deleting a node, is it necessary to set P.next to None?

    Not modifying P.next is also acceptable. From the perspective of the linked list, traversing from the head node to the tail node will no longer encounter P. This means that node P has been effectively removed from the list, and where P points no longer affects the list.

    From a garbage collection perspective, for languages with automatic garbage collection mechanisms like Java, Python, and Go, whether node P is collected depends on whether there are still references pointing to it, not on the value of P.next. In languages like C and C++, we need to manually free the node's memory.

    Q: In linked lists, the time complexity for insertion and deletion operations is O(1). But searching for the element before insertion or deletion takes O(n) time, so why isn't the time complexity O(n)?

    If an element is searched first and then deleted, the time complexity is indeed O(n). However, the O(1) advantage of linked lists in insertion and deletion can be realized in other applications. For example, in the implementation of double-ended queues using linked lists, we maintain pointers always pointing to the head and tail nodes, making each insertion and deletion operation O(1).

    Q: In the image \"Linked List Definition and Storage Method\", do the light blue storage nodes occupy a single memory address, or do they share half with the node value?

    The diagram is just a qualitative representation; quantitative analysis depends on specific situations.

    • Different types of node values occupy different amounts of space, such as int, long, double, and object instances.
    • The memory space occupied by pointer variables depends on the operating system and compilation environment used, usually 8 bytes or 4 bytes.

    Q: Is adding elements to the end of a list always O(1)?

    If adding an element exceeds the list length, the list needs to be expanded first. The system will request a new memory block and move all elements of the original list over, in which case the time complexity becomes O(n).

    Q: The statement \"The emergence of lists greatly improves the practicality of arrays, but may lead to some memory space wastage\" - does this refer to the memory occupied by additional variables like capacity, length, and expansion multiplier?

    The space wastage here mainly refers to two aspects: on the one hand, lists are set with an initial length, which we may not always need; on the other hand, to prevent frequent expansion, expansion usually multiplies by a coefficient, such as \\(\\times 1.5\\). This results in many empty slots, which we typically cannot fully fill.

    Q: In Python, after initializing n = [1, 2, 3], the addresses of these 3 elements are contiguous, but initializing m = [2, 1, 3] shows that each element's id is not consecutive but identical to those in n. If the addresses of these elements are not contiguous, is m still an array?

    If we replace list elements with linked list nodes n = [n1, n2, n3, n4, n5], these 5 node objects are also typically dispersed throughout memory. However, given a list index, we can still access the node's memory address in O(1) time, thereby accessing the corresponding node. This is because the array stores references to the nodes, not the nodes themselves.

    Unlike many languages, in Python, numbers are also wrapped as objects, and lists store references to these numbers, not the numbers themselves. Therefore, we find that the same number in two arrays has the same id, and these numbers' memory addresses need not be contiguous.

    Q: The std::list in C++ STL has already implemented a doubly linked list, but it seems that some algorithm books don't directly use it. Is there any limitation?

    On the one hand, we often prefer to use arrays to implement algorithms, only using linked lists when necessary, mainly for two reasons.

    • Space overhead: Since each element requires two additional pointers (one for the previous element and one for the next), std::list usually occupies more space than std::vector.
    • Cache unfriendly: As the data is not stored continuously, std::list has a lower cache utilization rate. Generally, std::vector performs better.

    On the other hand, linked lists are primarily necessary for binary trees and graphs. Stacks and queues are often implemented using the programming language's stack and queue classes, rather than linked lists.

    Q: Does initializing a list res = [0] * self.size() result in each element of res referencing the same address?

    No. However, this issue arises with two-dimensional arrays, for example, initializing a two-dimensional list res = [[0] * self.size()] would reference the same list [0] multiple times.

    Q: In deleting a node, is it necessary to break the reference to its successor node?

    From the perspective of data structures and algorithms (problem-solving), it's okay not to break the link, as long as the program's logic is correct. From the perspective of standard libraries, breaking the link is safer and more logically clear. If the link is not broken, and the deleted node is not properly recycled, it could affect the recycling of the successor node's memory.

    "},{"location":"chapter_computational_complexity/","title":"Chapter 2. \u00a0 Complexity analysis","text":"

    Abstract

    Complexity analysis is like a space-time navigator in the vast universe of algorithms.

    It guides us in exploring deeper within the the dimensions of time and space, seeking more elegant solutions.

    "},{"location":"chapter_computational_complexity/#chapter-contents","title":"Chapter contents","text":"
    • 2.1 \u00a0 Algorithm efficiency assessment
    • 2.2 \u00a0 Iteration and recursion
    • 2.3 \u00a0 Time complexity
    • 2.4 \u00a0 Space complexity
    • 2.5 \u00a0 Summary
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 Iteration and recursion","text":"

    In algorithms, the repeated execution of a task is quite common and is closely related to the analysis of complexity. Therefore, before delving into the concepts of time complexity and space complexity, let's first explore how to implement repetitive tasks in programming. This involves understanding two fundamental programming control structures: iteration and recursion.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#221-iteration","title":"2.2.1 \u00a0 Iteration","text":"

    \"Iteration\" is a control structure for repeatedly performing a task. In iteration, a program repeats a block of code as long as a certain condition is met until this condition is no longer satisfied.

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

    The for loop is one of the most common forms of iteration, and it's particularly suitable when the number of iterations is known in advance.

    The following function uses a for loop to perform a summation of \\(1 + 2 + \\dots + n\\), with the sum being stored in the variable res. It's important to note that in Python, range(a, b) creates an interval that is inclusive of a but exclusive of b, meaning it iterates over the range from \\(a\\) up to \\(b\u22121\\).

    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
    Code Visualization

    Full Screen >

    The flowchart below represents this sum function.

    Figure 2-1 \u00a0 Flowchart of the sum function

    The number of operations in this summation function is proportional to the size of the input data \\(n\\), or in other words, it has a \"linear relationship.\" This \"linear relationship\" is what time complexity describes. This topic will be discussed in more detail in the next section.

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

    Similar to for loops, while loops are another approach for implementing iteration. In a while loop, the program checks a condition at the beginning of each iteration; if the condition is true, the execution continues, otherwise, the loop ends.

    Below we use a while loop to implement the sum \\(1 + 2 + \\dots + n\\).

    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
    Code Visualization

    Full Screen >

    While loops provide more flexibility than for loops, especially since they allow for custom initialization and modification of the condition variable at each step.

    For example, in the following code, the condition variable \\(i\\) is updated twice each round, which would be inconvenient to implement with a for loop.

    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
    Code Visualization

    Full Screen >

    Overall, for loops are more concise, while while loops are more flexible. Both can implement iterative structures. Which one to use should be determined based on the specific requirements of the problem.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-nested-loops","title":"3. \u00a0 Nested loops","text":"

    We can nest one loop structure within another. Below is an example using for loops:

    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
    Code Visualization

    Full Screen >

    The flowchart below represents this nested loop.

    Figure 2-2 \u00a0 Flowchart of the nested loop

    In such cases, the number of operations of the function is proportional to \\(n^2\\), meaning the algorithm's runtime and the size of the input data \\(n\\) has a 'quadratic relationship.'

    We can further increase the complexity by adding more nested loops, each level of nesting effectively \"increasing the dimension,\" which raises the time complexity to \"cubic,\" \"quartic,\" and so on.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#222-recursion","title":"2.2.2 \u00a0 Recursion","text":"

    \"Recursion\" is an algorithmic strategy where a function solves a problem by calling itself. It primarily involves two phases:

    1. Calling: This is where the program repeatedly calls itself, often with progressively smaller or simpler arguments, moving towards the \"termination condition.\"
    2. Returning: Upon triggering the \"termination condition,\" the program begins to return from the deepest recursive function, aggregating the results of each layer.

    From an implementation perspective, recursive code mainly includes three elements.

    1. Termination Condition: Determines when to switch from \"calling\" to \"returning.\"
    2. Recursive Call: Corresponds to \"calling,\" where the function calls itself, usually with smaller or more simplified parameters.
    3. Return Result: Corresponds to \"returning,\" where the result of the current recursion level is returned to the previous layer.

    Observe the following code, where simply calling the function recur(n) can compute the sum of \\(1 + 2 + \\dots + n\\):

    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
    Code Visualization

    Full Screen >

    The Figure 2-3 shows the recursive process of this function.

    Figure 2-3 \u00a0 Recursive process of the sum function

    Although iteration and recursion can achieve the same results from a computational standpoint, they represent two entirely different paradigms of thinking and problem-solving.

    • Iteration: Solves problems \"from the bottom up.\" It starts with the most basic steps, and then repeatedly adds or accumulates these steps until the task is complete.
    • Recursion: Solves problems \"from the top down.\" It breaks down the original problem into smaller sub-problems, each of which has the same form as the original problem. These sub-problems are then further decomposed into even smaller sub-problems, stopping at the base case whose solution is known.

    Let's take the earlier example of the summation function, defined as \\(f(n) = 1 + 2 + \\dots + n\\).

    • Iteration: In this approach, we simulate the summation process within a loop. Starting from \\(1\\) and traversing to \\(n\\), we perform the summation operation in each iteration to eventually compute \\(f(n)\\).
    • Recursion: Here, the problem is broken down into a sub-problem: \\(f(n) = n + f(n-1)\\). This decomposition continues recursively until reaching the base case, \\(f(1) = 1\\), at which point the recursion terminates.
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-call-stack","title":"1. \u00a0 Call stack","text":"

    Every time a recursive function calls itself, the system allocates memory for the newly initiated function to store local variables, the return address, and other relevant information. This leads to two primary outcomes.

    • The function's context data is stored in a memory area called \"stack frame space\" and is only released after the function returns. Therefore, recursion generally consumes more memory space than iteration.
    • Recursive calls introduce additional overhead. Hence, recursion is usually less time-efficient than loops.

    As shown in the Figure 2-4 , there are \\(n\\) unreturned recursive functions before triggering the termination condition, indicating a recursion depth of \\(n\\).

    Figure 2-4 \u00a0 Recursion call depth

    In practice, the depth of recursion allowed by programming languages is usually limited, and excessively deep recursion can lead to stack overflow errors.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-tail-recursion","title":"2. \u00a0 Tail recursion","text":"

    Interestingly, if a function performs its recursive call as the very last step before returning, it can be optimized by the compiler or interpreter to be as space-efficient as iteration. This scenario is known as \"tail recursion.\"

    • Regular recursion: In standard recursion, when the function returns to the previous level, it continues to execute more code, requiring the system to save the context of the previous call.
    • Tail recursion: Here, the recursive call is the final operation before the function returns. This means that upon returning to the previous level, no further actions are needed, so the system does not need to save the context of the previous level.

    For example, in calculating \\(1 + 2 + \\dots + n\\), we can make the result variable res a parameter of the function, thereby achieving tail recursion:

    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
    Code Visualization

    Full Screen >

    The execution process of tail recursion is shown in the following figure. Comparing regular recursion and tail recursion, the point of the summation operation is different.

    • Regular recursion: The summation operation occurs during the \"returning\" phase, requiring another summation after each layer returns.
    • Tail recursion: The summation operation occurs during the \"calling\" phase, and the \"returning\" phase only involves returning through each layer.

    Figure 2-5 \u00a0 Tail recursion process

    Tip

    Note that many compilers or interpreters do not support tail recursion optimization. For example, Python does not support tail recursion optimization by default, so even if the function is in the form of tail recursion, it may still encounter stack overflow issues.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-recursion-tree","title":"3. \u00a0 Recursion tree","text":"

    When dealing with algorithms related to \"divide and conquer\", recursion often offers a more intuitive approach and more readable code than iteration. Take the \"Fibonacci sequence\" as an example.

    Question

    Given a Fibonacci sequence \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\), find the \\(n\\)th number in the sequence.

    Let the \\(n\\)th number of the Fibonacci sequence be \\(f(n)\\), it's easy to deduce two conclusions:

    • The first two numbers of the sequence are \\(f(1) = 0\\) and \\(f(2) = 1\\).
    • Each number in the sequence is the sum of the two preceding ones, that is, \\(f(n) = f(n - 1) + f(n - 2)\\).

    Using the recursive relation, and considering the first two numbers as termination conditions, we can write the recursive code. Calling fib(n) will yield the \\(n\\)th number of the Fibonacci sequence:

    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
    Code Visualization

    Full Screen >

    Observing the above code, we see that it recursively calls two functions within itself, meaning that one call generates two branching calls. As illustrated below, this continuous recursive calling eventually creates a \"recursion tree\" with a depth of \\(n\\).

    Figure 2-6 \u00a0 Fibonacci sequence recursion tree

    Fundamentally, recursion embodies the paradigm of \"breaking down a problem into smaller sub-problems.\" This divide-and-conquer strategy is crucial.

    • From an algorithmic perspective, many important strategies like searching, sorting, backtracking, divide-and-conquer, and dynamic programming directly or indirectly use this way of thinking.
    • From a data structure perspective, recursion is naturally suited for dealing with linked lists, trees, and graphs, as they are well suited for analysis using the divide-and-conquer approach.
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223-comparison","title":"2.2.3 \u00a0 Comparison","text":"

    Summarizing the above content, the following table shows the differences between iteration and recursion in terms of implementation, performance, and applicability.

    Table: Comparison of iteration and recursion characteristics

    Iteration Recursion Approach Loop structure Function calls itself Time Efficiency Generally higher efficiency, no function call overhead Each function call generates overhead Memory Usage Typically uses a fixed size of memory space Accumulative function calls can use a substantial amount of stack frame space Suitable Problems Suitable for simple loop tasks, intuitive and readable code Suitable for problem decomposition, like trees, graphs, divide-and-conquer, backtracking, etc., concise and clear code structure

    Tip

    If you find the following content difficult to understand, consider revisiting it after reading the \"Stack\" chapter.

    So, what is the intrinsic connection between iteration and recursion? Taking the above recursive function as an example, the summation operation occurs during the recursion's \"return\" phase. This means that the initially called function is the last to complete its summation operation, mirroring the \"last in, first out\" principle of a stack.

    Recursive terms like \"call stack\" and \"stack frame space\" hint at the close relationship between recursion and stacks.

    1. Calling: When a function is called, the system allocates a new stack frame on the \"call stack\" for that function, storing local variables, parameters, return addresses, and other data.
    2. Returning: When a function completes execution and returns, the corresponding stack frame is removed from the \"call stack,\" restoring the execution environment of the previous function.

    Therefore, we can use an explicit stack to simulate the behavior of the call stack, thus transforming recursion into an iterative form:

    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
    Code Visualization

    Full Screen >

    Observing the above code, when recursion is transformed into iteration, the code becomes more complex. Although iteration and recursion can often be transformed into each other, it's not always advisable to do so for two reasons:

    • The transformed code may become more challenging to understand and less readable.
    • For some complex problems, simulating the behavior of the system's call stack can be quite challenging.

    In conclusion, whether to choose iteration or recursion depends on the specific nature of the problem. In programming practice, it's crucial to weigh the pros and cons of both and choose the most suitable approach for the situation at hand.

    "},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 Algorithm efficiency assessment","text":"

    In algorithm design, we pursue the following two objectives in sequence.

    1. Finding a Solution to the Problem: The algorithm should reliably find the correct solution within the stipulated range of inputs.
    2. Seeking the Optimal Solution: For the same problem, multiple solutions might exist, and we aim to find the most efficient algorithm possible.

    In other words, under the premise of being able to solve the problem, algorithm efficiency has become the main criterion for evaluating the merits of an algorithm, which includes the following two dimensions.

    • Time efficiency: The speed at which an algorithm runs.
    • Space efficiency: The size of the memory space occupied by an algorithm.

    In short, our goal is to design data structures and algorithms that are both fast and memory-efficient. Effectively assessing algorithm efficiency is crucial because only then can we compare various algorithms and guide the process of algorithm design and optimization.

    There are mainly two methods of efficiency assessment: actual testing and theoretical estimation.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211-actual-testing","title":"2.1.1 \u00a0 Actual testing","text":"

    Suppose we have algorithms A and B, both capable of solving the same problem, and we need to compare their efficiencies. The most direct method is to use a computer to run these two algorithms and monitor and record their runtime and memory usage. This assessment method reflects the actual situation but has significant limitations.

    On one hand, it's difficult to eliminate interference from the testing environment. Hardware configurations can affect algorithm performance. For example, algorithm A might run faster than B on one computer, but the opposite result may occur on another computer with different configurations. This means we would need to test on a variety of machines to calculate average efficiency, which is impractical.

    On the other hand, conducting a full test is very resource-intensive. As the volume of input data changes, the efficiency of the algorithms may vary. For example, with smaller data volumes, algorithm A might run faster than B, but the opposite might be true with larger data volumes. Therefore, to draw convincing conclusions, we need to test a wide range of input data sizes, which requires significant computational resources.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#212-theoretical-estimation","title":"2.1.2 \u00a0 Theoretical estimation","text":"

    Due to the significant limitations of actual testing, we can consider evaluating algorithm efficiency solely through calculations. This estimation method is known as \"asymptotic complexity analysis,\" or simply \"complexity analysis.\"

    Complexity analysis reflects the relationship between the time and space resources required for algorithm execution and the size of the input data. It describes the trend of growth in the time and space required by the algorithm as the size of the input data increases. This definition might sound complex, but we can break it down into three key points to understand it better.

    • \"Time and space resources\" correspond to \"time complexity\" and \"space complexity,\" respectively.
    • \"As the size of input data increases\" means that complexity reflects the relationship between algorithm efficiency and the volume of input data.
    • \"The trend of growth in time and space\" indicates that complexity analysis focuses not on the specific values of runtime or space occupied but on the \"rate\" at which time or space grows.

    Complexity analysis overcomes the disadvantages of actual testing methods, reflected in the following aspects:

    • It is independent of the testing environment and applicable to all operating platforms.
    • It can reflect algorithm efficiency under different data volumes, especially in the performance of algorithms with large data volumes.

    Tip

    If you're still confused about the concept of complexity, don't worry. We will introduce it in detail in subsequent chapters.

    Complexity analysis provides us with a \"ruler\" to measure the time and space resources needed to execute an algorithm and compare the efficiency between different algorithms.

    Complexity is a mathematical concept and may be abstract and challenging for beginners. From this perspective, complexity analysis might not be the best content to introduce first. However, when discussing the characteristics of a particular data structure or algorithm, it's hard to avoid analyzing its speed and space usage.

    In summary, it's recommended that you establish a preliminary understanding of complexity analysis before diving deep into data structures and algorithms, so that you can carry out simple complexity analyses of algorithms.

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 Space complexity","text":"

    \"Space complexity\" is used to measure the growth trend of the memory space occupied by an algorithm as the amount of data increases. This concept is very similar to time complexity, except that \"running time\" is replaced with \"occupied memory space\".

    "},{"location":"chapter_computational_complexity/space_complexity/#241-space-related-to-algorithms","title":"2.4.1 \u00a0 Space related to algorithms","text":"

    The memory space used by an algorithm during its execution mainly includes the following types.

    • Input space: Used to store the input data of the algorithm.
    • Temporary space: Used to store variables, objects, function contexts, and other data during the algorithm's execution.
    • Output space: Used to store the output data of the algorithm.

    Generally, the scope of space complexity statistics includes both \"Temporary Space\" and \"Output Space\".

    Temporary space can be further divided into three parts.

    • Temporary data: Used to save various constants, variables, objects, etc., during the algorithm's execution.
    • Stack frame space: Used to save the context data of the called function. The system creates a stack frame at the top of the stack each time a function is called, and the stack frame space is released after the function returns.
    • Instruction space: Used to store compiled program instructions, which are usually negligible in actual statistics.

    When analyzing the space complexity of a program, we typically count the Temporary Data, Stack Frame Space, and Output Data, as shown in the Figure 2-15 .

    Figure 2-15 \u00a0 Space types used in algorithms

    The relevant code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class Node:\n    \"\"\"Classes\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x               # node value\n        self.next: Node | None = None   # reference to the next node\n\ndef function() -> int:\n    \"\"\"Functions\"\"\"\n    # Perform certain operations...\n    return 0\n\ndef algorithm(n) -> int:    # input data\n    A = 0                   # temporary data (constant, usually in uppercase)\n    b = 0                   # temporary data (variable)\n    node = Node(0)          # temporary data (object)\n    c = function()          # Stack frame space (call function)\n    return A + b + c        # output data\n
    /* Structures */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    const int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node* node = new Node(0);   // temporary data (object)\n    int c = func();             // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    final int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node node = new Node(0);    // temporary data (object)\n    int c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint Function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint Algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    Node node = new(0); // temporary data (object)\n    int c = Function(); // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
    /* Structures */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* Create node structure */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* Functions */\nfunc function() int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n int) int { // input data\n    const a = 0             // temporary data (constant)\n    b := 0                  // temporary storage of data (variable)\n    newNode(0)              // temporary data (object)\n    c := function()         // stack frame space (call function)\n    return a + b + c        // output data\n}\n
    /* Classes */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* Functions */\nfunc function() -> Int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // input data\n    let a = 0                   // temporary data (constant)\n    var b = 0                   // temporary data (variable)\n    let node = Node(x: 0)       // temporary data (object)\n    let c = function()          // stack frame space (call function)\n    return a + b + c            // output data\n}\n
    /* Classes */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc() {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n) {         // input data\n    const a = 0;                // temporary data (constant)\n    let b = 0;                  // temporary data (variable)\n    const node = new Node(0);   // temporary data (object)\n    const c = constFunc();      // Stack frame space (calling function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n: number): number { // input data\n    const a = 0;                        // temporary data (constant)\n    let b = 0;                          // temporary data (variable)\n    const node = new Node(0);           // temporary data (object)\n    const c = constFunc();              // Stack frame space (calling function)\n    return a + b + c;                   // output data\n}\n
    /* Classes */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* Functions */\nint function() {\n  // Perform certain operations...\n  return 0;\n}\n\nint algorithm(int n) {  // input data\n  const int a = 0;      // temporary data (constant)\n  int b = 0;            // temporary data (variable)\n  Node node = Node(0);  // temporary data (object)\n  int c = function();   // stack frame space (call function)\n  return a + b + c;     // output data\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Structures */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* Constructor */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* Functions */\nfn function() -> i32 {     \n    // Perform certain operations...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {   // input data\n    const a: i32 = 0;           // temporary data (constant)\n    let mut b = 0;              // temporary data (variable)\n    let node = Node::new(0);    // temporary data (object)\n    let c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    int c = func();     // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
    \n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242-calculation-method","title":"2.4.2 \u00a0 Calculation method","text":"

    The method for calculating space complexity is roughly similar to that of time complexity, with the only change being the shift of the statistical object from \"number of operations\" to \"size of used space\".

    However, unlike time complexity, we usually only focus on the worst-case space complexity. This is because memory space is a hard requirement, and we must ensure that there is enough memory space reserved under all input data.

    Consider the following code, the term \"worst-case\" in worst-case space complexity has two meanings.

    1. Based on the worst input data: When \\(n < 10\\), the space complexity is \\(O(1)\\); but when \\(n > 10\\), the initialized array nums occupies \\(O(n)\\) space, thus the worst-case space complexity is \\(O(n)\\).
    2. Based on the peak memory used during the algorithm's execution: For example, before executing the last line, the program occupies \\(O(1)\\) space; when initializing the array nums, the program occupies \\(O(n)\\) space, hence the worst-case space complexity is \\(O(n)\\).
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    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
    \n
    \n

    In recursive functions, stack frame space must be taken into count. Consider the following code:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def function() -> int:\n    # Perform certain operations\n    return 0\n\ndef loop(n: int):\n    \"\"\"Loop O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"Recursion O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* Recursion O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // Perform certain operations\n  return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    \n
    \n

    The time complexity of both loop() and recur() functions is \\(O(n)\\), but their space complexities differ.

    • The loop() function calls function() \\(n\\) times in a loop, where each iteration's function() returns and releases its stack frame space, so the space complexity remains \\(O(1)\\).
    • The recursive function recur() will have \\(n\\) instances of unreturned recur() existing simultaneously during its execution, thus occupying \\(O(n)\\) stack frame space.
    "},{"location":"chapter_computational_complexity/space_complexity/#243-common-types","title":"2.4.3 \u00a0 Common types","text":"

    Let the size of the input data be \\(n\\), the following chart displays common types of space complexities (arranged from low to high).

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Quadratic Order} < \\text{Exponential Order} \\end{aligned} \\]

    Figure 2-16 \u00a0 Common types of space complexity

    "},{"location":"chapter_computational_complexity/space_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

    Constant order is common in constants, variables, objects that are independent of the size of input data \\(n\\).

    Note that memory occupied by initializing variables or calling functions in a loop, which is released upon entering the next cycle, does not accumulate over space, thus the space complexity remains \\(O(1)\\):

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_computational_complexity/space_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

    Linear order is common in arrays, linked lists, stacks, queues, etc., where the number of elements is proportional to \\(n\\):

    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
    Code Visualization

    Full Screen >

    As shown below, this function's recursive depth is \\(n\\), meaning there are \\(n\\) instances of unreturned linear_recur() function, using \\(O(n)\\) size of stack frame space:

    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
    Code Visualization

    Full Screen >

    Figure 2-17 \u00a0 Recursive function generating linear order space complexity

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

    Quadratic order is common in matrices and graphs, where the number of elements is quadratic to \\(n\\):

    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
    Code Visualization

    Full Screen >

    As shown below, the recursive depth of this function is \\(n\\), and in each recursive call, an array is initialized with lengths \\(n\\), \\(n-1\\), \\(\\dots\\), \\(2\\), \\(1\\), averaging \\(n/2\\), thus overall occupying \\(O(n^2)\\) space:

    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
    Code Visualization

    Full Screen >

    Figure 2-18 \u00a0 Recursive function generating quadratic order space complexity

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

    Exponential order is common in binary trees. Observe the below image, a \"full binary tree\" with \\(n\\) levels has \\(2^n - 1\\) nodes, occupying \\(O(2^n)\\) space:

    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
    Code Visualization

    Full Screen >

    Figure 2-19 \u00a0 Full binary tree generating exponential order space complexity

    "},{"location":"chapter_computational_complexity/space_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

    Logarithmic order is common in divide-and-conquer algorithms. For example, in merge sort, an array of length \\(n\\) is recursively divided in half each round, forming a recursion tree of height \\(\\log n\\), using \\(O(\\log n)\\) stack frame space.

    Another example is converting a number to a string. Given a positive integer \\(n\\), its number of digits is \\(\\log_{10} n + 1\\), corresponding to the length of the string, thus the space complexity is \\(O(\\log_{10} n + 1) = O(\\log n)\\).

    "},{"location":"chapter_computational_complexity/space_complexity/#244-balancing-time-and-space","title":"2.4.4 \u00a0 Balancing time and space","text":"

    Ideally, we aim for both time complexity and space complexity to be optimal. However, in practice, optimizing both simultaneously is often difficult.

    Lowering time complexity usually comes at the cost of increased space complexity, and vice versa. The approach of sacrificing memory space to improve algorithm speed is known as \"space-time tradeoff\"; the reverse is known as \"time-space tradeoff\".

    The choice depends on which aspect we value more. In most cases, time is more precious than space, so \"space-time tradeoff\" is often the more common strategy. Of course, controlling space complexity is also very important when dealing with large volumes of data.

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 Summary","text":""},{"location":"chapter_computational_complexity/summary/#1-key-review","title":"1. \u00a0 Key review","text":"

    Algorithm Efficiency Assessment

    • Time efficiency and space efficiency are the two main criteria for assessing the merits of an algorithm.
    • We can assess algorithm efficiency through actual testing, but it's challenging to eliminate the influence of the test environment, and it consumes substantial computational resources.
    • Complexity analysis can overcome the disadvantages of actual testing. Its results are applicable across all operating platforms and can reveal the efficiency of algorithms at different data scales.

    Time Complexity

    • Time complexity measures the trend of an algorithm's running time with the increase in data volume, effectively assessing algorithm efficiency. However, it can fail in certain cases, such as with small input data volumes or when time complexities are the same, making it challenging to precisely compare the efficiency of algorithms.
    • Worst-case time complexity is denoted using big O notation, representing the asymptotic upper bound, reflecting the growth level of the number of operations \\(T(n)\\) as \\(n\\) approaches infinity.
    • Calculating time complexity involves two steps: first counting the number of operations, then determining the asymptotic upper bound.
    • Common time complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n \\log n)\\), \\(O(n^2)\\), \\(O(2^n)\\), and \\(O(n!)\\), among others.
    • The time complexity of some algorithms is not fixed and depends on the distribution of input data. Time complexities are divided into worst, best, and average cases. The best case is rarely used because input data generally needs to meet strict conditions to achieve the best case.
    • Average time complexity reflects the efficiency of an algorithm under random data inputs, closely resembling the algorithm's performance in actual applications. Calculating average time complexity requires accounting for the distribution of input data and the subsequent mathematical expectation.

    Space Complexity

    • Space complexity, similar to time complexity, measures the trend of memory space occupied by an algorithm with the increase in data volume.
    • The relevant memory space used during the algorithm's execution can be divided into input space, temporary space, and output space. Generally, input space is not included in space complexity calculations. Temporary space can be divided into temporary data, stack frame space, and instruction space, where stack frame space usually affects space complexity only in recursive functions.
    • We usually focus only on the worst-case space complexity, which means calculating the space complexity of the algorithm under the worst input data and at the worst moment of operation.
    • Common space complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n^2)\\), and \\(O(2^n)\\), among others.
    "},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the space complexity of tail recursion \\(O(1)\\)?

    Theoretically, the space complexity of a tail-recursive function can be optimized to \\(O(1)\\). However, most programming languages (such as Java, Python, C++, Go, C#) do not support automatic optimization of tail recursion, so it's generally considered to have a space complexity of \\(O(n)\\).

    Q: What is the difference between the terms \"function\" and \"method\"?

    A \"function\" can be executed independently, with all parameters passed explicitly. A \"method\" is associated with an object and is implicitly passed to the object calling it, able to operate on the data contained within an instance of a class.

    Here are some examples from common programming languages:

    • C is a procedural programming language without object-oriented concepts, so it only has functions. However, we can simulate object-oriented programming by creating structures (struct), and functions associated with these structures are equivalent to methods in other programming languages.
    • Java and C# are object-oriented programming languages where code blocks (methods) are typically part of a class. Static methods behave like functions because they are bound to the class and cannot access specific instance variables.
    • C++ and Python support both procedural programming (functions) and object-oriented programming (methods).

    Q: Does the \"Common Types of Space Complexity\" figure reflect the absolute size of occupied space?

    No, the figure shows space complexities, which reflect growth trends, not the absolute size of the occupied space.

    If you take \\(n = 8\\), you might find that the values of each curve don't correspond to their functions. This is because each curve includes a constant term, intended to compress the value range into a visually comfortable range.

    In practice, since we usually don't know the \"constant term\" complexity of each method, it's generally not possible to choose the best solution for \\(n = 8\\) based solely on complexity. However, for \\(n = 8^5\\), it's much easier to choose, as the growth trend becomes dominant.

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 Time complexity","text":"

    Time complexity is a concept used to measure how the run time of an algorithm increases with the size of the input data. Understanding time complexity is crucial for accurately assessing the efficiency of an algorithm.

    1. Determining the Running Platform: This includes hardware configuration, programming language, system environment, etc., all of which can affect the efficiency of code execution.
    2. Evaluating the Run Time for Various Computational Operations: For instance, an addition operation + might take 1 ns, a multiplication operation * might take 10 ns, a print operation print() might take 5 ns, etc.
    3. Counting All the Computational Operations in the Code: Summing the execution times of all these operations gives the total run time.

    For example, consider the following code with an input size of \\(n\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Under an operating platform\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # Cycle n times\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        System.out.println(0);     // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // Loop n times\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // Loop n times\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
    // Under a particular operating platform\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    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // Loop n times\n  for (int i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n    print(0); // 5 ns\n  }\n}\n
    // Under a particular operating platform\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // Loop n times\n    for _ in 0..n {     // 1 ns for each round i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // 1 ns , every round i++ is executed\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
    \n
    // Under a particular operating platform\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // Loop n times\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

    Using the above method, the run time of the algorithm can be calculated as \\((6n + 12)\\) ns:

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

    However, in practice, counting the run time of an algorithm is neither practical nor reasonable. First, we don't want to tie the estimated time to the running platform, as algorithms need to run on various platforms. Second, it's challenging to know the run time for each type of operation, making the estimation process difficult.

    "},{"location":"chapter_computational_complexity/time_complexity/#231-assessing-time-growth-trend","title":"2.3.1 \u00a0 Assessing time growth trend","text":"

    Time complexity analysis does not count the algorithm's run time, but rather the growth trend of the run time as the data volume increases.

    Let's understand this concept of \"time growth trend\" with an example. Assume the input data size is \\(n\\), and consider three algorithms A, B, and C:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Time complexity of algorithm A: constant order\ndef algorithm_A(n: int):\n    print(0)\n# Time complexity of algorithm B: linear order\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# Time complexity of algorithm C: constant order\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// Time complexity of algorithm B: linear order\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// Time complexity of algorithm B: linear order\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// Time complexity of algorithm C: constant order\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// Time complexity of algorithm B: linear order\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// Time complexity of algorithm C: constant order\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithmA(int n) {\n  print(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
    // Time complexity of algorithm A: constant order\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
    \n
    // Time complexity of algorithm A: constant order\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

    The following figure shows the time complexities of these three algorithms.

    • Algorithm A has just one print operation, and its run time does not grow with \\(n\\). Its time complexity is considered \"constant order.\"
    • Algorithm B involves a print operation looping \\(n\\) times, and its run time grows linearly with \\(n\\). Its time complexity is \"linear order.\"
    • Algorithm C has a print operation looping 1,000,000 times. Although it takes a long time, it is independent of the input data size \\(n\\). Therefore, the time complexity of C is the same as A, which is \"constant order.\"

    Figure 2-7 \u00a0 Time growth trend of algorithms a, b, and c

    Compared to directly counting the run time of an algorithm, what are the characteristics of time complexity analysis?

    • Time complexity effectively assesses algorithm efficiency. For instance, algorithm B has linearly growing run time, which is slower than algorithm A when \\(n > 1\\) and slower than C when \\(n > 1,000,000\\). In fact, as long as the input data size \\(n\\) is sufficiently large, a \"constant order\" complexity algorithm will always be better than a \"linear order\" one, demonstrating the essence of time growth trend.
    • Time complexity analysis is more straightforward. Obviously, the running platform and the types of computational operations are irrelevant to the trend of run time growth. Therefore, in time complexity analysis, we can simply treat the execution time of all computational operations as the same \"unit time,\" simplifying the \"computational operation run time count\" to a \"computational operation count.\" This significantly reduces the complexity of estimation.
    • Time complexity has its limitations. For example, although algorithms A and C have the same time complexity, their actual run times can be quite different. Similarly, even though algorithm B has a higher time complexity than C, it is clearly superior when the input data size \\(n\\) is small. In these cases, it's difficult to judge the efficiency of algorithms based solely on time complexity. Nonetheless, despite these issues, complexity analysis remains the most effective and commonly used method for evaluating algorithm efficiency.
    "},{"location":"chapter_computational_complexity/time_complexity/#232-asymptotic-upper-bound","title":"2.3.2 \u00a0 Asymptotic upper bound","text":"

    Consider a function with an input size of \\(n\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # Cycle n times\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    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\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    // Loop n times\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    // Loop n times\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    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\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    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\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  // Loop n times\n  for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for _ in 0..n { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        printf(\"%d\", 0);            // +1\n    }\n} \n
    \n
    fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for (0..n) |_| { // +1 (execute i ++ every round)\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    Given a function that represents the number of operations of an algorithm as a function of the input size \\(n\\), denoted as \\(T(n)\\), consider the following example:

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

    Since \\(T(n)\\) is a linear function, its growth trend is linear, and therefore, its time complexity is of linear order, denoted as \\(O(n)\\). This mathematical notation, known as \"big-O notation,\" represents the \"asymptotic upper bound\" of the function \\(T(n)\\).

    In essence, time complexity analysis is about finding the asymptotic upper bound of the \"number of operations \\(T(n)\\)\". It has a precise mathematical definition.

    Asymptotic Upper Bound

    If there exist positive real numbers \\(c\\) and \\(n_0\\) such that for all \\(n > n_0\\), \\(T(n) \\leq c \\cdot f(n)\\), then \\(f(n)\\) is considered an asymptotic upper bound of \\(T(n)\\), denoted as \\(T(n) = O(f(n))\\).

    As illustrated below, calculating the asymptotic upper bound involves finding a function \\(f(n)\\) such that, as \\(n\\) approaches infinity, \\(T(n)\\) and \\(f(n)\\) have the same growth order, differing only by a constant factor \\(c\\).

    Figure 2-8 \u00a0 Asymptotic upper bound of a function

    "},{"location":"chapter_computational_complexity/time_complexity/#233-calculation-method","title":"2.3.3 \u00a0 Calculation method","text":"

    While the concept of asymptotic upper bound might seem mathematically dense, you don't need to fully grasp it right away. Let's first understand the method of calculation, which can be practiced and comprehended over time.

    Once \\(f(n)\\) is determined, we obtain the time complexity \\(O(f(n))\\). But how do we determine the asymptotic upper bound \\(f(n)\\)? This process generally involves two steps: counting the number of operations and determining the asymptotic upper bound.

    "},{"location":"chapter_computational_complexity/time_complexity/#1-step-1-counting-the-number-of-operations","title":"1. \u00a0 Step 1: counting the number of operations","text":"

    This step involves going through the code line by line. However, due to the presence of the constant \\(c\\) in \\(c \\cdot f(n)\\), all coefficients and constant terms in \\(T(n)\\) can be ignored. This principle allows for simplification techniques in counting operations.

    1. Ignore constant terms in \\(T(n)\\), as they do not affect the time complexity being independent of \\(n\\).
    2. Omit all coefficients. For example, looping \\(2n\\), \\(5n + 1\\) times, etc., can be simplified to \\(n\\) times since the coefficient before \\(n\\) does not impact the time complexity.
    3. Use multiplication for nested loops. The total number of operations equals the product of the number of operations in each loop, applying the simplification techniques from points 1 and 2 for each loop level.

    Given a function, we can use these techniques to count operations:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def algorithm(n: int):\n    a = 1      # +0 (trick 1)\n    a = a + n  # +0 (trick 1)\n    # +n (technique 2)\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n  // +0 (trick 1)\n    // +n (technique 2)\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n // +0 (trick 1)\n    // +n (technique 2)\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n  a = a + n; // +0 (trick 1)\n  // +n (technique 2)\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n (technique 3)\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 (trick 1)\n    a = a + n;        // +0 (trick 1)\n\n    // +n (technique 2)\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n (technique 3)\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
    \n
    fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0 (trick 1)\n    a = a + @as(i32, @intCast(n));        // +0 (trick 1)\n\n    // +n (technique 2)\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n (technique 3)\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

    The formula below shows the counting results before and after simplification, both leading to a time complexity of \\(O(n^2)\\):

    \\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{Complete Count (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{Simplified Count (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2-step-2-determining-the-asymptotic-upper-bound","title":"2. \u00a0 Step 2: determining the asymptotic upper bound","text":"

    The time complexity is determined by the highest order term in \\(T(n)\\). This is because, as \\(n\\) approaches infinity, the highest order term dominates, rendering the influence of other terms negligible.

    The following table illustrates examples of different operation counts and their corresponding time complexities. Some exaggerated values are used to emphasize that coefficients cannot alter the order of growth. When \\(n\\) becomes very large, these constants become insignificant.

    Table: Time complexity for different operation counts

    Operation Count \\(T(n)\\) Time Complexity \\(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-common-types-of-time-complexity","title":"2.3.4 \u00a0 Common types of time complexity","text":"

    Let's consider the input data size as \\(n\\). The common types of time complexities are illustrated below, arranged from lowest to highest:

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Linear-Logarithmic Order} < \\text{Quadratic Order} < \\text{Exponential Order} < \\text{Factorial Order} \\end{aligned} \\]

    Figure 2-9 \u00a0 Common types of time complexity

    "},{"location":"chapter_computational_complexity/time_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

    Constant order means the number of operations is independent of the input data size \\(n\\). In the following function, although the number of operations size might be large, the time complexity remains \\(O(1)\\) as it's unrelated to \\(n\\):

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_computational_complexity/time_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

    Linear order indicates the number of operations grows linearly with the input data size \\(n\\). Linear order commonly appears in single-loop structures:

    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
    Code Visualization

    Full Screen >

    Operations like array traversal and linked list traversal have a time complexity of \\(O(n)\\), where \\(n\\) is the length of the array or list:

    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
    Code Visualization

    Full Screen >

    It's important to note that the input data size \\(n\\) should be determined based on the type of input data. For example, in the first example, \\(n\\) represents the input data size, while in the second example, the length of the array \\(n\\) is the data size.

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

    Quadratic order means the number of operations grows quadratically with the input data size \\(n\\). Quadratic order typically appears in nested loops, where both the outer and inner loops have a time complexity of \\(O(n)\\), resulting in an overall complexity of \\(O(n^2)\\):

    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
    Code Visualization

    Full Screen >

    The following image compares constant order, linear order, and quadratic order time complexities.

    Figure 2-10 \u00a0 Constant, linear, and quadratic order time complexities

    For instance, in bubble sort, the outer loop runs \\(n - 1\\) times, and the inner loop runs \\(n-1\\), \\(n-2\\), ..., \\(2\\), \\(1\\) times, averaging \\(n / 2\\) times, resulting in a time complexity of \\(O((n - 1) n / 2) = O(n^2)\\):

    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
    Code Visualization

    Full Screen >

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

    Biological \"cell division\" is a classic example of exponential order growth: starting with one cell, it becomes two after one division, four after two divisions, and so on, resulting in \\(2^n\\) cells after \\(n\\) divisions.

    The following image and code simulate the cell division process, with a time complexity of \\(O(2^n)\\):

    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
    Code Visualization

    Full Screen >

    Figure 2-11 \u00a0 Exponential order time complexity

    In practice, exponential order often appears in recursive functions. For example, in the code below, it recursively splits into two halves, stopping after \\(n\\) divisions:

    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
    Code Visualization

    Full Screen >

    Exponential order growth is extremely rapid and is commonly seen in exhaustive search methods (brute force, backtracking, etc.). For large-scale problems, exponential order is unacceptable, often requiring dynamic programming or greedy algorithms as solutions.

    "},{"location":"chapter_computational_complexity/time_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

    In contrast to exponential order, logarithmic order reflects situations where \"the size is halved each round.\" Given an input data size \\(n\\), since the size is halved each round, the number of iterations is \\(\\log_2 n\\), the inverse function of \\(2^n\\).

    The following image and code simulate the \"halving each round\" process, with a time complexity of \\(O(\\log_2 n)\\), commonly abbreviated as \\(O(\\log n)\\):

    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
    Code Visualization

    Full Screen >

    Figure 2-12 \u00a0 Logarithmic order time complexity

    Like exponential order, logarithmic order also frequently appears in recursive functions. The code below forms a recursive tree of height \\(\\log_2 n\\):

    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
    Code Visualization

    Full Screen >

    Logarithmic order is typical in algorithms based on the divide-and-conquer strategy, embodying the \"split into many\" and \"simplify complex problems\" approach. It's slow-growing and is the most ideal time complexity after constant order.

    What is the base of \\(O(\\log n)\\)?

    Technically, \"splitting into \\(m\\)\" corresponds to a time complexity of \\(O(\\log_m n)\\). Using the logarithm base change formula, we can equate different logarithmic complexities:

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

    This means the base \\(m\\) can be changed without affecting the complexity. Therefore, we often omit the base \\(m\\) and simply denote logarithmic order as \\(O(\\log n)\\).

    "},{"location":"chapter_computational_complexity/time_complexity/#6-linear-logarithmic-order-on-log-n","title":"6. \u00a0 Linear-logarithmic order \\(O(n \\log n)\\)","text":"

    Linear-logarithmic order often appears in nested loops, with the complexities of the two loops being \\(O(\\log n)\\) and \\(O(n)\\) respectively. The related code is as follows:

    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    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\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
    Code Visualization

    Full Screen >

    The image below demonstrates how linear-logarithmic order is generated. Each level of a binary tree has \\(n\\) operations, and the tree has \\(\\log_2 n + 1\\) levels, resulting in a time complexity of \\(O(n \\log n)\\).

    Figure 2-13 \u00a0 Linear-logarithmic order time complexity

    Mainstream sorting algorithms typically have a time complexity of \\(O(n \\log n)\\), such as quicksort, mergesort, and heapsort.

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

    Factorial order corresponds to the mathematical problem of \"full permutation.\" Given \\(n\\) distinct elements, the total number of possible permutations is:

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

    Factorials are typically implemented using recursion. As shown in the image and code below, the first level splits into \\(n\\) branches, the second level into \\(n - 1\\) branches, and so on, stopping after the \\(n\\)th level:

    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
    Code Visualization

    Full Screen >

    Figure 2-14 \u00a0 Factorial order time complexity

    Note that factorial order grows even faster than exponential order; it's unacceptable for larger \\(n\\) values.

    "},{"location":"chapter_computational_complexity/time_complexity/#235-worst-best-and-average-time-complexities","title":"2.3.5 \u00a0 Worst, best, and average time complexities","text":"

    The time efficiency of an algorithm is often not fixed but depends on the distribution of the input data. Assume we have an array nums of length \\(n\\), consisting of numbers from \\(1\\) to \\(n\\), each appearing only once, but in a randomly shuffled order. The task is to return the index of the element \\(1\\). We can draw the following conclusions:

    • When nums = [?, ?, ..., 1], that is, when the last element is \\(1\\), it requires a complete traversal of the array, achieving the worst-case time complexity of \\(O(n)\\).
    • When nums = [1, ?, ?, ...], that is, when the first element is \\(1\\), no matter the length of the array, no further traversal is needed, achieving the best-case time complexity of \\(\\Omega(1)\\).

    The \"worst-case time complexity\" corresponds to the asymptotic upper bound, denoted by the big \\(O\\) notation. Correspondingly, the \"best-case time complexity\" corresponds to the asymptotic lower bound, denoted by \\(\\Omega\\):

    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
    Code Visualization

    Full Screen >

    It's important to note that the best-case time complexity is rarely used in practice, as it is usually only achievable under very low probabilities and might be misleading. The worst-case time complexity is more practical as it provides a safety value for efficiency, allowing us to confidently use the algorithm.

    From the above example, it's clear that both the worst-case and best-case time complexities only occur under \"special data distributions,\" which may have a small probability of occurrence and may not accurately reflect the algorithm's run efficiency. In contrast, the average time complexity can reflect the algorithm's efficiency under random input data, denoted by the \\(\\Theta\\) notation.

    For some algorithms, we can simply estimate the average case under a random data distribution. For example, in the aforementioned example, since the input array is shuffled, the probability of element \\(1\\) appearing at any index is equal. Therefore, the average number of loops for the algorithm is half the length of the array \\(n / 2\\), giving an average time complexity of \\(\\Theta(n / 2) = \\Theta(n)\\).

    However, calculating the average time complexity for more complex algorithms can be quite difficult, as it's challenging to analyze the overall mathematical expectation under the data distribution. In such cases, we usually use the worst-case time complexity as the standard for judging the efficiency of the algorithm.

    Why is the \\(\\Theta\\) symbol rarely seen?

    Possibly because the \\(O\\) notation is more commonly spoken, it is often used to represent the average time complexity. However, strictly speaking, this practice is not accurate. In this book and other materials, if you encounter statements like \"average time complexity \\(O(n)\\)\", please understand it directly as \\(\\Theta(n)\\).

    "},{"location":"chapter_data_structure/","title":"Chapter 3. \u00a0 Data structures","text":"

    Abstract

    Data structures serve as a robust and diverse framework.

    They offer a blueprint for the orderly organization of data, upon which algorithms come to life.

    "},{"location":"chapter_data_structure/#chapter-contents","title":"Chapter contents","text":"
    • 3.1 \u00a0 Classification of data structures
    • 3.2 \u00a0 Basic data types
    • 3.3 \u00a0 Number encoding *
    • 3.4 \u00a0 Character encoding *
    • 3.5 \u00a0 Summary
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 Basic data types","text":"

    When discussing data in computers, various forms like text, images, videos, voice and 3D models comes to mind. Despite their different organizational forms, they are all composed of various basic data types.

    Basic data types are those that the CPU can directly operate on and are directly used in algorithms, mainly including the following.

    • Integer types: byte, short, int, long.
    • Floating-point types: float, double, used to represent decimals.
    • Character type: char, used to represent letters, punctuation, and even emojis in various languages.
    • Boolean type: bool, used to represent \"yes\" or \"no\" decisions.

    Basic data types are stored in computers in binary form. One binary digit is 1 bit. In most modern operating systems, 1 byte consists of 8 bits.

    The range of values for basic data types depends on the size of the space they occupy. Below, we take Java as an example.

    • The integer type byte occupies 1 byte = 8 bits and can represent \\(2^8\\) numbers.
    • The integer type int occupies 4 bytes = 32 bits and can represent \\(2^{32}\\) numbers.

    The following table lists the space occupied, value range, and default values of various basic data types in Java. While memorizing this table isn't necessary, having a general understanding of it and referencing it when required is recommended.

    Table 3-1 \u00a0 Space occupied and value range of basic data types

    Type Symbol Space Occupied Minimum Value Maximum Value Default Value Integer byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) 0 short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) 0 int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) 0 long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) 0 Float float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) 0.0 Char char 2 bytes 0 \\(2^{16} - 1\\) 0 Boolean bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    Please note that the above table is specific to Java's basic data types. Every programming language has its own data type definitions, which might differ in space occupied, value ranges, and default values.

    • In Python, the integer type int can be of any size, limited only by available memory; the floating-point float is double precision 64-bit; there is no char type, as a single character is actually a string str of length 1.
    • C and C++ do not specify the size of basic data types, it varies with implementation and platform. The above table follows the LP64 data model, used for Unix 64-bit operating systems including Linux and macOS.
    • The size of char in C and C++ is 1 byte, while in most programming languages, it depends on the specific character encoding method, as detailed in the \"Character Encoding\" chapter.
    • Even though representing a boolean only requires 1 bit (0 or 1), it is usually stored in memory as 1 byte. This is because modern computer CPUs typically use 1 byte as the smallest addressable memory unit.

    So, what is the connection between basic data types and data structures? We know that data structures are ways to organize and store data in computers. The focus here is on \"structure\" rather than \"data\".

    If we want to represent \"a row of numbers\", we naturally think of using an array. This is because the linear structure of an array can represent the adjacency and the ordering of the numbers, but whether the stored content is an integer int, a decimal float, or a character char, is irrelevant to the \"data structure\".

    In other words, basic data types provide the \"content type\" of data, while data structures provide the \"way of organizing\" data. For example, in the following code, we use the same data structure (array) to store and represent different basic data types, including int, float, char, bool, etc.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Using various basic data types to initialize arrays\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python's characters are actually strings of length 1\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python's lists can freely store various basic data types and object references\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // Using various basic data types to initialize arrays\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // Using various basic data types to initialize arrays\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // Using various basic data types to initialize arrays\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's arrays can freely store various basic data types and objects\nconst array = [0, 0.0, 'a', false];\n
    // Using various basic data types to initialize arrays\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // Using various basic data types to initialize arrays\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
    // Using various basic data types to initialize arrays\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
    // Using various basic data types to initialize arrays\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    \n
    // Using various basic data types to initialize arrays\nvar numbers: [5]i32 = undefined;\nvar decimals: [5]f32 = undefined;\nvar characters: [5]u8 = undefined;\nvar bools: [5]bool = undefined;\n
    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 Character encoding *","text":"

    In the computer system, all data is stored in binary form, and characters (represented by char) are no exception. To represent characters, we need to develop a \"character set\" that defines a one-to-one mapping between each character and binary numbers. With the character set, computers can convert binary numbers to characters by looking up the table.

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii-character-set","title":"3.4.1 \u00a0 ASCII character set","text":"

    The \"ASCII code\" is one of the earliest character sets, officially known as the American Standard Code for Information Interchange. It uses 7 binary digits (the lower 7 bits of a byte) to represent a character, allowing for a maximum of 128 different characters. As shown in the Figure 3-6 , ASCII includes uppercase and lowercase English letters, numbers 0 ~ 9, various punctuation marks, and certain control characters (such as newline and tab).

    Figure 3-6 \u00a0 ASCII code

    However, ASCII can only represent English characters. With the globalization of computers, a character set called \"EASCII\" was developed to represent more languages. It expands from the 7-bit structure of ASCII to 8 bits, enabling the representation of 256 characters.

    Globally, various region-specific EASCII character sets have been introduced. The first 128 characters of these sets are consistent with the ASCII, while the remaining 128 characters are defined differently to accommodate the requirements of different languages.

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk-character-set","title":"3.4.2 \u00a0 GBK character set","text":"

    Later, it was found that EASCII still could not meet the character requirements of many languages. For instance, there are nearly a hundred thousand Chinese characters, with several thousand used regularly. In 1980, the Standardization Administration of China released the \"GB2312\" character set, which included 6763 Chinese characters, essentially fulfilling the computer processing needs for the Chinese language.

    However, GB2312 could not handle some rare and traditional characters. The \"GBK\" character set expands GB2312 and includes 21886 Chinese characters. In the GBK encoding scheme, ASCII characters are represented with one byte, while Chinese characters use two bytes.

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode-character-set","title":"3.4.3 \u00a0 Unicode character set","text":"

    With the rapid evolution of computer technology and a plethora of character sets and encoding standards, numerous problems arose. On the one hand, these character sets generally only defined characters for specific languages and could not function properly in multilingual environments. On the other hand, the existence of multiple character set standards for the same language caused garbled text when information was exchanged between computers using different encoding standards.

    Researchers of that era thought: What if a comprehensive character set encompassing all global languages and symbols was developed? Wouldn't this resolve the issues associated with cross-linguistic environments and garbled text? Inspired by this idea, the extensive character set, Unicode, was born.

    \"Unicode\" is referred to as \"\u7edf\u4e00\u7801\" (Unified Code) in Chinese, theoretically capable of accommodating over a million characters. It aims to incorporate characters from all over the world into a single set, providing a universal character set for processing and displaying various languages and reducing the issues of garbled text due to different encoding standards.

    Since its release in 1991, Unicode has continually expanded to include new languages and characters. As of September 2022, Unicode contains 149,186 characters, including characters, symbols, and even emojis from various languages. In the vast Unicode character set, commonly used characters occupy 2 bytes, while some rare characters may occupy 3 or even 4 bytes.

    Unicode is a universal character set that assigns a number (called a \"code point\") to each character, but it does not specify how these character code points should be stored in a computer system. One might ask: How does a system interpret Unicode code points of varying lengths within a text? For example, given a 2-byte code, how does the system determine if it represents a single 2-byte character or two 1-byte characters?

    A straightforward solution to this problem is to store all characters as equal-length encodings. As shown in the Figure 3-7 , each character in \"Hello\" occupies 1 byte, while each character in \"\u7b97\u6cd5\" (algorithm) occupies 2 bytes. We could encode all characters in \"Hello \u7b97\u6cd5\" as 2 bytes by padding the higher bits with zeros. This method would enable the system to interpret a character every 2 bytes, recovering the content of the phrase.

    Figure 3-7 \u00a0 Unicode encoding example

    However, as ASCII has shown us, encoding English only requires 1 byte. Using the above approach would double the space occupied by English text compared to ASCII encoding, which is a waste of memory space. Therefore, a more efficient Unicode encoding method is needed.

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

    Currently, UTF-8 has become the most widely used Unicode encoding method internationally. It is a variable-length encoding, using 1 to 4 bytes to represent a character, depending on the complexity of the character. ASCII characters need only 1 byte, Latin and Greek letters require 2 bytes, commonly used Chinese characters need 3 bytes, and some other rare characters need 4 bytes.

    The encoding rules for UTF-8 are not complex and can be divided into two cases:

    • For 1-byte characters, set the highest bit to \\(0\\), and the remaining 7 bits to the Unicode code point. Notably, ASCII characters occupy the first 128 code points in the Unicode set. This means that UTF-8 encoding is backward compatible with ASCII. This implies that UTF-8 can be used to parse ancient ASCII text.
    • For characters of length \\(n\\) bytes (where \\(n > 1\\)), set the highest \\(n\\) bits of the first byte to \\(1\\), and the \\((n + 1)^{\\text{th}}\\) bit to \\(0\\); starting from the second byte, set the highest 2 bits of each byte to \\(10\\); the rest of the bits are used to fill the Unicode code point.

    The Figure 3-8 shows the UTF-8 encoding for \"Hello\u7b97\u6cd5\". It can be observed that since the highest \\(n\\) bits are set to \\(1\\), the system can determine the length of the character as \\(n\\) by counting the number of highest bits set to \\(1\\).

    But why set the highest 2 bits of the remaining bytes to \\(10\\)? Actually, this \\(10\\) serves as a kind of checksum. If the system starts parsing text from an incorrect byte, the \\(10\\) at the beginning of the byte can help the system quickly detect anomalies.

    The reason for using \\(10\\) as a checksum is that, under UTF-8 encoding rules, it's impossible for the highest two bits of a character to be \\(10\\). This can be proven by contradiction: If the highest two bits of a character are \\(10\\), it indicates that the character's length is \\(1\\), corresponding to ASCII. However, the highest bit of an ASCII character should be \\(0\\), which contradicts the assumption.

    Figure 3-8 \u00a0 UTF-8 encoding example

    Apart from UTF-8, other common encoding methods include:

    • UTF-16 encoding: Uses 2 or 4 bytes to represent a character. All ASCII characters and commonly used non-English characters are represented with 2 bytes; a few characters require 4 bytes. For 2-byte characters, the UTF-16 encoding equals the Unicode code point.
    • UTF-32 encoding: Every character uses 4 bytes. This means UTF-32 occupies more space than UTF-8 and UTF-16, especially for texts with a high proportion of ASCII characters.

    From the perspective of storage space, using UTF-8 to represent English characters is very efficient because it only requires 1 byte; using UTF-16 to encode some non-English characters (such as Chinese) can be more efficient because it only requires 2 bytes, while UTF-8 might need 3 bytes.

    From a compatibility perspective, UTF-8 is the most versatile, with many tools and libraries supporting UTF-8 as a priority.

    "},{"location":"chapter_data_structure/character_encoding/#345-character-encoding-in-programming-languages","title":"3.4.5 \u00a0 Character encoding in programming languages","text":"

    Historically, many programming languages utilized fixed-length encodings such as UTF-16 or UTF-32 for processing strings during program execution. This allows strings to be handled as arrays, offering several advantages:

    • Random access: Strings encoded in UTF-16 can be accessed randomly with ease. For UTF-8, which is a variable-length encoding, locating the \\(i^{th}\\) character requires traversing the string from the start to the \\(i^{th}\\) position, taking \\(O(n)\\) time.
    • Character counting: Similar to random access, counting the number of characters in a UTF-16 encoded string is an \\(O(1)\\) operation. However, counting characters in a UTF-8 encoded string requires traversing the entire string.
    • String operations: Many string operations like splitting, concatenating, inserting, and deleting are easier on UTF-16 encoded strings. These operations generally require additional computation on UTF-8 encoded strings to ensure the validity of the UTF-8 encoding.

    The design of character encoding schemes in programming languages is an interesting topic involving various factors:

    • Java\u2019s String type uses UTF-16 encoding, with each character occupying 2 bytes. This was based on the initial belief that 16 bits were sufficient to represent all possible characters and proven incorrect later. As the Unicode standard expanded beyond 16 bits, characters in Java may now be represented by a pair of 16-bit values, known as \u201csurrogate pairs.\u201d
    • JavaScript and TypeScript use UTF-16 encoding for similar reasons as Java. When JavaScript was first introduced by Netscape in 1995, Unicode was still in its early stages, and 16-bit encoding was sufficient to represent all Unicode characters.
    • C# uses UTF-16 encoding, largely because the .NET platform, designed by Microsoft, and many Microsoft technologies, including the Windows operating system, extensively use UTF-16 encoding.

    Due to the underestimation of character counts, these languages had to use \"surrogate pairs\" to represent Unicode characters exceeding 16 bits. This approach has its drawbacks: strings containing surrogate pairs may have characters occupying 2 or 4 bytes, losing the advantage of fixed-length encoding. Additionally, handling surrogate pairs adds complexity and debugging difficulty to programming.

    Addressing these challenges, some languages have adopted alternative encoding strategies:

    • Python\u2019s str type uses Unicode encoding with a flexible representation where the storage length of characters depends on the largest Unicode code point in the string. If all characters are ASCII, each character occupies 1 byte, 2 bytes for characters within the Basic Multilingual Plane (BMP), and 4 bytes for characters beyond the BMP.
    • Go\u2019s string type internally uses UTF-8 encoding. Go also provides the rune type for representing individual Unicode code points.
    • Rust\u2019s str and String types use UTF-8 encoding internally. Rust also offers the char type for individual Unicode code points.

    It\u2019s important to note that the above discussion pertains to how strings are stored in programming languages, which is different from how strings are stored in files or transmitted over networks. For file storage or network transmission, strings are usually encoded in UTF-8 format for optimal compatibility and space efficiency.

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 Classification of data structures","text":"

    Common data structures include arrays, linked lists, stacks, queues, hash tables, trees, heaps, and graphs. They can be classified into \"logical structure\" and \"physical structure\".

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311-logical-structure-linear-and-non-linear","title":"3.1.1 \u00a0 Logical structure: linear and non-linear","text":"

    The logical structures reveal the logical relationships between data elements. In arrays and linked lists, data are arranged in a specific sequence, demonstrating the linear relationship between data; while in trees, data are arranged hierarchically from the top down, showing the derived relationship between \"ancestors\" and \"descendants\"; and graphs are composed of nodes and edges, reflecting the intricate network relationship.

    As shown in the Figure 3-1 , logical structures can be divided into two major categories: \"linear\" and \"non-linear\". Linear structures are more intuitive, indicating data is arranged linearly in logical relationships; non-linear structures, conversely, are arranged non-linearly.

    • Linear data structures: Arrays, Linked Lists, Stacks, Queues, Hash Tables.
    • Non-linear data structures: Trees, Heaps, Graphs, Hash Tables.

    Figure 3-1 \u00a0 Linear and non-linear data structures

    Non-linear data structures can be further divided into tree structures and network structures.

    • Linear structures: Arrays, linked lists, queues, stacks, and hash tables, where elements have a one-to-one sequential relationship.
    • Tree structures: Trees, Heaps, Hash Tables, where elements have a one-to-many relationship.
    • Network structures: Graphs, where elements have a many-to-many relationships.
    "},{"location":"chapter_data_structure/classification_of_data_structure/#312-physical-structure-contiguous-and-dispersed","title":"3.1.2 \u00a0 Physical structure: contiguous and dispersed","text":"

    During the execution of an algorithm, the data being processed is stored in memory. The Figure 3-2 shows a computer memory stick where each black square is a physical memory space. We can think of memory as a vast Excel spreadsheet, with each cell capable of storing a certain amount of data.

    The system accesses the data at the target location by means of a memory address. As shown in the Figure 3-2 , the computer assigns a unique identifier to each cell in the table according to specific rules, ensuring that each memory space has a unique memory address. With these addresses, the program can access the data stored in memory.

    Figure 3-2 \u00a0 Memory stick, memory spaces, memory addresses

    Tip

    It's worth noting that comparing memory to an Excel spreadsheet is a simplified analogy. The actual working mechanism of memory is more complex, involving concepts like address space, memory management, cache mechanisms, virtual memory, and physical memory.

    Memory is a shared resource for all programs. When a block of memory is occupied by one program, it cannot be simultaneously used by other programs. Therefore, considering memory resources is crucial in designing data structures and algorithms. For instance, the algorithm's peak memory usage should not exceed the remaining free memory of the system; if there is a lack of contiguous memory blocks, then the data structure chosen must be able to be stored in non-contiguous memory blocks.

    As illustrated in the Figure 3-3 , the physical structure reflects the way data is stored in computer memory and it can be divided into contiguous space storage (arrays) and non-contiguous space storage (linked lists). The two types of physical structures exhibit complementary characteristics in terms of time efficiency and space efficiency.

    Figure 3-3 \u00a0 Contiguous space storage and dispersed space storage

    It is worth noting that all data structures are implemented based on arrays, linked lists, or a combination of both. For example, stacks and queues can be implemented using either arrays or linked lists; while implementations of hash tables may involve both arrays and linked lists. - Array-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, Matrices, Tensors (arrays with dimensions \\(\\geq 3\\)). - Linked-list-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, etc.

    Data structures implemented based on arrays are also called \u201cStatic Data Structures,\u201d meaning their length cannot be changed after initialization. Conversely, those based on linked lists are called \u201cDynamic Data Structures,\u201d which can still adjust their size during program execution.

    Tip

    If you find it challenging to comprehend the physical structure, it is recommended that you read the next chapter, \"Arrays and Linked Lists,\" and revisit this section later.

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 Number encoding *","text":"

    Note

    In this book, chapters marked with an asterisk '*' are optional readings. If you are short on time or find them challenging, you may skip these initially and return to them after completing the essential chapters.

    "},{"location":"chapter_data_structure/number_encoding/#331-integer-encoding","title":"3.3.1 \u00a0 Integer encoding","text":"

    In the table from the previous section, we observed that all integer types can represent one more negative number than positive numbers, such as the byte range of \\([-128, 127]\\). This phenomenon seems counterintuitive, and its underlying reason involves knowledge of sign-magnitude, one's complement, and two's complement encoding.

    Firstly, it's important to note that numbers are stored in computers using the two's complement form. Before analyzing why this is the case, let's define these three encoding methods:

    • Sign-magnitude: The highest bit of a binary representation of a number is considered the sign bit, where \\(0\\) represents a positive number and \\(1\\) represents a negative number. The remaining bits represent the value of the number.
    • One's complement: The one's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by inverting all bits except the sign bit.
    • Two's complement: The two's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by adding \\(1\\) to their one's complement.

    The following diagram illustrates the conversions among sign-magnitude, one's complement, and two's complement:

    Figure 3-4 \u00a0 Conversions between sign-magnitude, one's complement, and two's complement

    Although sign-magnitude is the most intuitive, it has limitations. For one, negative numbers in sign-magnitude cannot be directly used in calculations. For example, in sign-magnitude, calculating \\(1 + (-2)\\) results in \\(-3\\), which is incorrect.

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

    To address this, computers introduced the one's complement. If we convert to one's complement and calculate \\(1 + (-2)\\), then convert the result back to sign-magnitude, we get the correct result of \\(-1\\).

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(Sign-magnitude)} + 1000 \\; 0010 \\; \\text{(Sign-magnitude)} \\newline & = 0000 \\; 0001 \\; \\text{(One's complement)} + 1111 \\; 1101 \\; \\text{(One's complement)} \\newline & = 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & \\rightarrow -1 \\end{aligned} \\]

    Additionally, there are two representations of zero in sign-magnitude: \\(+0\\) and \\(-0\\). This means two different binary encodings for zero, which could lead to ambiguity. For example, in conditional checks, not differentiating between positive and negative zero might result in incorrect outcomes. Addressing this ambiguity would require additional checks, potentially reducing computational efficiency.

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

    Like sign-magnitude, one's complement also suffers from the positive and negative zero ambiguity. Therefore, computers further introduced the two's complement. Let's observe the conversion process for negative zero in sign-magnitude, one's complement, and two's complement:

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(Sign-magnitude)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(One's complement)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(Two's complement)} \\newline \\end{aligned} \\]

    Adding \\(1\\) to the one's complement of negative zero produces a carry, but with byte length being only 8 bits, the carried-over \\(1\\) to the 9th bit is discarded. Therefore, the two's complement of negative zero is \\(0000 \\; 0000\\), the same as positive zero, thus resolving the ambiguity.

    One last puzzle is the \\([-128, 127]\\) range for byte, with an additional negative number, \\(-128\\). We observe that for the interval \\([-127, +127]\\), all integers have corresponding sign-magnitude, one's complement, and two's complement, allowing for mutual conversion between them.

    However, the two's complement \\(1000 \\; 0000\\) is an exception without a corresponding sign-magnitude. According to the conversion method, its sign-magnitude would be \\(0000 \\; 0000\\), indicating zero. This presents a contradiction because its two's complement should represent itself. Computers designate this special two's complement \\(1000 \\; 0000\\) as representing \\(-128\\). In fact, the calculation of \\((-1) + (-127)\\) in two's complement results in \\(-128\\).

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(Sign-magnitude)} + 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & = 1000 \\; 0000 \\; \\text{(One's complement)} + 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Two's complement)} + 1111 \\; 1111 \\; \\text{(Two's complement)} \\newline & = 1000 \\; 0000 \\; \\text{(Two's complement)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    As you might have noticed, all these calculations are additions, hinting at an important fact: computers' internal hardware circuits are primarily designed around addition operations. This is because addition is simpler to implement in hardware compared to other operations like multiplication, division, and subtraction, allowing for easier parallelization and faster computation.

    It's important to note that this doesn't mean computers can only perform addition. By combining addition with basic logical operations, computers can execute a variety of other mathematical operations. For example, the subtraction \\(a - b\\) can be translated into \\(a + (-b)\\); multiplication and division can be translated into multiple additions or subtractions.

    We can now summarize the reason for using two's complement in computers: with two's complement representation, computers can use the same circuits and operations to handle both positive and negative number addition, eliminating the need for special hardware circuits for subtraction and avoiding the ambiguity of positive and negative zero. This greatly simplifies hardware design and enhances computational efficiency.

    The design of two's complement is quite ingenious, and due to space constraints, we'll stop here. Interested readers are encouraged to explore further.

    "},{"location":"chapter_data_structure/number_encoding/#332-floating-point-number-encoding","title":"3.3.2 \u00a0 Floating-point number encoding","text":"

    You might have noticed something intriguing: despite having the same length of 4 bytes, why does a float have a much larger range of values compared to an int? This seems counterintuitive, as one would expect the range to shrink for float since it needs to represent fractions.

    In fact, this is due to the different representation method used by floating-point numbers (float). Let's consider a 32-bit binary number as:

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

    According to the IEEE 754 standard, a 32-bit float consists of the following three parts:

    • Sign bit \\(\\mathrm{S}\\): Occupies 1 bit, corresponding to \\(b_{31}\\).
    • Exponent bit \\(\\mathrm{E}\\): Occupies 8 bits, corresponding to \\(b_{30} b_{29} \\ldots b_{23}\\).
    • Fraction bit \\(\\mathrm{N}\\): Occupies 23 bits, corresponding to \\(b_{22} b_{21} \\ldots b_0\\).

    The value of a binary float number is calculated as:

    \\[ \\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 \\]

    Converted to a decimal formula, this becomes:

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

    The range of each component is:

    \\[ \\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} \\times 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

    Figure 3-5 \u00a0 Example calculation of a float in IEEE 754 standard

    Observing the diagram, given an example data \\(\\mathrm{S} = 0\\), \\(\\mathrm{E} = 124\\), \\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\), we have:

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

    Now we can answer the initial question: The representation of float includes an exponent bit, leading to a much larger range than int. Based on the above calculation, the maximum positive number representable by float is approximately \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\), and the minimum negative number is obtained by switching the sign bit.

    However, the trade-off for float's expanded range is a sacrifice in precision. The integer type int uses all 32 bits to represent the number, with values evenly distributed; but due to the exponent bit, the larger the value of a float, the greater the difference between adjacent numbers.

    As shown in the Table 3-2 , exponent bits \\(\\mathrm{E} = 0\\) and \\(\\mathrm{E} = 255\\) have special meanings, used to represent zero, infinity, \\(\\mathrm{NaN}\\), etc.

    Table 3-2 \u00a0 Meaning of exponent bits

    Exponent Bit E Fraction Bit \\(\\mathrm{N} = 0\\) Fraction Bit \\(\\mathrm{N} \\ne 0\\) Calculation Formula \\(0\\) \\(\\pm 0\\) Subnormal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) Normal Numbers Normal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

    It's worth noting that subnormal numbers significantly improve the precision of floating-point numbers. The smallest positive normal number is \\(2^{-126}\\), and the smallest positive subnormal number is \\(2^{-126} \\times 2^{-23}\\).

    Double-precision double also uses a similar representation method to float, which is not elaborated here for brevity.

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 Summary","text":""},{"location":"chapter_data_structure/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Data structures can be categorized from two perspectives: logical structure and physical structure. Logical structure describes the logical relationships between data elements, while physical structure describes how data is stored in computer memory.
    • Common logical structures include linear, tree-like, and network structures. We generally classify data structures into linear (arrays, linked lists, stacks, queues) and non-linear (trees, graphs, heaps) based on their logical structure. The implementation of hash tables may involve both linear and non-linear data structures.
    • When a program runs, data is stored in computer memory. Each memory space has a corresponding memory address, and the program accesses data through these addresses.
    • Physical structures are primarily divided into contiguous space storage (arrays) and dispersed space storage (linked lists). All data structures are implemented using arrays, linked lists, or a combination of both.
    • Basic data types in computers include integers (byte, short, int, long), floating-point numbers (float, double), characters (char), and booleans (boolean). Their range depends on the size of the space occupied and the representation method.
    • Original code, complement code, and two's complement code are three methods of encoding numbers in computers, and they can be converted into each other. The highest bit of the original code of an integer is the sign bit, and the remaining bits represent the value of the number.
    • Integers are stored in computers in the form of two's complement. In this representation, the computer can treat the addition of positive and negative numbers uniformly, without the need for special hardware circuits for subtraction, and there is no ambiguity of positive and negative zero.
    • The encoding of floating-point numbers consists of 1 sign bit, 8 exponent bits, and 23 fraction bits. Due to the presence of the exponent bit, the range of floating-point numbers is much greater than that of integers, but at the cost of sacrificing precision.
    • ASCII is the earliest English character set, 1 byte in length, and includes 127 characters. The GBK character set is a commonly used Chinese character set, including more than 20,000 Chinese characters. Unicode strives to provide a complete character set standard, including characters from various languages worldwide, thus solving the problem of garbled characters caused by inconsistent character encoding methods.
    • UTF-8 is the most popular Unicode encoding method, with excellent universality. It is a variable-length encoding method with good scalability and effectively improves the efficiency of space usage. UTF-16 and UTF-32 are fixed-length encoding methods. When encoding Chinese characters, UTF-16 occupies less space than UTF-8. Programming languages like Java and C# use UTF-16 encoding by default.
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Why does a hash table contain both linear and non-linear data structures?

    The underlying structure of a hash table is an array. To resolve hash collisions, we may use \"chaining\": each bucket in the array points to a linked list, which, when exceeding a certain threshold, might be transformed into a tree (usually a red-black tree). From a storage perspective, the foundation of a hash table is an array, where each bucket slot might contain a value, a linked list, or a tree. Therefore, hash tables may contain both linear data structures (arrays, linked lists) and non-linear data structures (trees).

    Q: Is the length of the char type 1 byte?

    The length of the char type is determined by the encoding method used by the programming language. For example, Java, JavaScript, TypeScript, and C# all use UTF-16 encoding (to save Unicode code points), so the length of the char type is 2 bytes.

    Q: Is there ambiguity in calling data structures based on arrays \"static data structures\"? Because operations like push and pop on stacks are \"dynamic\".

    While stacks indeed allow for dynamic data operations, the data structure itself remains \"static\" (with unchangeable length). Even though data structures based on arrays can dynamically add or remove elements, their capacity is fixed. If the data volume exceeds the pre-allocated size, a new, larger array needs to be created, and the contents of the old array copied into it.

    Q: When building stacks (queues) without specifying their size, why are they considered \"static data structures\"?

    In high-level programming languages, we don't need to manually specify the initial capacity of stacks (queues); this task is automatically handled internally by the class. For example, the initial capacity of Java's ArrayList is usually 10. Furthermore, the expansion operation is also implemented automatically. See the subsequent \"List\" chapter for details.

    "},{"location":"chapter_graph/","title":"Chapter 9. \u00a0 Graph","text":"

    Abstract

    In the journey of life, we are like individual nodes, connected by countless invisible edges.

    Each encounter and parting leaves a distinctive imprint on this vast network graph.

    "},{"location":"chapter_graph/#chapter-contents","title":"Chapter contents","text":"
    • 9.1 \u00a0 Graph
    • 9.2 \u00a0 Basic graph operations
    • 9.3 \u00a0 Graph traversal
    • 9.4 \u00a0 Summary
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 Graph","text":"

    A \"graph\" is a type of nonlinear data structure, consisting of \"vertices\" and \"edges\". A graph \\(G\\) can be abstractly represented as a collection of a set of vertices \\(V\\) and a set of edges \\(E\\). The following example shows a graph containing 5 vertices and 7 edges.

    \\[ \\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} \\]

    If vertices are viewed as nodes and edges as references (pointers) connecting the nodes, graphs can be seen as a data structure that extends from linked lists. As shown below, compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) are more complex due to their higher degree of freedom.

    Figure 9-1 \u00a0 Relationship between linked lists, trees, and graphs

    "},{"location":"chapter_graph/graph/#911-common-types-of-graphs","title":"9.1.1 \u00a0 Common types of graphs","text":"

    Based on whether edges have direction, graphs can be divided into \"undirected graphs\" and \"directed graphs\", as shown below.

    • In undirected graphs, edges represent a \"bidirectional\" connection between two vertices, for example, the \"friendship\" in WeChat or QQ.
    • In directed graphs, edges have directionality, that is, the edges \\(A \\rightarrow B\\) and \\(A \\leftarrow B\\) are independent of each other, for example, the \"follow\" and \"be followed\" relationship on Weibo or TikTok.

    Figure 9-2 \u00a0 Directed and undirected graphs

    Based on whether all vertices are connected, graphs can be divided into \"connected graphs\" and \"disconnected graphs\", as shown below.

    • For connected graphs, it is possible to reach any other vertex starting from a certain vertex.
    • For disconnected graphs, there is at least one vertex that cannot be reached from a certain starting vertex.

    Figure 9-3 \u00a0 Connected and disconnected graphs

    We can also add a \"weight\" variable to edges, resulting in \"weighted graphs\" as shown below. For example, in mobile games like \"Honor of Kings\", the system calculates the \"closeness\" between players based on shared gaming time, and this closeness network can be represented with a weighted graph.

    Figure 9-4 \u00a0 Weighted and unweighted graphs

    Graph data structures include the following commonly used terms.

    • \"Adjacency\": When there is an edge connecting two vertices, these two vertices are said to be \"adjacent\". In the above figure, the adjacent vertices of vertex 1 are vertices 2, 3, and 5.
    • \"Path\": The sequence of edges passed from vertex A to vertex B is called a \"path\" from A to B. In the above figure, the edge sequence 1-5-2-4 is a path from vertex 1 to vertex 4.
    • \"Degree\": The number of edges a vertex has. For directed graphs, \"in-degree\" refers to how many edges point to the vertex, and \"out-degree\" refers to how many edges point out from the vertex.
    "},{"location":"chapter_graph/graph/#912-representation-of-graphs","title":"9.1.2 \u00a0 Representation of graphs","text":"

    Common representations of graphs include \"adjacency matrices\" and \"adjacency lists\". The following examples use undirected graphs.

    "},{"location":"chapter_graph/graph/#1-adjacency-matrix","title":"1. \u00a0 Adjacency matrix","text":"

    Let the number of vertices in the graph be \\(n\\), the \"adjacency matrix\" uses an \\(n \\times n\\) matrix to represent the graph, where each row (column) represents a vertex, and the matrix elements represent edges, with \\(1\\) or \\(0\\) indicating whether there is an edge between two vertices.

    As shown below, let the adjacency matrix be \\(M\\), and the list of vertices be \\(V\\), then the matrix element \\(M[i, j] = 1\\) indicates there is an edge between vertex \\(V[i]\\) and vertex \\(V[j]\\), conversely \\(M[i, j] = 0\\) indicates there is no edge between the two vertices.

    Figure 9-5 \u00a0 Representation of a graph with an adjacency matrix

    Adjacency matrices have the following characteristics.

    • A vertex cannot be connected to itself, so the elements on the main diagonal of the adjacency matrix are meaningless.
    • For undirected graphs, edges in both directions are equivalent, thus the adjacency matrix is symmetric about the main diagonal.
    • By replacing the elements of the adjacency matrix from \\(1\\) and \\(0\\) to weights, it can represent weighted graphs.

    When representing graphs with adjacency matrices, it is possible to directly access matrix elements to obtain edges, thus operations of addition, deletion, lookup, and modification are very efficient, all with a time complexity of \\(O(1)\\). However, the space complexity of the matrix is \\(O(n^2)\\), which consumes more memory.

    "},{"location":"chapter_graph/graph/#2-adjacency-list","title":"2. \u00a0 Adjacency list","text":"

    The \"adjacency list\" uses \\(n\\) linked lists to represent the graph, with each linked list node representing a vertex. The \\(i\\)-th linked list corresponds to vertex \\(i\\) and contains all adjacent vertices (vertices connected to that vertex). The Figure 9-6 shows an example of a graph stored using an adjacency list.

    Figure 9-6 \u00a0 Representation of a graph with an adjacency list

    The adjacency list only stores actual edges, and the total number of edges is often much less than \\(n^2\\), making it more space-efficient. However, finding edges in the adjacency list requires traversing the linked list, so its time efficiency is not as good as that of the adjacency matrix.

    Observing the above figure, the structure of the adjacency list is very similar to the \"chaining\" in hash tables, hence we can use similar methods to optimize efficiency. For example, when the linked list is long, it can be transformed into an AVL tree or red-black tree, thus optimizing the time efficiency from \\(O(n)\\) to \\(O(\\log n)\\); the linked list can also be transformed into a hash table, thus reducing the time complexity to \\(O(1)\\).

    "},{"location":"chapter_graph/graph/#913-common-applications-of-graphs","title":"9.1.3 \u00a0 Common applications of graphs","text":"

    As shown in the Table 9-1 , many real-world systems can be modeled with graphs, and corresponding problems can be reduced to graph computing problems.

    Table 9-1 \u00a0 Common graphs in real life

    Vertices Edges Graph Computing Problem Social Networks Users Friendships Potential Friend Recommendations Subway Lines Stations Connectivity Between Stations Shortest Route Recommendations Solar System Celestial Bodies Gravitational Forces Between Celestial Bodies Planetary Orbit Calculations"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 Basic operations on graphs","text":"

    The basic operations on graphs can be divided into operations on \"edges\" and operations on \"vertices\". Under the two representation methods of \"adjacency matrix\" and \"adjacency list\", the implementation methods are different.

    "},{"location":"chapter_graph/graph_operations/#921-implementation-based-on-adjacency-matrix","title":"9.2.1 \u00a0 Implementation based on adjacency matrix","text":"

    Given an undirected graph with \\(n\\) vertices, the various operations are implemented as shown in the Figure 9-7 .

    • Adding or removing an edge: Directly modify the specified edge in the adjacency matrix, using \\(O(1)\\) time. Since it is an undirected graph, it is necessary to update the edges in both directions simultaneously.
    • Adding a vertex: Add a row and a column at the end of the adjacency matrix and fill them all with \\(0\\)s, using \\(O(n)\\) time.
    • Removing a vertex: Delete a row and a column in the adjacency matrix. The worst case is when the first row and column are removed, requiring \\((n-1)^2\\) elements to be \"moved up and to the left\", thus using \\(O(n^2)\\) time.
    • Initialization: Pass in \\(n\\) vertices, initialize a vertex list vertices of length \\(n\\), using \\(O(n)\\) time; initialize an \\(n \\times n\\) size adjacency matrix adjMat, using \\(O(n^2)\\) time.
    Initialize adjacency matrixAdd an edgeRemove an edgeAdd a vertexRemove a vertex

    Figure 9-7 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency matrix

    Below is the implementation code for graphs represented using an adjacency matrix:

    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
    [class]{GraphAdjMat}-[func]{}\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_graph/graph_operations/#922-implementation-based-on-adjacency-list","title":"9.2.2 \u00a0 Implementation based on adjacency list","text":"

    Given an undirected graph with a total of \\(n\\) vertices and \\(m\\) edges, the various operations can be implemented as shown in the Figure 9-8 .

    • Adding an edge: Simply add the edge at the end of the corresponding vertex's linked list, using \\(O(1)\\) time. Because it is an undirected graph, it is necessary to add edges in both directions simultaneously.
    • Removing an edge: Find and remove the specified edge in the corresponding vertex's linked list, using \\(O(m)\\) time. In an undirected graph, it is necessary to remove edges in both directions simultaneously.
    • Adding a vertex: Add a linked list in the adjacency list and make the new vertex the head node of the list, using \\(O(1)\\) time.
    • Removing a vertex: It is necessary to traverse the entire adjacency list, removing all edges that include the specified vertex, using \\(O(n + m)\\) time.
    • Initialization: Create \\(n\\) vertices and \\(2m\\) edges in the adjacency list, using \\(O(n + m)\\) time.
    Initialize adjacency listAdd an edgeRemove an edgeAdd a vertexRemove a vertex

    Figure 9-8 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency list

    Below is the adjacency list code implementation. Compared to the above diagram, the actual code has the following differences.

    • For convenience in adding and removing vertices, and to simplify the code, we use lists (dynamic arrays) instead of linked lists.
    • Use a hash table to store the adjacency list, key being the vertex instance, value being the list (linked list) of adjacent vertices of that vertex.

    Additionally, we use the Vertex class to represent vertices in the adjacency list. The reason for this is: if, like with the adjacency matrix, list indexes were used to distinguish different vertices, then suppose you want to delete the vertex at index \\(i\\), you would need to traverse the entire adjacency list and decrement all indexes greater than \\(i\\) by \\(1\\), which is very inefficient. However, if each vertex is a unique Vertex instance, then deleting a vertex does not require any changes to other vertices.

    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
    [class]{GraphAdjList}-[func]{}\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_graph/graph_operations/#923-efficiency-comparison","title":"9.2.3 \u00a0 Efficiency comparison","text":"

    Assuming there are \\(n\\) vertices and \\(m\\) edges in the graph, the Table 9-2 compares the time efficiency and space efficiency of the adjacency matrix and adjacency list.

    Table 9-2 \u00a0 Comparison of adjacency matrix and adjacency list

    Adjacency matrix Adjacency list (Linked list) Adjacency list (Hash table) Determine adjacency \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add an edge \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Remove an edge \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add a vertex \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) Remove a vertex \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) Memory space usage \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    Observing the Table 9-2 , it seems that the adjacency list (hash table) has the best time efficiency and space efficiency. However, in practice, operating on edges in the adjacency matrix is more efficient, requiring only a single array access or assignment operation. Overall, the adjacency matrix exemplifies the principle of \"space for time\", while the adjacency list exemplifies \"time for space\".

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 Graph traversal","text":"

    Trees represent a \"one-to-many\" relationship, while graphs have a higher degree of freedom and can represent any \"many-to-many\" relationship. Therefore, we can consider trees as a special case of graphs. Clearly, tree traversal operations are also a special case of graph traversal operations.

    Both graphs and trees require the application of search algorithms to implement traversal operations. Graph traversal can be divided into two types: \"Breadth-First Search (BFS)\" and \"Depth-First Search (DFS)\".

    "},{"location":"chapter_graph/graph_traversal/#931-breadth-first-search","title":"9.3.1 \u00a0 Breadth-first search","text":"

    Breadth-first search is a near-to-far traversal method, starting from a certain node, always prioritizing the visit to the nearest vertices and expanding outwards layer by layer. As shown in the Figure 9-9 , starting from the top left vertex, first traverse all adjacent vertices of that vertex, then traverse all adjacent vertices of the next vertex, and so on, until all vertices have been visited.

    Figure 9-9 \u00a0 Breadth-first traversal of a graph

    "},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation","title":"1. \u00a0 Algorithm implementation","text":"

    BFS is usually implemented with the help of a queue, as shown in the code below. The queue has a \"first in, first out\" property, which aligns with the BFS idea of traversing \"from near to far\".

    1. Add the starting vertex startVet to the queue and start the loop.
    2. In each iteration of the loop, pop the vertex at the front of the queue and record it as visited, then add all adjacent vertices of that vertex to the back of the queue.
    3. Repeat step 2. until all vertices have been visited.

    To prevent revisiting vertices, we use a hash table visited to record which nodes have been visited.

    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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{graph_bfs}\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    Code Visualization

    Full Screen >

    The code is relatively abstract, it is suggested to compare with the following figure to deepen the understanding.

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

    Figure 9-10 \u00a0 Steps of breadth-first search of a graph

    Is the sequence of breadth-first traversal unique?

    Not unique. Breadth-first traversal only requires traversing in a \"from near to far\" order, and the traversal order of multiple vertices at the same distance can be arbitrarily shuffled. For example, in the above figure, the visitation order of vertices \\(1\\) and \\(3\\) can be switched, as can the order of vertices \\(2\\), \\(4\\), and \\(6\\).

    "},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"

    Time complexity: All vertices will be enqueued and dequeued once, using \\(O(|V|)\\) time; in the process of traversing adjacent vertices, since it is an undirected graph, all edges will be visited \\(2\\) times, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

    Space complexity: The maximum number of vertices in list res, hash table visited, and queue que is \\(|V|\\), using \\(O(|V|)\\) space.

    "},{"location":"chapter_graph/graph_traversal/#932-depth-first-search","title":"9.3.2 \u00a0 Depth-first search","text":"

    Depth-first search is a traversal method that prioritizes going as far as possible and then backtracks when no further paths are available. As shown in the Figure 9-11 , starting from the top left vertex, visit some adjacent vertex of the current vertex until no further path is available, then return and continue until all vertices are traversed.

    Figure 9-11 \u00a0 Depth-first traversal of a graph

    "},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation_1","title":"1. \u00a0 Algorithm implementation","text":"

    This \"go as far as possible and then return\" algorithm paradigm is usually implemented based on recursion. Similar to breadth-first search, in depth-first search, we also need the help of a hash table visited to record the visited vertices to avoid revisiting.

    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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    Code Visualization

    Full Screen >

    The algorithm process of depth-first search is shown in the following figure.

    • Dashed lines represent downward recursion, indicating that a new recursive method has been initiated to visit a new vertex.
    • Curved dashed lines represent upward backtracking, indicating that this recursive method has returned to the position where this method was initiated.

    To deepen the understanding, it is suggested to combine the following figure with the code to simulate (or draw) the entire DFS process in your mind, including when each recursive method is initiated and when it returns.

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

    Figure 9-12 \u00a0 Steps of depth-first search of a graph

    Is the sequence of depth-first traversal unique?

    Similar to breadth-first traversal, the order of the depth-first traversal sequence is also not unique. Given a certain vertex, exploring in any direction first is possible, that is, the order of adjacent vertices can be arbitrarily shuffled, all being part of depth-first traversal.

    Taking tree traversal as an example, \"root \\(\\rightarrow\\) left \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) right \\(\\rightarrow\\) root\" correspond to preorder, inorder, and postorder traversals, respectively. They showcase three types of traversal priorities, yet all three are considered depth-first traversal.

    "},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"

    Time complexity: All vertices will be visited once, using \\(O(|V|)\\) time; all edges will be visited twice, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

    Space complexity: The maximum number of vertices in list res, hash table visited is \\(|V|\\), and the maximum recursion depth is \\(|V|\\), therefore using \\(O(|V|)\\) space.

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 Summary","text":""},{"location":"chapter_graph/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A graph consists of vertices and edges and can be represented as a set comprising a group of vertices and a group of edges.
    • Compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) have a higher degree of freedom and are therefore more complex.
    • The edges of a directed graph have directionality, any vertex in a connected graph is reachable, and each edge in a weighted graph contains a weight variable.
    • Adjacency matrices use matrices to represent graphs, with each row (column) representing a vertex and matrix elements representing edges, using \\(1\\) or \\(0\\) to indicate the presence or absence of an edge between two vertices. Adjacency matrices are highly efficient for add, delete, find, and modify operations, but they consume more space.
    • Adjacency lists use multiple linked lists to represent graphs, with the \\(i^{th}\\) list corresponding to vertex \\(i\\), containing all its adjacent vertices. Adjacency lists save more space compared to adjacency matrices, but since it is necessary to traverse the list to find edges, their time efficiency is lower.
    • When the linked lists in the adjacency list are too long, they can be converted into red-black trees or hash tables to improve query efficiency.
    • From the perspective of algorithmic thinking, adjacency matrices embody the principle of \"space for time,\" while adjacency lists embody \"time for space.\"
    • Graphs can be used to model various real systems, such as social networks, subway routes, etc.
    • A tree is a special case of a graph, and tree traversal is also a special case of graph traversal.
    • Breadth-first traversal of a graph is a search method that expands layer by layer from near to far, usually implemented with a queue.
    • Depth-first traversal of a graph is a search method that prefers to go as deep as possible and backtracks when no further paths are available, often based on recursion.
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is a path defined as a sequence of vertices or a sequence of edges?

    Definitions vary between different language versions on Wikipedia: the English version defines a path as \"a sequence of edges,\" while the Chinese version defines it as \"a sequence of vertices.\" Here is the original text from the English version: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    In this document, a path is considered a sequence of edges, rather than a sequence of vertices. This is because there might be multiple edges connecting two vertices, in which case each edge corresponds to a path.

    Q: In a disconnected graph, are there points that cannot be traversed to?

    In a disconnected graph, starting from a certain vertex, there is at least one vertex that cannot be reached. Traversing a disconnected graph requires setting multiple starting points to traverse all connected components of the graph.

    Q: In an adjacency list, does the order of \"all vertices connected to that vertex\" matter?

    It can be in any order. However, in practical applications, it might be necessary to sort according to certain rules, such as the order in which vertices are added, or the order of vertex values, etc., to facilitate the quick search for vertices with certain extremal values.

    "},{"location":"chapter_hashing/","title":"Chapter 6. \u00a0 Hash table","text":"

    Abstract

    In the world of computing, a hash table is akin to an intelligent librarian.

    It understands how to compute index numbers, enabling swift retrieval of the desired book.

    "},{"location":"chapter_hashing/#chapter-contents","title":"Chapter contents","text":"
    • 6.1 \u00a0 Hash table
    • 6.2 \u00a0 Hash collision
    • 6.3 \u00a0 Hash algorithm
    • 6.4 \u00a0 Summary
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 Hash algorithms","text":"

    The previous two sections introduced the working principle of hash tables and the methods to handle hash collisions. However, both open addressing and chaining can only ensure that the hash table functions normally when collisions occur, but cannot reduce the frequency of hash collisions.

    If hash collisions occur too frequently, the performance of the hash table will deteriorate drastically. As shown in the Figure 6-8 , for a chaining hash table, in the ideal case, the key-value pairs are evenly distributed across the buckets, achieving optimal query efficiency; in the worst case, all key-value pairs are stored in the same bucket, degrading the time complexity to \\(O(n)\\).

    Figure 6-8 \u00a0 Ideal and worst cases of hash collisions

    The distribution of key-value pairs is determined by the hash function. Recalling the steps of calculating a hash function, first compute the hash value, then modulo it by the array length:

    index = hash(key) % capacity\n

    Observing the above formula, when the hash table capacity capacity is fixed, the hash algorithm hash() determines the output value, thereby determining the distribution of key-value pairs in the hash table.

    This means that, to reduce the probability of hash collisions, we should focus on the design of the hash algorithm hash().

    "},{"location":"chapter_hashing/hash_algorithm/#631-goals-of-hash-algorithms","title":"6.3.1 \u00a0 Goals of hash algorithms","text":"

    To achieve a \"fast and stable\" hash table data structure, hash algorithms should have the following characteristics:

    • Determinism: For the same input, the hash algorithm should always produce the same output. Only then can the hash table be reliable.
    • High efficiency: The process of computing the hash value should be fast enough. The smaller the computational overhead, the more practical the hash table.
    • Uniform distribution: The hash algorithm should ensure that key-value pairs are evenly distributed in the hash table. The more uniform the distribution, the lower the probability of hash collisions.

    In fact, hash algorithms are not only used to implement hash tables but are also widely applied in other fields.

    • Password storage: To protect the security of user passwords, systems usually do not store the plaintext passwords but rather the hash values of the passwords. When a user enters a password, the system calculates the hash value of the input and compares it with the stored hash value. If they match, the password is considered correct.
    • Data integrity check: The data sender can calculate the hash value of the data and send it along; the receiver can recalculate the hash value of the received data and compare it with the received hash value. If they match, the data is considered intact.

    For cryptographic applications, to prevent reverse engineering such as deducing the original password from the hash value, hash algorithms need higher-level security features.

    • Unidirectionality: It should be impossible to deduce any information about the input data from the hash value.
    • Collision resistance: It should be extremely difficult to find two different inputs that produce the same hash value.
    • Avalanche effect: Minor changes in the input should lead to significant and unpredictable changes in the output.

    Note that \"Uniform Distribution\" and \"Collision Resistance\" are two separate concepts. Satisfying uniform distribution does not necessarily mean collision resistance. For example, under random input key, the hash function key % 100 can produce a uniformly distributed output. However, this hash algorithm is too simple, and all key with the same last two digits will have the same output, making it easy to deduce a usable key from the hash value, thereby cracking the password.

    "},{"location":"chapter_hashing/hash_algorithm/#632-design-of-hash-algorithms","title":"6.3.2 \u00a0 Design of hash algorithms","text":"

    The design of hash algorithms is a complex issue that requires consideration of many factors. However, for some less demanding scenarios, we can also design some simple hash algorithms.

    • Additive hash: Add up the ASCII codes of each character in the input and use the total sum as the hash value.
    • Multiplicative hash: Utilize the non-correlation of multiplication, multiplying each round by a constant, accumulating the ASCII codes of each character into the hash value.
    • XOR hash: Accumulate the hash value by XORing each element of the input data.
    • Rotating hash: Accumulate the ASCII code of each character into a hash value, performing a rotation operation on the hash value before each accumulation.
    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
    Code Visualization

    Full Screen >

    It is observed that the last step of each hash algorithm is to take the modulus of the large prime number \\(1000000007\\) to ensure that the hash value is within an appropriate range. It is worth pondering why emphasis is placed on modulo a prime number, or what are the disadvantages of modulo a composite number? This is an interesting question.

    To conclude: Using a large prime number as the modulus can maximize the uniform distribution of hash values. Since a prime number does not share common factors with other numbers, it can reduce the periodic patterns caused by the modulo operation, thus avoiding hash collisions.

    For example, suppose we choose the composite number \\(9\\) as the modulus, which can be divided by \\(3\\), then all key divisible by \\(3\\) will be mapped to hash values \\(0\\), \\(3\\), \\(6\\).

    \\[ \\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} \\]

    If the input key happens to have this kind of arithmetic sequence distribution, then the hash values will cluster, thereby exacerbating hash collisions. Now, suppose we replace modulus with the prime number \\(13\\), since there are no common factors between key and modulus, the uniformity of the output hash values will be significantly improved.

    \\[ \\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} \\]

    It is worth noting that if the key is guaranteed to be randomly and uniformly distributed, then choosing a prime number or a composite number as the modulus can both produce uniformly distributed hash values. However, when the distribution of key has some periodicity, modulo a composite number is more likely to result in clustering.

    In summary, we usually choose a prime number as the modulus, and this prime number should be large enough to eliminate periodic patterns as much as possible, enhancing the robustness of the hash algorithm.

    "},{"location":"chapter_hashing/hash_algorithm/#633-common-hash-algorithms","title":"6.3.3 \u00a0 Common hash algorithms","text":"

    It is not hard to see that the simple hash algorithms mentioned above are quite \"fragile\" and far from reaching the design goals of hash algorithms. For example, since addition and XOR obey the commutative law, additive hash and XOR hash cannot distinguish strings with the same content but in different order, which may exacerbate hash collisions and cause security issues.

    In practice, we usually use some standard hash algorithms, such as MD5, SHA-1, SHA-2, and SHA-3. They can map input data of any length to a fixed-length hash value.

    Over the past century, hash algorithms have been in a continuous process of upgrading and optimization. Some researchers strive to improve the performance of hash algorithms, while others, including hackers, are dedicated to finding security issues in hash algorithms. The Table 6-2 shows hash algorithms commonly used in practical applications.

    • MD5 and SHA-1 have been successfully attacked multiple times and are thus abandoned in various security applications.
    • SHA-2 series, especially SHA-256, is one of the most secure hash algorithms to date, with no successful attacks reported, hence commonly used in various security applications and protocols.
    • SHA-3 has lower implementation costs and higher computational efficiency compared to SHA-2, but its current usage coverage is not as extensive as the SHA-2 series.

    Table 6-2 \u00a0 Common hash algorithms

    MD5 SHA-1 SHA-2 SHA-3 Release Year 1992 1995 2002 2008 Output Length 128 bit 160 bit 256/512 bit 224/256/384/512 bit Hash Collisions Frequent Frequent Rare Rare Security Level Low, has been successfully attacked Low, has been successfully attacked High High Applications Abandoned, still used for data integrity checks Abandoned Cryptocurrency transaction verification, digital signatures, etc. Can be used to replace SHA-2"},{"location":"chapter_hashing/hash_algorithm/#hash-values-in-data-structures","title":"Hash values in data structures","text":"

    We know that the keys in a hash table can be of various data types such as integers, decimals, or strings. Programming languages usually provide built-in hash algorithms for these data types to calculate the bucket indices in the hash table. Taking Python as an example, we can use the hash() function to compute the hash values for various data types.

    • The hash values of integers and booleans are their own values.
    • The calculation of hash values for floating-point numbers and strings is more complex, and interested readers are encouraged to study this on their own.
    • The hash value of a tuple is a combination of the hash values of each of its elements, resulting in a single hash value.
    • The hash value of an object is generated based on its memory address. By overriding the hash method of an object, hash values can be generated based on content.

    Tip

    Be aware that the definition and methods of the built-in hash value calculation functions in different programming languages vary.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# Hash value of integer 3 is 3\n\nbol = True\nhash_bol = hash(bol)\n# Hash value of boolean True is 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# Hash value of decimal 3.14159 is 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# Hash value of string \"Hello \u7b97\u6cd5\" is 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# Hash value of tuple (12836, '\u5c0f\u54c8') is 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# Hash value of ListNode object at 0x1058fd810 is 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// Hash value of integer 3 is 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// Hash value of boolean 1 is 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// Hash value of decimal 3.14159 is 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// Hash value of string \"Hello \u7b97\u6cd5\" is 15466937326284535026\n\n// In C++, built-in std::hash() only provides hash values for basic data types\n// Hash values for arrays and objects need to be implemented separately\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// Hash value of integer 3 is 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// Hash value of decimal 3.14159 is -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// Hash value of array [12836, \u5c0f\u54c8] is 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// Hash value of ListNode object utils.ListNode@7dc5e7b4 is 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// Hash value of integer 3 is 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// Hash value of boolean true is 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// Hash value of decimal 3.14159 is -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// Hash value of array [12836, \u5c0f\u54c8] is 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// Hash value of ListNode object 0 is 39053774;\n
    built_in_hash.go
    // Go does not provide built-in hash code functions\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// Hash value of integer 3 is 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// Hash value of boolean true is -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// Hash value of decimal 3.14159 is -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// Hash value of string \"Hello \u7b97\u6cd5\" is -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// Hash value of array [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] is -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// Hash value of ListNode object utils.ListNode is -2434780518035996159\n
    built_in_hash.js
    // JavaScript does not provide built-in hash code functions\n
    built_in_hash.ts
    // TypeScript does not provide built-in hash code functions\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// Hash value of integer 3 is 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// Hash value of decimal 3.14159 is 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// Hash value of string \"Hello \u7b97\u6cd5\" is 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// Hash value of array [12836, \u5c0f\u54c8] is 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// Hash value of ListNode object Instance of 'ListNode' is 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// Hash value of integer 3 is 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// Hash value of boolean true is 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// Hash value of decimal 3.14159 is 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// Hash value of string \"Hello \u7b97\u6cd5\" is 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// Hash value of tuple (12836, \"\u5c0f\u54c8\") is 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// Hash value of ListNode object RefCell { value: ListNode { val: 42, next: None } } is 15387811073369036852\n
    built_in_hash.c
    // C does not provide built-in hash code functions\n
    built_in_hash.kt
    \n
    built_in_hash.zig
    \n
    Code Visualization

    Full Screen >

    In many programming languages, only immutable objects can serve as the key in a hash table. If we use a list (dynamic array) as a key, when the contents of the list change, its hash value also changes, and we would no longer be able to find the original value in the hash table.

    Although the member variables of a custom object (such as a linked list node) are mutable, it is hashable. This is because the hash value of an object is usually generated based on its memory address, and even if the contents of the object change, the memory address remains the same, so the hash value remains unchanged.

    You might have noticed that the hash values output in different consoles are different. This is because the Python interpreter adds a random salt to the string hash function each time it starts up. This approach effectively prevents HashDoS attacks and enhances the security of the hash algorithm.

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 Hash collision","text":"

    As mentioned in the previous section, usually the input space of a hash function is much larger than its output space, making hash collisions theoretically inevitable. For example, if the input space consists of all integers and the output space is the size of the array capacity, multiple integers will inevitably map to the same bucket index.

    Hash collisions can lead to incorrect query results, severely affecting the usability of hash tables. To solve this problem, we expand the hash table whenever a hash collision occurs, until the collision is resolved. This method is simple and effective but inefficient due to the extensive data transfer and hash value computation involved in resizing the hash table. To improve efficiency, we can adopt the following strategies:

    1. Improve the data structure of the hash table, allowing it to function normally in the event of a hash collision.
    2. Only perform resizing when necessary, i.e., when hash collisions are severe.

    There are mainly two methods for improving the structure of hash tables: \"Separate Chaining\" and \"Open Addressing\".

    "},{"location":"chapter_hashing/hash_collision/#621-separate-chaining","title":"6.2.1 \u00a0 Separate chaining","text":"

    In the original hash table, each bucket can store only one key-value pair. \"Separate chaining\" transforms individual elements into a linked list, with key-value pairs as list nodes, storing all colliding key-value pairs in the same list. The Figure 6-5 shows an example of a hash table with separate chaining.

    Figure 6-5 \u00a0 Separate chaining hash table

    The operations of a hash table implemented with separate chaining have changed as follows:

    • Querying elements: Input key, pass through the hash function to obtain the bucket index, access the head node of the list, then traverse the list and compare key to find the target key-value pair.
    • Adding elements: First access the list head node via the hash function, then add the node (key-value pair) to the list.
    • Deleting elements: Access the list head based on the hash function's result, then traverse the list to find and remove the target node.

    Separate chaining has the following limitations:

    • Increased space usage: The linked list contains node pointers, which consume more memory space than arrays.
    • Reduced query efficiency: Due to the need for linear traversal of the list to find the corresponding element.

    The code below provides a simple implementation of a separate chaining hash table, with two things to note:

    • Lists (dynamic arrays) are used instead of linked lists for simplicity. In this setup, the hash table (array) contains multiple buckets, each of which is a list.
    • This implementation includes a method for resizing the hash table. When the load factor exceeds \\(\\frac{2}{3}\\), we resize the hash table to twice its original size.
    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
    Code Visualization

    Full Screen >

    It's worth noting that when the list is very long, the query efficiency \\(O(n)\\) is poor. At this point, the list can be converted to an \"AVL tree\" or \"Red-Black tree\" to optimize the time complexity of the query operation to \\(O(\\log n)\\).

    "},{"location":"chapter_hashing/hash_collision/#622-open-addressing","title":"6.2.2 \u00a0 Open addressing","text":"

    \"Open addressing\" does not introduce additional data structures but uses \"multiple probes\" to handle hash collisions. The probing methods mainly include linear probing, quadratic probing, and double hashing.

    Let's use linear probing as an example to introduce the mechanism of open addressing hash tables.

    "},{"location":"chapter_hashing/hash_collision/#1-linear-probing","title":"1. \u00a0 Linear probing","text":"

    Linear probing uses a fixed-step linear search for probing, differing from ordinary hash tables.

    • Inserting elements: Calculate the bucket index using the hash function. If the bucket already contains an element, linearly traverse forward from the conflict position (usually with a step size of \\(1\\)) until an empty bucket is found, then insert the element.
    • Searching for elements: If a hash collision is found, use the same step size to linearly traverse forward until the corresponding element is found and return value; if an empty bucket is encountered, it means the target element is not in the hash table, so return None.

    The Figure 6-6 shows the distribution of key-value pairs in an open addressing (linear probing) hash table. According to this hash function, keys with the same last two digits will be mapped to the same bucket. Through linear probing, they are stored consecutively in that bucket and the buckets below it.

    Figure 6-6 \u00a0 Distribution of key-value pairs in open addressing (linear probing) hash table

    However, linear probing tends to create \"clustering\". Specifically, the longer a continuous position in the array is occupied, the more likely these positions are to encounter hash collisions, further promoting the growth of these clusters and eventually leading to deterioration in the efficiency of operations.

    It's important to note that we cannot directly delete elements in an open addressing hash table. Deleting an element creates an empty bucket None in the array. When searching for elements, if linear probing encounters this empty bucket, it will return, making the elements below this bucket inaccessible. The program may incorrectly assume these elements do not exist, as shown in the Figure 6-7 .

    Figure 6-7 \u00a0 Query issues caused by deletion in open addressing

    To solve this problem, we can use a \"lazy deletion\" mechanism: instead of directly removing elements from the hash table, use a constant TOMBSTONE to mark the bucket. In this mechanism, both None and TOMBSTONE represent empty buckets and can hold key-value pairs. However, when linear probing encounters TOMBSTONE, it should continue traversing since there may still be key-value pairs below it.

    However, lazy deletion may accelerate the degradation of hash table performance. Every deletion operation produces a delete mark, and as TOMBSTONE increases, so does the search time, as linear probing may have to skip multiple TOMBSTONE to find the target element.

    Therefore, consider recording the index of the first TOMBSTONE encountered during linear probing and swapping the target element found with this TOMBSTONE. The advantage of this is that each time a query or addition is performed, the element is moved to a bucket closer to the ideal position (starting point of probing), thereby optimizing the query efficiency.

    The code below implements an open addressing (linear probing) hash table with lazy deletion. To make fuller use of the hash table space, we treat the hash table as a \"circular array,\" continuing to traverse from the beginning when the end of the array is passed.

    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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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-quadratic-probing","title":"2. \u00a0 Quadratic probing","text":"

    Quadratic probing is similar to linear probing and is one of the common strategies of open addressing. When a collision occurs, quadratic probing does not simply skip a fixed number of steps but skips \"the square of the number of probes,\" i.e., \\(1, 4, 9, \\dots\\) steps.

    Quadratic probing has the following advantages:

    • Quadratic probing attempts to alleviate the clustering effect of linear probing by skipping the distance of the square of the number of probes.
    • Quadratic probing skips larger distances to find empty positions, helping to distribute data more evenly.

    However, quadratic probing is not perfect:

    • Clustering still exists, i.e., some positions are more likely to be occupied than others.
    • Due to the growth of squares, quadratic probing may not probe the entire hash table, meaning it might not access empty buckets even if they exist in the hash table.
    "},{"location":"chapter_hashing/hash_collision/#3-double-hashing","title":"3. \u00a0 Double hashing","text":"

    As the name suggests, the double hashing method uses multiple hash functions \\(f_1(x)\\), \\(f_2(x)\\), \\(f_3(x)\\), \\(\\dots\\) for probing.

    • Inserting elements: If hash function \\(f_1(x)\\) encounters a conflict, try \\(f_2(x)\\), and so on, until an empty position is found and the element is inserted.
    • Searching for elements: Search in the same order of hash functions until the target element is found and returned; if an empty position is encountered or all hash functions have been tried, it indicates the element is not in the hash table, then return None.

    Compared to linear probing, double hashing is less prone to clustering but involves additional computation for multiple hash functions.

    Tip

    Please note that open addressing (linear probing, quadratic probing, and double hashing) hash tables all have the issue of \"not being able to directly delete elements.\"

    "},{"location":"chapter_hashing/hash_collision/#623-choice-of-programming-languages","title":"6.2.3 \u00a0 Choice of programming languages","text":"

    Various programming languages have adopted different hash table implementation strategies, here are a few examples:

    • Python uses open addressing. The dict dictionary uses pseudo-random numbers for probing.
    • Java uses separate chaining. Since JDK 1.8, when the array length in HashMap reaches 64 and the length of a linked list reaches 8, the linked list is converted to a red-black tree to improve search performance.
    • Go uses separate chaining. Go stipulates that each bucket can store up to 8 key-value pairs, and if the capacity is exceeded, an overflow bucket is connected; when there are too many overflow buckets, a special equal-size expansion operation is performed to ensure performance.
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 Hash table","text":"

    A \"hash table\", also known as a \"hash map\", achieves efficient element querying by establishing a mapping between keys and values. Specifically, when we input a key into the hash table, we can retrieve the corresponding value in \\(O(1)\\) time.

    As shown in the Figure 6-1 , given \\(n\\) students, each with two pieces of data: \"name\" and \"student number\". If we want to implement a query feature that returns the corresponding name when given a student number, we can use the hash table shown in the Figure 6-1 .

    Figure 6-1 \u00a0 Abstract representation of a hash table

    Apart from hash tables, arrays and linked lists can also be used to implement querying functions. Their efficiency is compared in the Table 6-1 .

    • Adding elements: Simply add the element to the end of the array (or linked list), using \\(O(1)\\) time.
    • Querying elements: Since the array (or linked list) is unordered, it requires traversing all the elements, using \\(O(n)\\) time.
    • Deleting elements: First, locate the element, then delete it from the array (or linked list), using \\(O(n)\\) time.

    Table 6-1 \u00a0 Comparison of element query efficiency

    Array Linked List Hash Table Find Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) Add Element \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Delete Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    Observations reveal that the time complexity for adding, deleting, and querying in a hash table is \\(O(1)\\), which is highly efficient.

    "},{"location":"chapter_hashing/hash_map/#611-common-operations-of-hash-table","title":"6.1.1 \u00a0 Common operations of hash table","text":"

    Common operations of a hash table include initialization, querying, adding key-value pairs, and deleting key-value pairs, etc. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
    # Initialize hash table\nhmap: dict = {}\n\n# Add operation\n# Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n# Query operation\n# Input key into hash table, get value\nname: str = hmap[15937]\n\n# Delete operation\n# Delete key-value pair (key, value) from hash table\nhmap.pop(10583)\n
    hash_map.cpp
    /* Initialize hash table */\nunordered_map<int, string> map;\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.erase(10583);\n
    hash_map.java
    /* Initialize hash table */\nMap<Integer, String> map = new HashMap<>();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.put(12836, \"Xiao Ha\");   \nmap.put(15937, \"Xiao Luo\");   \nmap.put(16750, \"Xiao Suan\");   \nmap.put(13276, \"Xiao Fa\");\nmap.put(10583, \"Xiao Ya\");\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
    hash_map.cs
    /* Initialize hash table */\nDictionary<int, string> map = new() {\n    /* Add operation */\n    // Add key-value pair (key, value) to the hash table\n    { 12836, \"Xiao Ha\" },\n    { 15937, \"Xiao Luo\" },\n    { 16750, \"Xiao Suan\" },\n    { 13276, \"Xiao Fa\" },\n    { 10583, \"Xiao Ya\" }\n};\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.Remove(10583);\n
    hash_map_test.go
    /* Initialize hash table */\nhmap := make(map[int]string)\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nname := hmap[15937]\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\ndelete(hmap, 10583)\n
    hash_map.swift
    /* Initialize hash table */\nvar map: [Int: String] = [:]\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\"\nmap[15937] = \"Xiao Luo\"\nmap[16750] = \"Xiao Suan\"\nmap[13276] = \"Xiao Fa\"\nmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map[15937]!\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* Initialize hash table */\nconst map = new Map();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\n
    hash_map.ts
    /* Initialize hash table */\nconst map = new Map<number, string>();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\nconsole.info('\\nAfter adding, the hash table is\\nKey -> Value');\nconsole.info(map);\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\nconsole.info('\\nInput student number 15937, query name ' + name);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\nconsole.info('\\nAfter deleting 10583, the hash table is\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* Initialize hash table */\nMap<int, String> map = {};\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* Initialize hash table */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.insert(12836, \"Xiao Ha\".to_string());\nmap.insert(15937, \"Xiao Luo\".to_string());\nmap.insert(16750, \"Xiao Suan\".to_string());\nmap.insert(13279, \"Xiao Fa\".to_string());\nmap.insert(10583, \"Xiao Ya\".to_string());\n\n/* Query operation */\n// Input key into hash table, get value\nlet _name: Option<&String> = map.get(&15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C does not provide a built-in hash table\n
    hash_map.kt
    \n
    hash_map.zig
    \n
    Code Visualization

    Full Screen >

    There are three common ways to traverse a hash table: traversing key-value pairs, keys, and values. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
    # Traverse hash table\n# Traverse key-value pairs key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# Traverse keys only\nfor key in hmap.keys():\n    print(key)\n# Traverse values only\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// Traverse using iterator key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (Map.Entry<Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// Traverse keys only\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// Traverse values only\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// Traverse keys only\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// Traverse values only\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// Traverse keys only\nfor key := range hmap {\n    fmt.Println(key)\n}\n// Traverse values only\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// Traverse keys only\nfor key in map.keys {\n    print(key)\n}\n// Traverse values only\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nmap.forEach((key, value) {\nprint('$key -> $value');\n});\n\n// Traverse keys only Key\nmap.keys.forEach((key) {\nprint(key);\n});\n\n// Traverse values only Value\nmap.values.forEach((value) {\nprint(value);\n});\n
    hash_map.rs
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// Traverse keys only Key\nfor key in map.keys() {\n    println!(\"{key}\"); \n}\n\n// Traverse values only Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C does not provide a built-in hash table\n
    hash_map.kt
    \n
    hash_map.zig
    // Zig example is not provided\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_hashing/hash_map/#612-simple-implementation-of-hash-table","title":"6.1.2 \u00a0 Simple implementation of hash table","text":"

    First, let's consider the simplest case: implementing a hash table using just an array. In the hash table, each empty slot in the array is called a \"bucket\", and each bucket can store one key-value pair. Therefore, the query operation involves finding the bucket corresponding to the key and retrieving the value from it.

    So, how do we locate the appropriate bucket based on the key? This is achieved through a \"hash function\". The role of the hash function is to map a larger input space to a smaller output space. In a hash table, the input space is all possible keys, and the output space is all buckets (array indices). In other words, input a key, and we can use the hash function to determine the storage location of the corresponding key-value pair in the array.

    The calculation process of the hash function for a given key is divided into the following two steps:

    1. Calculate the hash value using a certain hash algorithm hash().
    2. Take the modulus of the hash value with the number of buckets (array length) capacity to obtain the array index index.
    index = hash(key) % capacity\n

    Afterward, we can use index to access the corresponding bucket in the hash table and thereby retrieve the value.

    Assuming array length capacity = 100 and hash algorithm hash(key) = key, the hash function is key % 100. The Figure 6-2 uses key as the student number and value as the name to demonstrate the working principle of the hash function.

    Figure 6-2 \u00a0 Working principle of hash function

    The following code implements a simple hash table. Here, we encapsulate key and value into a class Pair to represent the key-value pair.

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_hashing/hash_map/#613-hash-collision-and-resizing","title":"6.1.3 \u00a0 Hash collision and resizing","text":"

    Fundamentally, the role of the hash function is to map the entire input space of all keys to the output space of all array indices. However, the input space is often much larger than the output space. Therefore, theoretically, there must be situations where \"multiple inputs correspond to the same output\".

    For the hash function in the above example, if the last two digits of the input key are the same, the output of the hash function will also be the same. For example, when querying for students with student numbers 12836 and 20336, we find:

    12836 % 100 = 36\n20336 % 100 = 36\n

    As shown in the Figure 6-3 , both student numbers point to the same name, which is obviously incorrect. This situation where multiple inputs correspond to the same output is known as \"hash collision\".

    Figure 6-3 \u00a0 Example of hash collision

    It is easy to understand that the larger the capacity \\(n\\) of the hash table, the lower the probability of multiple keys being allocated to the same bucket, and the fewer the collisions. Therefore, expanding the capacity of the hash table can reduce hash collisions.

    As shown in the Figure 6-4 , before expansion, key-value pairs (136, A) and (236, D) collided; after expansion, the collision is resolved.

    Figure 6-4 \u00a0 Hash table expansion

    Similar to array expansion, resizing a hash table requires migrating all key-value pairs from the original hash table to the new one, which is time-consuming. Furthermore, since the capacity capacity of the hash table changes, we need to recalculate the storage positions of all key-value pairs using the hash function, which adds to the computational overhead of the resizing process. Therefore, programming languages often reserve a sufficiently large capacity for the hash table to prevent frequent resizing.

    The \"load factor\" is an important concept for hash tables. It is defined as the ratio of the number of elements in the hash table to the number of buckets. It is used to measure the severity of hash collisions and is often used as a trigger for resizing the hash table. For example, in Java, when the load factor exceeds \\(0.75\\), the system will resize the hash table to twice its original size.

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 Summary","text":""},{"location":"chapter_hashing/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Given an input key, a hash table can retrieve the corresponding value in \\(O(1)\\) time, which is highly efficient.
    • Common hash table operations include querying, adding key-value pairs, deleting key-value pairs, and traversing the hash table.
    • The hash function maps a key to an array index, allowing access to the corresponding bucket and retrieval of the value.
    • Two different keys may end up with the same array index after hashing, leading to erroneous query results. This phenomenon is known as hash collision.
    • The larger the capacity of the hash table, the lower the probability of hash collisions. Therefore, hash table resizing can mitigate hash collisions. Similar to array resizing, hash table resizing is costly.
    • The load factor, defined as the number of elements divided by the number of buckets, reflects the severity of hash collisions and is often used as a condition to trigger hash table resizing.
    • Chaining addresses hash collisions by converting each element into a linked list, storing all colliding elements in the same list. However, excessively long lists can reduce query efficiency, which can be improved by converting the lists into red-black trees.
    • Open addressing handles hash collisions through multiple probes. Linear probing uses a fixed step size but it cannot delete elements and is prone to clustering. Multiple hashing uses several hash functions for probing which reduces clustering compared to linear probing but increases computational overhead.
    • Different programming languages adopt various hash table implementations. For example, Java's HashMap uses chaining, while Python's dict employs open addressing.
    • In hash tables, we desire hash algorithms with determinism, high efficiency, and uniform distribution. In cryptography, hash algorithms should also possess collision resistance and the avalanche effect.
    • Hash algorithms typically use large prime numbers as moduli to ensure uniform distribution of hash values and reduce hash collisions.
    • Common hash algorithms include MD5, SHA-1, SHA-2, and SHA-3. MD5 is often used for file integrity checks, while SHA-2 is commonly used in secure applications and protocols.
    • Programming languages usually provide built-in hash algorithms for data types to calculate bucket indices in hash tables. Generally, only immutable objects are hashable.
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: When does the time complexity of a hash table degrade to \\(O(n)\\)?

    The time complexity of a hash table can degrade to \\(O(n)\\) when hash collisions are severe. When the hash function is well-designed, the capacity is set appropriately, and collisions are evenly distributed, the time complexity is \\(O(1)\\). We usually consider the time complexity to be \\(O(1)\\) when using built-in hash tables in programming languages.

    Q: Why not use the hash function \\(f(x) = x\\)? This would eliminate collisions.

    Under the hash function \\(f(x) = x\\), each element corresponds to a unique bucket index, which is equivalent to an array. However, the input space is usually much larger than the output space (array length), so the last step of a hash function is often to take the modulo of the array length. In other words, the goal of a hash table is to map a larger state space to a smaller one while providing \\(O(1)\\) query efficiency.

    Q: Why can hash tables be more efficient than arrays, linked lists, or binary trees, even though hash tables are implemented using these structures?

    Firstly, hash tables have higher time efficiency but lower space efficiency. A significant portion of memory in hash tables remains unused.

    Secondly, hash tables are only more time-efficient in specific use cases. If a feature can be implemented with the same time complexity using an array or a linked list, it's usually faster than using a hash table. This is because the computation of the hash function incurs overhead, making the constant factor in the time complexity larger.

    Lastly, the time complexity of hash tables can degrade. For example, in chaining, we perform search operations in a linked list or red-black tree, which still risks degrading to \\(O(n)\\) time.

    Q: Does multiple hashing also have the flaw of not being able to delete elements directly? Can space marked as deleted be reused?

    Multiple hashing is a form of open addressing, and all open addressing methods have the drawback of not being able to delete elements directly; they require marking elements as deleted. Marked spaces can be reused. When inserting new elements into the hash table, and the hash function points to a position marked as deleted, that position can be used by the new element. This maintains the probing sequence of the hash table while ensuring efficient use of space.

    Q: Why do hash collisions occur during the search process in linear probing?

    During the search process, the hash function points to the corresponding bucket and key-value pair. If the key doesn't match, it indicates a hash collision. Therefore, linear probing will search downwards at a predetermined step size until the correct key-value pair is found or the search fails.

    Q: Why can resizing a hash table alleviate hash collisions?

    The last step of a hash function often involves taking the modulo of the array length \\(n\\), to keep the output within the array index range. When resizing, the array length \\(n\\) changes, and the indices corresponding to the keys may also change. Keys that were previously mapped to the same bucket might be distributed across multiple buckets after resizing, thereby mitigating hash collisions.

    "},{"location":"chapter_heap/","title":"Chapter 8. \u00a0 Heap","text":"

    Abstract

    The heap is like mountain peaks, stacked and undulating, each with its unique shape.

    Among these peaks, the highest one always catches the eye first.

    "},{"location":"chapter_heap/#chapter-contents","title":"Chapter contents","text":"
    • 8.1 \u00a0 Heap
    • 8.2 \u00a0 Building a heap
    • 8.3 \u00a0 Top-k problem
    • 8.4 \u00a0 Summary
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 Heap construction operation","text":"

    In some cases, we want to build a heap using all elements of a list, and this process is known as \"heap construction operation.\"

    "},{"location":"chapter_heap/build_heap/#821-implementing-with-heap-insertion-operation","title":"8.2.1 \u00a0 Implementing with heap insertion operation","text":"

    First, we create an empty heap and then iterate through the list, performing the \"heap insertion operation\" on each element in turn. This means adding the element to the end of the heap and then \"heapifying\" it from bottom to top.

    Each time an element is added to the heap, the length of the heap increases by one. Since nodes are added to the binary tree from top to bottom, the heap is constructed \"from top to bottom.\"

    Let the number of elements be \\(n\\), and each element's insertion operation takes \\(O(\\log{n})\\) time, thus the time complexity of this heap construction method is \\(O(n \\log n)\\).

    "},{"location":"chapter_heap/build_heap/#822-implementing-by-heapifying-through-traversal","title":"8.2.2 \u00a0 Implementing by heapifying through traversal","text":"

    In fact, we can implement a more efficient method of heap construction in two steps.

    1. Add all elements of the list as they are into the heap, at this point the properties of the heap are not yet satisfied.
    2. Traverse the heap in reverse order (reverse of level-order traversal), and perform \"top to bottom heapify\" on each non-leaf node.

    After heapifying a node, the subtree with that node as the root becomes a valid sub-heap. Since the traversal is in reverse order, the heap is built \"from bottom to top.\"

    The reason for choosing reverse traversal is that it ensures the subtree below the current node is already a valid sub-heap, making the heapification of the current node effective.

    It's worth mentioning that since leaf nodes have no children, they naturally form valid sub-heaps and do not need to be heapified. As shown in the following code, the last non-leaf node is the parent of the last node; we start from it and traverse in reverse order to perform heapification:

    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
    [class]{MaxHeap}-[func]{__init__}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/build_heap/#823-complexity-analysis","title":"8.2.3 \u00a0 Complexity analysis","text":"

    Next, let's attempt to calculate the time complexity of this second method of heap construction.

    • Assuming the number of nodes in the complete binary tree is \\(n\\), then the number of leaf nodes is \\((n + 1) / 2\\), where \\(/\\) is integer division. Therefore, the number of nodes that need to be heapified is \\((n - 1) / 2\\).
    • In the process of \"top to bottom heapification,\" each node is heapified to the leaf nodes at most, so the maximum number of iterations is the height of the binary tree \\(\\log n\\).

    Multiplying the two, we get the time complexity of the heap construction process as \\(O(n \\log n)\\). But this estimate is not accurate, because it does not take into account the nature of the binary tree having far more nodes at the lower levels than at the top.

    Let's perform a more accurate calculation. To simplify the calculation, assume a \"perfect binary tree\" with \\(n\\) nodes and height \\(h\\); this assumption does not affect the correctness of the result.

    Figure 8-5 \u00a0 Node counts at each level of a perfect binary tree

    As shown in the Figure 8-5 , the maximum number of iterations for a node \"to be heapified from top to bottom\" is equal to the distance from that node to the leaf nodes, which is precisely \"node height.\" Therefore, we can sum the \"number of nodes \\(\\times\\) node height\" at each level, to get the total number of heapification iterations for all nodes.

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    To simplify the above equation, we need to use knowledge of sequences from high school, first multiply \\(T(h)\\) by \\(2\\), to get:

    \\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^h\\times1 \\newline \\end{aligned} \\]

    By subtracting \\(T(h)\\) from \\(2T(h)\\) using the method of displacement, we get:

    \\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

    Observing the equation, \\(T(h)\\) is an geometric series, which can be directly calculated using the sum formula, resulting in a time complexity of:

    \\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

    Further, a perfect binary tree with height \\(h\\) has \\(n = 2^{h+1} - 1\\) nodes, thus the complexity is \\(O(2^h) = O(n)\\). This calculation shows that the time complexity of inputting a list and constructing a heap is \\(O(n)\\), which is very efficient.

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 Heap","text":"

    A \"heap\" is a complete binary tree that satisfies specific conditions and can be mainly divided into two types, as shown in the Figure 8-1 .

    • \"Min heap\": The value of any node \\(\\leq\\) the values of its child nodes.
    • \"Max heap\": The value of any node \\(\\geq\\) the values of its child nodes.

    Figure 8-1 \u00a0 Min heap and max heap

    As a special case of a complete binary tree, heaps have the following characteristics:

    • The bottom layer nodes are filled from left to right, and nodes in other layers are fully filled.
    • The root node of the binary tree is called the \"heap top,\" and the bottom-rightmost node is called the \"heap bottom.\"
    • For max heaps (min heaps), the value of the heap top element (root node) is the largest (smallest).
    "},{"location":"chapter_heap/heap/#811-common-operations-on-heaps","title":"8.1.1 \u00a0 Common operations on heaps","text":"

    It should be noted that many programming languages provide a \"priority queue,\" which is an abstract data structure defined as a queue with priority sorting.

    In fact, heaps are often used to implement priority queues, with max heaps equivalent to priority queues where elements are dequeued in descending order. From a usage perspective, we can consider \"priority queue\" and \"heap\" as equivalent data structures. Therefore, this book does not make a special distinction between the two, uniformly referring to them as \"heap.\"

    Common operations on heaps are shown in the Table 8-1 , and the method names depend on the programming language.

    Table 8-1 \u00a0 Efficiency of Heap Operations

    Method name Description Time complexity push() Add an element to the heap \\(O(\\log n)\\) pop() Remove the top element from the heap \\(O(\\log n)\\) peek() Access the top element (for max/min heap, the max/min value) \\(O(1)\\) size() Get the number of elements in the heap \\(O(1)\\) isEmpty() Check if the heap is empty \\(O(1)\\)

    In practice, we can directly use the heap class (or priority queue class) provided by programming languages.

    Similar to sorting algorithms where we have \"ascending order\" and \"descending order,\" we can switch between \"min heap\" and \"max heap\" by setting a flag or modifying the Comparator. The code is as follows:

    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
    \n
    heap.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20min_heap,%20flag%20%3D%20%5B%5D,%201%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20max_heap,%20flag%20%3D%20%5B%5D,%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20Python%20%E7%9A%84%20heapq%20%E6%A8%A1%E5%9D%97%E9%BB%98%E8%AE%A4%E5%AE%9E%E7%8E%B0%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E8%80%83%E8%99%91%E5%B0%86%E2%80%9C%E5%85%83%E7%B4%A0%E5%8F%96%E8%B4%9F%E2%80%9D%E5%90%8E%E5%86%8D%E5%85%A5%E5%A0%86%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%A4%A7%E5%B0%8F%E5%85%B3%E7%B3%BB%E9%A2%A0%E5%80%92%EF%BC%8C%E4%BB%8E%E8%80%8C%E5%AE%9E%E7%8E%B0%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E5%9C%A8%E6%9C%AC%E7%A4%BA%E4%BE%8B%E4%B8%AD%EF%BC%8Cflag%20%3D%201%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%B0%8F%E9%A1%B6%E5%A0%86%EF%BC%8Cflag%20%3D%20-1%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E5%A0%86%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%201%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%203%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%202%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%205%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%0A%20%20%20%20peek%20%3D%20flag%20*%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%E5%87%BA%E5%A0%86%0A%20%20%20%20%23%20%E5%87%BA%E5%A0%86%E5%85%83%E7%B4%A0%E4%BC%9A%E5%BD%A2%E6%88%90%E4%B8%80%E4%B8%AA%E4%BB%8E%E5%A4%A7%E5%88%B0%E5%B0%8F%E7%9A%84%E5%BA%8F%E5%88%97%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E5%A4%A7%E5%B0%8F%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%A0%86%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%BE%93%E5%85%A5%E5%88%97%E8%A1%A8%E5%B9%B6%E5%BB%BA%E5%A0%86%0A%20%20%20%20min_heap%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_heap/heap/#812-implementation-of-heaps","title":"8.1.2 \u00a0 Implementation of heaps","text":"

    The following implementation is of a max heap. To convert it into a min heap, simply invert all size logic comparisons (for example, replace \\(\\geq\\) with \\(\\leq\\)). Interested readers are encouraged to implement it on their own.

    "},{"location":"chapter_heap/heap/#1-storage-and-representation-of-heaps","title":"1. \u00a0 Storage and representation of heaps","text":"

    As mentioned in the \"Binary Trees\" section, complete binary trees are well-suited for array representation. Since heaps are a type of complete binary tree, we will use arrays to store heaps.

    When using an array to represent a binary tree, elements represent node values, and indexes represent node positions in the binary tree. Node pointers are implemented through an index mapping formula.

    As shown in the Figure 8-2 , given an index \\(i\\), the index of its left child is \\(2i + 1\\), the index of its right child is \\(2i + 2\\), and the index of its parent is \\((i - 1) / 2\\) (floor division). When the index is out of bounds, it signifies a null node or the node does not exist.

    Figure 8-2 \u00a0 Representation and storage of heaps

    We can encapsulate the index mapping formula into functions for convenient later use:

    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
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\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-accessing-the-top-element-of-the-heap","title":"2. \u00a0 Accessing the top element of the heap","text":"

    The top element of the heap is the root node of the binary tree, which is also the first element of the list:

    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
    [class]{MaxHeap}-[func]{peek}\n
    my_heap.zig
    // \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#3-inserting-an-element-into-the-heap","title":"3. \u00a0 Inserting an element into the heap","text":"

    Given an element val, we first add it to the bottom of the heap. After addition, since val may be larger than other elements in the heap, the heap's integrity might be compromised, thus it's necessary to repair the path from the inserted node to the root node. This operation is called \"heapifying\".

    Considering starting from the node inserted, perform heapify from bottom to top. As shown in the Figure 8-3 , we compare the value of the inserted node with its parent node, and if the inserted node is larger, we swap them. Then continue this operation, repairing each node in the heap from bottom to top until passing the root node or encountering a node that does not need to be swapped.

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

    Figure 8-3 \u00a0 Steps of element insertion into the heap

    Given a total of \\(n\\) nodes, the height of the tree is \\(O(\\log n)\\). Hence, the loop iterations for the heapify operation are at most \\(O(\\log n)\\), making the time complexity of the element insertion operation \\(O(\\log n)\\). The code is as shown:

    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
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#4-removing-the-top-element-from-the-heap","title":"4. \u00a0 Removing the top element from the heap","text":"

    The top element of the heap is the root node of the binary tree, that is, the first element of the list. If we directly remove the first element from the list, all node indexes in the binary tree would change, making it difficult to use heapify for repairs subsequently. To minimize changes in element indexes, we use the following steps.

    1. Swap the top element with the bottom element of the heap (swap the root node with the rightmost leaf node).
    2. After swapping, remove the bottom of the heap from the list (note, since it has been swapped, what is actually being removed is the original top element).
    3. Starting from the root node, perform heapify from top to bottom.

    As shown in the Figure 8-4 , the direction of \"heapify from top to bottom\" is opposite to \"heapify from bottom to top\". We compare the value of the root node with its two children and swap it with the largest child. Then repeat this operation until passing the leaf node or encountering a node that does not need to be swapped.

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

    Figure 8-4 \u00a0 Steps of removing the top element from the heap

    Similar to the element insertion operation, the time complexity of the top element removal operation is also \\(O(\\log n)\\). The code is as follows:

    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.remove(self.size() - 1);\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
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#813-common-applications-of-heaps","title":"8.1.3 \u00a0 Common applications of heaps","text":"
    • Priority Queue: Heaps are often the preferred data structure for implementing priority queues, with both enqueue and dequeue operations having a time complexity of \\(O(\\log n)\\), and building a queue having a time complexity of \\(O(n)\\), all of which are very efficient.
    • Heap Sort: Given a set of data, we can create a heap from them and then continually perform element removal operations to obtain ordered data. However, we usually use a more elegant method to implement heap sort, as detailed in the \"Heap Sort\" section.
    • Finding the Largest \\(k\\) Elements: This is a classic algorithm problem and also a typical application, such as selecting the top 10 hot news for Weibo hot search, picking the top 10 selling products, etc.
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 Summary","text":""},{"location":"chapter_heap/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A heap is a complete binary tree, which can be divided into a max heap and a min heap based on its property. The top element of a max (min) heap is the largest (smallest).
    • A priority queue is defined as a queue with dequeue priority, usually implemented using a heap.
    • Common operations of a heap and their corresponding time complexities include: element insertion into the heap \\(O(\\log n)\\), removing the top element from the heap \\(O(\\log n)\\), and accessing the top element of the heap \\(O(1)\\).
    • A complete binary tree is well-suited to be represented by an array, thus heaps are commonly stored using arrays.
    • Heapify operations are used to maintain the properties of the heap and are used in both heap insertion and removal operations.
    • The time complexity of inserting \\(n\\) elements into a heap and building the heap can be optimized to \\(O(n)\\), which is highly efficient.
    • Top-k is a classic algorithm problem that can be efficiently solved using the heap data structure, with a time complexity of \\(O(n \\log k)\\).
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the \"heap\" in data structures the same concept as the \"heap\" in memory management?

    The two are not the same concept, even though they are both referred to as \"heap\". The heap in computer system memory is part of dynamic memory allocation, where the program can use it to store data during execution. The program can request a certain amount of heap memory to store complex structures like objects and arrays. When these data are no longer needed, the program needs to release this memory to prevent memory leaks. Compared to stack memory, the management and usage of heap memory need to be more cautious, as improper use may lead to memory leaks and dangling pointers.

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k problem","text":"

    Question

    Given an unordered array nums of length \\(n\\), return the largest \\(k\\) elements in the array.

    For this problem, we will first introduce two straightforward solutions, then explain a more efficient heap-based method.

    "},{"location":"chapter_heap/top_k/#831-method-1-iterative-selection","title":"8.3.1 \u00a0 Method 1: Iterative selection","text":"

    We can perform \\(k\\) rounds of iterations as shown in the Figure 8-6 , extracting the \\(1^{st}\\), \\(2^{nd}\\), \\(\\dots\\), \\(k^{th}\\) largest elements in each round, with a time complexity of \\(O(nk)\\).

    This method is only suitable when \\(k \\ll n\\), as the time complexity approaches \\(O(n^2)\\) when \\(k\\) is close to \\(n\\), which is very time-consuming.

    Figure 8-6 \u00a0 Iteratively finding the largest k elements

    Tip

    When \\(k = n\\), we can obtain a complete ordered sequence, which is equivalent to the \"selection sort\" algorithm.

    "},{"location":"chapter_heap/top_k/#832-method-2-sorting","title":"8.3.2 \u00a0 Method 2: Sorting","text":"

    As shown in the Figure 8-7 , we can first sort the array nums and then return the last \\(k\\) elements, with a time complexity of \\(O(n \\log n)\\).

    Clearly, this method \"overachieves\" the task, as we only need to find the largest \\(k\\) elements, without the need to sort the other elements.

    Figure 8-7 \u00a0 Sorting to find the largest k elements

    "},{"location":"chapter_heap/top_k/#833-method-3-heap","title":"8.3.3 \u00a0 Method 3: Heap","text":"

    We can solve the Top-k problem more efficiently based on heaps, as shown in the following process.

    1. Initialize a min heap, where the top element is the smallest.
    2. First, insert the first \\(k\\) elements of the array into the heap.
    3. Starting from the \\(k + 1^{th}\\) element, if the current element is greater than the top element of the heap, remove the top element of the heap and insert the current element into the heap.
    4. After completing the traversal, the heap contains the largest \\(k\\) elements.
    <1><2><3><4><5><6><7><8><9>

    Figure 8-8 \u00a0 Find the largest k elements based on heap

    Example code is as follows:

    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
    [class]{}-[func]{top_k_heap}\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    Code Visualization

    Full Screen >

    A total of \\(n\\) rounds of heap insertions and deletions are performed, with the maximum heap size being \\(k\\), hence the time complexity is \\(O(n \\log k)\\). This method is very efficient; when \\(k\\) is small, the time complexity tends towards \\(O(n)\\); when \\(k\\) is large, the time complexity will not exceed \\(O(n \\log n)\\).

    Additionally, this method is suitable for scenarios with dynamic data streams. By continuously adding data, we can maintain the elements within the heap, thereby achieving dynamic updates of the largest \\(k\\) elements.

    "},{"location":"chapter_hello_algo/","title":"Before starting","text":"

    A few years ago, I shared the \"Sword for Offer\" problem solutions on LeetCode, receiving encouragement and support from many readers. During interactions with readers, the most common question I encountered was \"how to get started with algorithms.\" Gradually, I developed a keen interest in this question.

    Directly solving problems seems to be the most popular method \u2014 it's simple, direct, and effective. However, problem-solving is like playing a game of Minesweeper: those with strong self-study abilities can defuse the mines one by one, but those with insufficient basics might end up metaphorically bruised from explosions, retreating step by step in frustration. Going through textbooks is also common, but for those aiming for job applications, the energy spent on thesis writing, resume submissions, and preparation for written tests and interviews leaves little for tackling thick books, turning it into a daunting challenge.

    If you're facing similar troubles, then this book are lucky to have found you. This book is my answer to the question. While it may not be the best solution, it is at least a positive attempt. This book may not directly land you an offer, but it will guide you through the \"knowledge map\" in data structures and algorithms, help you understand the shapes, sizes, and locations of different \"mines,\" and enable you to master various \"demining methods.\" With these skills, I believe you can solve problems and read literature more comfortably, gradually building a knowledge system.

    I deeply agree with Professor Feynman's statement: \"Knowledge isn't free. You have to pay attention.\" In this sense, this book is not entirely \"free.\" To not disappoint the precious \"attention\" you pay for this book, I will do my best, dedicating my utmost \"attention\" to this book.

    Knowing my limitations, although the content of this book has been refined over time, there are surely many errors remaining. I sincerely request critiques and corrections from all teachers and students.

    Hello, Algo!

    The advent of computers has brought significant changes to the world. With their high-speed computing power and excellent programmability, they have become the ideal medium for executing algorithms and processing data. Whether it's the realistic graphics of video games, the intelligent decisions in autonomous driving, the brilliant Go games of AlphaGo, or the natural interactions of ChatGPT, these applications are all exquisite demonstrations of algorithms at work on computers.

    In fact, before the advent of computers, algorithms and data structures already existed in every corner of the world. Early algorithms were relatively simple, such as ancient counting methods and tool-making procedures. As civilization progressed, algorithms became more refined and complex. From the exquisite craftsmanship of artisans, to industrial products that liberate productive forces, to the scientific laws governing the universe, almost every ordinary or astonishing thing has behind it the ingenious thought of algorithms.

    Similarly, data structures are everywhere: from social networks to subway lines, many systems can be modeled as \"graphs\"; from a country to a family, the main forms of social organization exhibit characteristics of \"trees\"; winter clothes are like a \"stack\", where the first item worn is the last to be taken off; a badminton shuttle tube resembles a \"queue\", with one end for insertion and the other for retrieval; a dictionary is like a \"hash table\", enabling quick search for target entries.

    This book aims to help readers understand the core concepts of algorithms and data structures through clear, easy-to-understand animated illustrations and runnable code examples, and to be able to implement them through programming. On this basis, this book strives to reveal the vivid manifestations of algorithms in the complex world, showcasing the beauty of algorithms. I hope this book can help you!

    "},{"location":"chapter_introduction/","title":"Chapter 1. \u00a0 Encounter with algorithms","text":"

    Abstract

    A graceful maiden dances, intertwined with the data, her skirt swaying to the melody of algorithms.

    She invites you to a dance, follow her steps, and enter the world of algorithms full of logic and beauty.

    "},{"location":"chapter_introduction/#chapter-contents","title":"Chapter contents","text":"
    • 1.1 \u00a0 Algorithms are everywhere
    • 1.2 \u00a0 What is an algorithm
    • 1.3 \u00a0 Summary
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 Algorithms are everywhere","text":"

    When we hear the word \"algorithm,\" we naturally think of mathematics. However, many algorithms do not involve complex mathematics but rely more on basic logic, which can be seen everywhere in our daily lives.

    Before formally discussing algorithms, there's an interesting fact worth sharing: you have already unconsciously learned many algorithms and have become accustomed to applying them in your daily life. Here, I will give a few specific examples to prove this point.

    Example 1: Looking Up a Dictionary. In an English dictionary, words are listed alphabetically. Suppose we're searching for a word that starts with the letter \\(r\\). This is typically done in the following way:

    1. Open the dictionary to about halfway and check the first letter on the page, let's say the letter is \\(m\\).
    2. Since \\(r\\) comes after \\(m\\) in the alphabet, we can ignore the first half of the dictionary and focus on the latter half.
    3. Repeat steps 1. and 2. until you find the page where the word starts with \\(r\\).
    <1><2><3><4><5>

    Figure 1-1 \u00a0 Process of Looking Up a Dictionary

    This essential skill for elementary students, looking up a dictionary, is actually the famous \"Binary Search\" algorithm. From a data structure perspective, we can consider the dictionary as a sorted \"array\"; from an algorithmic perspective, the series of actions taken to look up a word in the dictionary can be viewed as \"Binary Search.\"

    Example 2: Organizing Playing Cards. When playing cards, we need to arrange the cards in our hand in ascending order, as shown in the following process.

    1. Divide the playing cards into \"ordered\" and \"unordered\" sections, assuming initially the leftmost card is already in order.
    2. Take out a card from the unordered section and insert it into the correct position in the ordered section; after this, the leftmost two cards are in order.
    3. Continue to repeat step 2. until all cards are in order.

    Figure 1-2 \u00a0 Playing cards sorting process

    The above method of organizing playing cards is essentially the \"Insertion Sort\" algorithm, which is very efficient for small datasets. Many programming languages' sorting functions include the insertion sort.

    Example 3: Making Change. Suppose we buy goods worth \\(69\\) yuan at a supermarket and give the cashier \\(100\\) yuan, then the cashier needs to give us \\(31\\) yuan in change. They would naturally complete the thought process as shown below.

    1. The options are currencies smaller than \\(31\\), including \\(1\\), \\(5\\), \\(10\\), and \\(20\\).
    2. Take out the largest \\(20\\) from the options, leaving \\(31 - 20 = 11\\).
    3. Take out the largest \\(10\\) from the remaining options, leaving \\(11 - 10 = 1\\).
    4. Take out the largest \\(1\\) from the remaining options, leaving \\(1 - 1 = 0\\).
    5. Complete the change-making, with the solution being \\(20 + 10 + 1 = 31\\).

    Figure 1-3 \u00a0 Change making process

    In the above steps, we make the best choice at each step (using the largest denomination possible), ultimately resulting in a feasible change-making plan. From the perspective of data structures and algorithms, this method is essentially a \"Greedy\" algorithm.

    From cooking a meal to interstellar travel, almost all problem-solving involves algorithms. The advent of computers allows us to store data structures in memory and write code to call the CPU and GPU to execute algorithms. In this way, we can transfer real-life problems to computers, solving various complex issues more efficiently.

    Tip

    If concepts such as data structures, algorithms, arrays, and binary search still seem somewhat obsecure, I encourage you to continue reading. This book will gently guide you into the realm of understanding data structures and algorithms.

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 Summary","text":"
    • Algorithms are ubiquitous in daily life and are not as inaccessible and complex as they might seem. In fact, we have already unconsciously learned many algorithms to solve various problems in life.
    • The principle of looking up a word in a dictionary is consistent with the binary search algorithm. The binary search algorithm embodies the important algorithmic concept of divide and conquer.
    • The process of organizing playing cards is very similar to the insertion sort algorithm. The insertion sort algorithm is suitable for sorting small datasets.
    • The steps of making change in currency essentially follow the greedy algorithm, where each step involves making the best possible choice at the moment.
    • An algorithm is a set of instructions or steps used to solve a specific problem within a finite amount of time, while a data structure is the way data is organized and stored in a computer.
    • Data structures and algorithms are closely linked. Data structures are the foundation of algorithms, and algorithms are the stage to utilize the functions of data structures.
    • We can liken data structures and algorithms to building blocks. The blocks represent data, the shape and connection method of the blocks represent data structures, and the steps of assembling the blocks correspond to algorithms.
    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 What is an algorithm","text":""},{"location":"chapter_introduction/what_is_dsa/#121-definition-of-an-algorithm","title":"1.2.1 \u00a0 Definition of an algorithm","text":"

    An \"algorithm\" is a set of instructions or steps to solve a specific problem within a finite amount of time. It has the following characteristics:

    • The problem is clearly defined, including unambiguous definitions of input and output.
    • The algorithm is feasible, meaning it can be completed within a finite number of steps, time, and memory space.
    • Each step has a definitive meaning. The output is consistently the same under the same inputs and conditions.
    "},{"location":"chapter_introduction/what_is_dsa/#122-definition-of-a-data-structure","title":"1.2.2 \u00a0 Definition of a data structure","text":"

    A \"data structure\" is a way of organizing and storing data in a computer, with the following design goals:

    • Minimize space occupancy to save computer memory.
    • Make data operations as fast as possible, covering data access, addition, deletion, updating, etc.
    • Provide concise data representation and logical information to enable efficient algorithm execution.

    Designing data structures is a balancing act, often requiring trade-offs. If you want to improve in one aspect, you often need to compromise in another. Here are two examples:

    • Compared to arrays, linked lists offer more convenience in data addition and deletion but sacrifice data access speed.
    • Graphs, compared to linked lists, provide richer logical information but require more memory space.
    "},{"location":"chapter_introduction/what_is_dsa/#123-relationship-between-data-structures-and-algorithms","title":"1.2.3 \u00a0 Relationship between data structures and algorithms","text":"

    As shown in the Figure 1-4 , data structures and algorithms are highly related and closely integrated, specifically in the following three aspects:

    • Data structures are the foundation of algorithms. They provide structured data storage and methods for manipulating data for algorithms.
    • Algorithms are the stage where data structures come into play. The data structure alone only stores data information; it is through the application of algorithms that specific problems can be solved.
    • Algorithms can often be implemented based on different data structures, but their execution efficiency can vary greatly. Choosing the right data structure is key.

    Figure 1-4 \u00a0 Relationship between data structures and algorithms

    Data structures and algorithms can be likened to a set of building blocks, as illustrated in the Figure 1-5 . A building block set includes numerous pieces, accompanied by detailed assembly instructions. Following these instructions step by step allows us to construct an intricate block model.

    Figure 1-5 \u00a0 Assembling blocks

    The detailed correspondence between the two is shown in the Table 1-1 .

    Table 1-1 \u00a0 Comparing data structures and algorithms to building blocks

    Data Structures and Algorithms Building Blocks Input data Unassembled blocks Data structure Organization of blocks, including shape, size, connections, etc Algorithm A series of steps to assemble the blocks into the desired shape Output data Completed Block model

    It's worth noting that data structures and algorithms are independent of programming languages. For this reason, this book is able to provide implementations in multiple programming languages.

    Conventional Abbreviation

    In real-life discussions, we often refer to \"Data Structures and Algorithms\" simply as \"Algorithms\". For example, the well-known LeetCode algorithm problems actually test both data structure and algorithm knowledge.

    "},{"location":"chapter_preface/","title":"Chapter 0. \u00a0 Preface","text":"

    Abstract

    Algorithms are like a beautiful symphony, with each line of code flowing like a rhythm.

    May this book ring softly in your mind, leaving a unique and profound melody.

    "},{"location":"chapter_preface/#chapter-contents","title":"Chapter contents","text":"
    • 0.1 \u00a0 About this book
    • 0.2 \u00a0 How to read
    • 0.3 \u00a0 Summary
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 About this book","text":"

    This open-source project aims to create a free, and beginner-friendly crash course on data structures and algorithms.

    • Using animated illustrations, it delivers structured insights into data structures and algorithmic concepts, ensuring comprehensibility and a smooth learning curve.
    • Run code with just one click, supporting Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig and other languages.
    • Readers are encouraged to engage with each other in the discussion area for each section, questions and comments are usually answered within two days.
    "},{"location":"chapter_preface/about_the_book/#011-target-audience","title":"0.1.1 \u00a0 Target audience","text":"

    If you are new to algorithms with limited exposure, or you have accumulated some experience in algorithms, but you only have a vague understanding of data structures and algorithms, and you are constantly jumping between \"yep\" and \"hmm\", then this book is for you!

    If you have already accumulated a certain amount of problem-solving experience, and are familiar with most types of problems, then this book can help you review and organize your algorithm knowledge system. The repository's source code can be used as a \"problem-solving toolkit\" or an \"algorithm cheat sheet\".

    If you are an algorithm expert, we look forward to receiving your valuable suggestions, or join us and collaborate.

    Prerequisites

    You should know how to write and read simple code in at least one programming language.

    "},{"location":"chapter_preface/about_the_book/#012-content-structure","title":"0.1.2 \u00a0 Content structure","text":"

    The main content of the book is shown in the following figure.

    • Complexity analysis: explores aspects and methods for evaluating data structures and algorithms. Covers methods of deriving time complexity and space complexity, along with common types and examples.
    • Data structures: focuses on fundamental data types, classification methods, definitions, pros and cons, common operations, types, applications, and implementation methods of data structures such as array, linked list, stack, queue, hash table, tree, heap, graph, etc.
    • Algorithms: defines algorithms, discusses their pros and cons, efficiency, application scenarios, problem-solving steps, and includes sample questions for various algorithms such as search, sorting, divide and conquer, backtracking, dynamic programming, greedy algorithms, and more.

    Figure 0-1 \u00a0 Main content of the book

    "},{"location":"chapter_preface/about_the_book/#013-acknowledgements","title":"0.1.3 \u00a0 Acknowledgements","text":"

    This book is continuously improved with the joint efforts of many contributors from the open-source community. Thanks to each writer who invested their time and energy, listed in the order generated by GitHub: krahets, codingonion, nuomi1, Gonglja, Reanon, justin-tse, danielsss, hpstory, S-N-O-R-L-A-X, night-cruise, msk397, gvenusleo, RiverTwilight, gyt95, zhuoqinyue, Zuoxun, Xia-Sang, mingXta, FangYuan33, GN-Yu, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, mgisr, JoseHung, qualifier1024, pengchzn, Guanngxu, longsizhuo, L-Super, what-is-me, yuan0221, lhxsm, Slone123c, WSL0809, longranger2, theNefelibatas, xiongsp, JeffersonHuang, hongyun-robot, K3v123, yuelinxin, a16su, gaofer, malone6, Wonderdch, xjr7670, DullSword, Horbin-Magician, NI-SW, reeswell, XC-Zero, XiaChuerwu, yd-j, iron-irax, huawuque404, MolDuM, Nigh, KorsChen, foursevenlove, 52coder, bubble9um, youshaoXG, curly210102, gltianwen, fanchenggang, Transmigration-zhou, FloranceYeh, FreddieLi, ShiMaRing, lipusheng, Javesun99, JackYang-hellobobo, shanghai-Jerry, 0130w, Keynman, psychelzh, logan-qiu, ZnYang2018, MwumLi, 1ch0, Phoenix0415, qingpeng9802, Richard-Zhang1019, QiLOL, Suremotoo, Turing-1024-Lee, Evilrabbit520, GaochaoZhu, ZJKung, linzeyan, hezhizhen, ZongYangL, beintentional, czruby, coderlef, dshlstarr, szu17dmy, fbigm, gledfish, hts0000, boloboloda, iStig, jiaxianhua, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, liuxjerry, lucaswangdev, lyl625760, chadyi, noobcodemaker, selear, siqyka, syd168, 4yDX3906, tao363, wangwang105, weibk, yabo083, yi427, yishangzhang, zhouLion, baagod, ElaBosak233, xb534, luluxia, yanedie, thomasq0, YangXuanyi and th1nk3r-ing.

    The code review work for this book was completed by codingonion, Gonglja, gvenusleo, hpstory, justin\u2010tse, krahets, night-cruise, nuomi1, and Reanon (listed in alphabetical order). Thanks to them for their time and effort, ensuring the standardization and uniformity of the code in various languages.

    Throughout the creation of this book, numerous individuals provided invaluable assistance, including but not limited to:

    • Thanks to my mentor at the company, Dr. Xi Li, who encouraged me in a conversation to \"get moving fast,\" which solidified my determination to write this book;
    • Thanks to my girlfriend Bubble, as the first reader of this book, for offering many valuable suggestions from the perspective of a beginner in algorithms, making this book more suitable for newbies;
    • Thanks to Tengbao, Qibao, and Feibao for coming up with a creative name for this book, evoking everyone's fond memories of writing their first line of code \"Hello World!\";
    • Thanks to Xiaoquan for providing professional help in intellectual property, which has played a significant role in the development of this open-source book;
    • Thanks to Sutong for designing a beautiful cover and logo for this book, and for patiently making multiple revisions under my insistence;
    • Thanks to @squidfunk for providing writing and typesetting suggestions, as well as his developed open-source documentation theme Material-for-MkDocs.

    Throughout the writing journey, I delved into numerous textbooks and articles on data structures and algorithms. These works served as exemplary models, ensuring the accuracy and quality of this book's content. I extend my gratitude to all who preceded me for their invaluable contributions!

    This book advocates a combination of hands-on and minds-on learning, inspired in this regard by \"Dive into Deep Learning\". I highly recommend this excellent book to all readers.

    Heartfelt thanks to my parents, whose ongoing support and encouragement have allowed me to do this interesting work.

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 How to read","text":"

    Tip

    For the best reading experience, it is recommended that you read through this section.

    "},{"location":"chapter_preface/suggestions/#021-writing-conventions","title":"0.2.1 \u00a0 Writing conventions","text":"
    • Chapters marked with '*' after the title are optional and contain relatively challenging content. If you are short on time, it is advisable to skip them.
    • Technical terms will be in boldface (in the print and PDF versions) or underlined (in the web version), for instance, array. It's advisable to familiarize yourself with these for better comprehension of technical texts.
    • Bolded text indicates key content or summary statements, which deserve special attention.
    • Words and phrases with specific meanings are indicated with \u201cquotation marks\u201d to avoid ambiguity.
    • When it comes to terms that are inconsistent between programming languages, this book follows Python, for example using None to mean null.
    • This book partially ignores the comment conventions for programming languages in exchange for a more compact layout of the content. The comments primarily consist of three types: title comments, content comments, and multi-line comments.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    \"\"\"Header comments for labeling functions, classes, test samples, etc\"\"\"\n\n# Comments for explaining details\n\n\"\"\"\nMultiline\ncomments\n\"\"\"\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    // Header comments for labeling functions, classes, test samples, etc\n\n// Comments for explaining details.\n\n// Multiline\n// comments\n
    "},{"location":"chapter_preface/suggestions/#022-efficient-learning-via-animated-illustrations","title":"0.2.2 \u00a0 Efficient learning via animated illustrations","text":"

    Compared with text, videos and pictures have a higher density of information and are more structured, making them easier to understand. In this book, key and difficult concepts are mainly presented through animations and illustrations, with text serving as explanations and supplements.

    When encountering content with animations or illustrations as shown in the Figure 0-2 , prioritize understanding the figure, with text as supplementary, integrating both for a comprehensive understanding.

    Figure 0-2 \u00a0 Animated illustration example

    "},{"location":"chapter_preface/suggestions/#023-deepen-understanding-through-coding-practice","title":"0.2.3 \u00a0 Deepen understanding through coding practice","text":"

    The source code of this book is hosted on the GitHub Repository. As shown in the Figure 0-3 , the source code comes with test examples and can be executed with just a single click.

    If time permits, it's recommended to type out the code yourself. If pressed for time, at least read and run all the codes.

    Compared to just reading code, writing code often yields more learning. Learning by doing is the real way to learn.

    Figure 0-3 \u00a0 Running code example

    Setting up to run the code involves three main steps.

    Step 1: Install a local programming environment. Follow the tutorial in the appendix for installation, or skip this step if already installed.

    Step 2: Clone or download the code repository. Visit the GitHub Repository.

    If Git is installed, use the following command to clone the repository:

    git clone https://github.com/krahets/hello-algo.git\n

    Alternatively, you can also click the \"Download ZIP\" button at the location shown in the Figure 0-4 to directly download the code as a compressed ZIP file. Then, you can simply extract it locally.

    Figure 0-4 \u00a0 Cloning repository and downloading code

    Step 3: Run the source code. As shown in the Figure 0-5 , for the code block labeled with the file name at the top, we can find the corresponding source code file in the codes folder of the repository. These files can be executed with a single click, which will help you save unnecessary debugging time and allow you to focus on learning.

    Figure 0-5 \u00a0 Code block and corresponding source code file

    "},{"location":"chapter_preface/suggestions/#024-learning-together-in-discussion","title":"0.2.4 \u00a0 Learning together in discussion","text":"

    While reading this book, please don't skip over the points that you didn't learn. Feel free to post your questions in the comment section. We will be happy to answer them and can usually respond within two days.

    As illustrated in the Figure 0-6 , each chapter features a comment section at the bottom. I encourage you to pay attention to these comments. They not only expose you to others' encountered problems, aiding in identifying knowledge gaps and sparking deeper contemplation, but also invite you to generously contribute by answering fellow readers' inquiries, sharing insights, and fostering mutual improvement.

    Figure 0-6 \u00a0 Comment section example

    "},{"location":"chapter_preface/suggestions/#025-algorithm-learning-path","title":"0.2.5 \u00a0 Algorithm learning path","text":"

    Overall, the journey of mastering data structures and algorithms can be divided into three stages:

    1. Stage 1: Introduction to algorithms. We need to familiarize ourselves with the characteristics and usage of various data structures and learn about the principles, processes, uses, and efficiency of different algorithms.
    2. Stage 2: Practicing algorithm problems. It is recommended to start from popular problems, such as Sword for Offer and LeetCode Hot 100, and accumulate at least 100 questions to familiarize yourself with mainstream algorithmic problems. Forgetfulness can be a challenge when you start practicing, but rest assured that this is normal. We can follow the \"Ebbinghaus Forgetting Curve\" to review the questions, and usually after 3~5 rounds of repetitions, we will be able to memorize them.
    3. Stage 3: Building the knowledge system. In terms of learning, we can read algorithm column articles, solution frameworks, and algorithm textbooks to continuously enrich the knowledge system. In terms of practicing, we can try advanced strategies, such as categorizing by topic, multiple solutions for a single problem, and one solution for multiple problems, etc. Insights on these strategies can be found in various communities.

    As shown in the Figure 0-7 , this book mainly covers \u201cStage 1,\u201d aiming to help you more efficiently embark on Stages 2 and 3.

    Figure 0-7 \u00a0 Algorithm learning path

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 Summary","text":"
    • The main audience of this book is beginners in algorithm. If you already have some basic knowledge, this book can help you systematically review your algorithm knowledge, and the source code in this book can also be used as a \"Coding Toolkit\".
    • The book consists of three main sections, Complexity Analysis, Data Structures, and Algorithms, covering most of the topics in the field.
    • For newcomers to algorithms, it is crucial to read an introductory book in the beginning stages to avoid many detours or common pitfalls.
    • Animations and figures within the book are usually used to introduce key points and difficult knowledge. These should be given more attention when reading the book.
    • Practice is the best way to learn programming. It is highly recommended that you run the source code and type in the code yourself.
    • Each chapter in the web version of this book features a discussion section, and you are welcome to share your questions and insights at any time.
    "},{"location":"chapter_stack_and_queue/","title":"Chapter 5. \u00a0 Stack and queue","text":"

    Abstract

    A stack is like cats placed on top of each other, while a queue is like cats lined up one by one.

    They represent the logical relationships of Last-In-First-Out (LIFO) and First-In-First-Out (FIFO), respectively.

    "},{"location":"chapter_stack_and_queue/#chapter-contents","title":"Chapter contents","text":"
    • 5.1 \u00a0 Stack
    • 5.2 \u00a0 Queue
    • 5.3 \u00a0 Double-ended queue
    • 5.4 \u00a0 Summary
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 Double-ended queue","text":"

    In a queue, we can only delete elements from the head or add elements to the tail. As shown in the following diagram, a \"double-ended queue (deque)\" offers more flexibility, allowing the addition or removal of elements at both the head and the tail.

    Figure 5-7 \u00a0 Operations in double-ended queue

    "},{"location":"chapter_stack_and_queue/deque/#531-common-operations-in-double-ended-queue","title":"5.3.1 \u00a0 Common operations in double-ended queue","text":"

    The common operations in a double-ended queue are listed below, and the names of specific methods depend on the programming language used.

    Table 5-3 \u00a0 Efficiency of double-ended queue operations

    Method Name Description Time Complexity pushFirst() Add an element to the head \\(O(1)\\) pushLast() Add an element to the tail \\(O(1)\\) popFirst() Remove the first element \\(O(1)\\) popLast() Remove the last element \\(O(1)\\) peekFirst() Access the first element \\(O(1)\\) peekLast() Access the last element \\(O(1)\\)

    Similarly, we can directly use the double-ended queue classes implemented in programming languages:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig deque.py
    from collections import deque\n\n# Initialize the deque\ndeque: deque[int] = deque()\n\n# Enqueue elements\ndeque.append(2)      # Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # Add to the head\ndeque.appendleft(1)\n\n# Access elements\nfront: int = deque[0]  # The first element\nrear: int = deque[-1]  # The last element\n\n# Dequeue elements\npop_front: int = deque.popleft()  # The first element dequeued\npop_rear: int = deque.pop()       # The last element dequeued\n\n# Get the length of the deque\nsize: int = len(deque)\n\n# Check if the deque is empty\nis_empty: bool = len(deque) == 0\n
    deque.cpp
    /* Initialize the deque */\ndeque<int> deque;\n\n/* Enqueue elements */\ndeque.push_back(2);   // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nint front = deque.front(); // The first element\nint back = deque.back();   // The last element\n\n/* Dequeue elements */\ndeque.pop_front();  // The first element dequeued\ndeque.pop_back();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nbool empty = deque.empty();\n
    deque.java
    /* Initialize the deque */\nDeque<Integer> deque = new LinkedList<>();\n\n/* Enqueue elements */\ndeque.offerLast(2);   // Add to the tail\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // Add to the head\ndeque.offerFirst(1);\n\n/* Access elements */\nint peekFirst = deque.peekFirst();  // The first element\nint peekLast = deque.peekLast();    // The last element\n\n/* Dequeue elements */\nint popFirst = deque.pollFirst();  // The first element dequeued\nint popLast = deque.pollLast();    // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* Initialize the deque */\n// In C#, LinkedList is used as a deque\nLinkedList<int> deque = new();\n\n/* Enqueue elements */\ndeque.AddLast(2);   // Add to the tail\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // Add to the head\ndeque.AddFirst(1);\n\n/* Access elements */\nint peekFirst = deque.First.Value;  // The first element\nint peekLast = deque.Last.Value;    // The last element\n\n/* Dequeue elements */\ndeque.RemoveFirst();  // The first element dequeued\ndeque.RemoveLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.Count;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* Initialize the deque */\n// In Go, use list as a deque\ndeque := list.New()\n\n/* Enqueue elements */\ndeque.PushBack(2)      // Add to the tail\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // Add to the head\ndeque.PushFront(1)\n\n/* Access elements */\nfront := deque.Front() // The first element\nrear := deque.Back()   // The last element\n\n/* Dequeue elements */\ndeque.Remove(front)    // The first element dequeued\ndeque.Remove(rear)     // The last element dequeued\n\n/* Get the length of the deque */\nsize := deque.Len()\n\n/* Check if the deque is empty */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* Initialize the deque */\n// Swift does not have a built-in deque class, so Array can be used as a deque\nvar deque: [Int] = []\n\n/* Enqueue elements */\ndeque.append(2) // Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // Add to the head\ndeque.insert(1, at: 0)\n\n/* Access elements */\nlet peekFirst = deque.first! // The first element\nlet peekLast = deque.last!   // The last element\n\n/* Dequeue elements */\n// Using Array, popFirst has a complexity of O(n)\nlet popFirst = deque.removeFirst() // The first element dequeued\nlet popLast = deque.removeLast()   // The last element dequeued\n\n/* Get the length of the deque */\nlet size = deque.count\n\n/* Check if the deque is empty */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* Initialize the deque */\n// JavaScript does not have a built-in deque, so Array is used as a deque\nconst deque = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst = deque[0]; // The first element\nconst peekLast = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront = deque.shift(); // The first element dequeued\nconst popBack = deque.pop();    // The last element dequeued\n\n/* Get the length of the deque */\nconst size = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty = size === 0;\n
    deque.ts
    /* Initialize the deque */\n// TypeScript does not have a built-in deque, so Array is used as a deque\nconst deque: number[] = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst: number = deque[0]; // The first element\nconst peekLast: number = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront: number = deque.shift() as number; // The first element dequeued\nconst popBack: number = deque.pop() as number;    // The last element dequeued\n\n/* Get the length of the deque */\nconst size: number = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* Initialize the deque */\n// In Dart, Queue is defined as a deque\nQueue<int> deque = Queue<int>();\n\n/* Enqueue elements */\ndeque.addLast(2);  // Add to the tail\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // Add to the head\ndeque.addFirst(1);\n\n/* Access elements */\nint peekFirst = deque.first; // The first element\nint peekLast = deque.last;   // The last element\n\n/* Dequeue elements */\nint popFirst = deque.removeFirst(); // The first element dequeued\nint popLast = deque.removeLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.length;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* Initialize the deque */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(2);  // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nif let Some(front) = deque.front() { // The first element\n}\nif let Some(rear) = deque.back() {   // The last element\n}\n\n/* Dequeue elements */\nif let Some(pop_front) = deque.pop_front() { // The first element dequeued\n}\nif let Some(pop_rear) = deque.pop_back() {   // The last element dequeued\n}\n\n/* Get the length of the deque */\nlet size = deque.len();\n\n/* Check if the deque is empty */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C does not provide a built-in deque\n
    deque.kt
    \n
    deque.zig
    \n
    Visualizing Code

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E9%98%9F%0A%20%20%20%20deq.append%282%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E5%B0%BE%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E9%A6%96%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%AE%BF%E9%97%AE%E5%85%83%E7%B4%A0%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%20front%20%3D%22,%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%20rear%20%3D%22,%20rear%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_front%20%3D%22,%20pop_front%29%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_rear%20%3D%22,%20pop_rear%29%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E7%9A%84%E9%95%BF%E5%BA%A6%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E9%95%BF%E5%BA%A6%20size%20%3D%22,%20size%29%0A%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%20%3D%22,%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_stack_and_queue/deque/#532-implementing-a-double-ended-queue","title":"5.3.2 \u00a0 Implementing a double-ended queue *","text":"

    The implementation of a double-ended queue is similar to that of a regular queue, it can be based on either a linked list or an array as the underlying data structure.

    "},{"location":"chapter_stack_and_queue/deque/#1-implementation-based-on-doubly-linked-list","title":"1. \u00a0 Implementation based on doubly linked list","text":"

    Recall from the previous section that we used a regular singly linked list to implement a queue, as it conveniently allows for deleting from the head (corresponding to the dequeue operation) and adding new elements after the tail (corresponding to the enqueue operation).

    For a double-ended queue, both the head and the tail can perform enqueue and dequeue operations. In other words, a double-ended queue needs to implement operations in the opposite direction as well. For this, we use a \"doubly linked list\" as the underlying data structure of the double-ended queue.

    As shown in the Figure 5-8 , we treat the head and tail nodes of the doubly linked list as the front and rear of the double-ended queue, respectively, and implement the functionality to add and remove nodes at both ends.

    LinkedListDequepushLast()pushFirst()popLast()popFirst()

    Figure 5-8 \u00a0 Implementing Double-Ended Queue with Doubly Linked List for Enqueue and Dequeue Operations

    The implementation code is as follows:

    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-implementation-based-on-array","title":"2. \u00a0 Implementation based on array","text":"

    As shown in the Figure 5-9 , similar to implementing a queue with an array, we can also use a circular array to implement a double-ended queue.

    ArrayDequepushLast()pushFirst()popLast()popFirst()

    Figure 5-9 \u00a0 Implementing Double-Ended Queue with Array for Enqueue and Dequeue Operations

    The implementation only needs to add methods for \"front enqueue\" and \"rear dequeue\":

    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-applications-of-double-ended-queue","title":"5.3.3 \u00a0 Applications of double-ended queue","text":"

    The double-ended queue combines the logic of both stacks and queues, thus, it can implement all their respective use cases while offering greater flexibility.

    We know that software's \"undo\" feature is typically implemented using a stack: the system pushes each change operation onto the stack and then pops to implement undoing. However, considering the limitations of system resources, software often restricts the number of undo steps (for example, only allowing the last 50 steps). When the stack length exceeds 50, the software needs to perform a deletion operation at the bottom of the stack (the front of the queue). But a regular stack cannot perform this function, where a double-ended queue becomes necessary. Note that the core logic of \"undo\" still follows the Last-In-First-Out principle of a stack, but a double-ended queue can more flexibly implement some additional logic.

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 Queue","text":"

    \"Queue\" is a linear data structure that follows the First-In-First-Out (FIFO) rule. As the name suggests, a queue simulates the phenomenon of lining up, where newcomers join the queue at the rear, and the person at the front leaves the queue first.

    As shown in the Figure 5-4 , we call the front of the queue the \"head\" and the back the \"tail.\" The operation of adding elements to the rear of the queue is termed \"enqueue,\" and the operation of removing elements from the front is termed \"dequeue.\"

    Figure 5-4 \u00a0 Queue's first-in-first-out rule

    "},{"location":"chapter_stack_and_queue/queue/#521-common-operations-on-queue","title":"5.2.1 \u00a0 Common operations on queue","text":"

    The common operations on a queue are shown in the Table 5-2 . Note that method names may vary across different programming languages. Here, we use the same naming convention as that used for stacks.

    Table 5-2 \u00a0 Efficiency of queue operations

    Method Name Description Time Complexity push() Enqueue an element, add it to the tail \\(O(1)\\) pop() Dequeue the head element \\(O(1)\\) peek() Access the head element \\(O(1)\\)

    We can directly use the ready-made queue classes in programming languages:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig queue.py
    from collections import deque\n\n# Initialize the queue\n# In Python, we generally use the deque class as a queue\n# Although queue.Queue() is a pure queue class, it's not very user-friendly, so it's not recommended\nque: deque[int] = deque()\n\n# Enqueue elements\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# Access the first element\nfront: int = que[0]\n\n# Dequeue an element\npop: int = que.popleft()\n\n# Get the length of the queue\nsize: int = len(que)\n\n# Check if the queue is empty\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* Initialize the queue */\nqueue<int> queue;\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element*/\nint front = queue.front();\n\n/* Dequeue an element */\nqueue.pop();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nbool empty = queue.empty();\n
    queue.java
    /* Initialize the queue */\nQueue<Integer> queue = new LinkedList<>();\n\n/* Enqueue elements */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* Access the first element */\nint peek = queue.peek();\n\n/* Dequeue an element */\nint pop = queue.poll();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* Initialize the queue */\nQueue<int> queue = new();\n\n/* Enqueue elements */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* Access the first element */\nint peek = queue.Peek();\n\n/* Dequeue an element */\nint pop = queue.Dequeue();\n\n/* Get the length of the queue */\nint size = queue.Count;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* Initialize the queue */\n// In Go, use list as a queue\nqueue := list.New()\n\n/* Enqueue elements */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* Access the first element */\npeek := queue.Front()\n\n/* Dequeue an element */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* Get the length of the queue */\nsize := queue.Len()\n\n/* Check if the queue is empty */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* Initialize the queue */\n// Swift does not have a built-in queue class, so Array can be used as a queue\nvar queue: [Int] = []\n\n/* Enqueue elements */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* Access the first element */\nlet peek = queue.first!\n\n/* Dequeue an element */\n// Since it's an array, removeFirst has a complexity of O(n)\nlet pool = queue.removeFirst()\n\n/* Get the length of the queue */\nlet size = queue.count\n\n/* Check if the queue is empty */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* Initialize the queue */\n// JavaScript does not have a built-in queue, so Array can be used as a queue\nconst queue = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
    queue.ts
    /* Initialize the queue */\n// TypeScript does not have a built-in queue, so Array can be used as a queue \nconst queue: number[] = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
    queue.dart
    /* Initialize the queue */\n// In Dart, the Queue class is a double-ended queue but can be used as a queue\nQueue<int> queue = Queue();\n\n/* Enqueue elements */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* Access the first element */\nint peek = queue.first;\n\n/* Dequeue an element */\nint pop = queue.removeFirst();\n\n/* Get the length of the queue */\nint size = queue.length;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* Initialize the double-ended queue */\n// In Rust, use a double-ended queue as a regular queue\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* Access the first element */\nif let Some(front) = deque.front() {\n}\n\n/* Dequeue an element */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* Get the length of the queue */\nlet size = deque.len();\n\n/* Check if the queue is empty */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C does not provide a built-in queue\n
    queue.kt
    \n
    queue.zig
    \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/queue/#522-implementing-a-queue","title":"5.2.2 \u00a0 Implementing a queue","text":"

    To implement a queue, we need a data structure that allows adding elements at one end and removing them at the other. Both linked lists and arrays meet this requirement.

    "},{"location":"chapter_stack_and_queue/queue/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

    As shown in the Figure 5-5 , we can consider the \"head node\" and \"tail node\" of a linked list as the \"front\" and \"rear\" of the queue, respectively. It is stipulated that nodes can only be added at the rear and removed at the front.

    LinkedListQueuepush()pop()

    Figure 5-5 \u00a0 Implementing Queue with Linked List for Enqueue and Dequeue Operations

    Below is the code for implementing a queue using a linked list:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/queue/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

    Deleting the first element in an array has a time complexity of \\(O(n)\\), which would make the dequeue operation inefficient. However, this problem can be cleverly avoided as follows.

    We use a variable front to indicate the index of the front element and maintain a variable size to record the queue's length. Define rear = front + size, which points to the position immediately following the tail element.

    With this design, the effective interval of elements in the array is [front, rear - 1]. The implementation methods for various operations are shown in the Figure 5-6 .

    • Enqueue operation: Assign the input element to the rear index and increase size by 1.
    • Dequeue operation: Simply increase front by 1 and decrease size by 1.

    Both enqueue and dequeue operations only require a single operation, each with a time complexity of \\(O(1)\\).

    ArrayQueuepush()pop()

    Figure 5-6 \u00a0 Implementing Queue with Array for Enqueue and Dequeue Operations

    You might notice a problem: as enqueue and dequeue operations are continuously performed, both front and rear move to the right and will eventually reach the end of the array and can't move further. To resolve this, we can treat the array as a \"circular array\" where connecting the end of the array back to its beginning.

    In a circular array, front or rear needs to loop back to the start of the array upon reaching the end. This cyclical pattern can be achieved with a \"modulo operation\" as shown in the code below:

    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
    Code Visualization

    Full Screen >

    The above implementation of the queue still has its limitations: its length is fixed. However, this issue is not difficult to resolve. We can replace the array with a dynamic array that can expand itself if needed. Interested readers can try to implement this themselves.

    The comparison of the two implementations is consistent with that of the stack and is not repeated here.

    "},{"location":"chapter_stack_and_queue/queue/#523-typical-applications-of-queue","title":"5.2.3 \u00a0 Typical applications of queue","text":"
    • Amazon orders: After shoppers place orders, these orders join a queue, and the system processes them in order. During events like Singles' Day, a massive number of orders are generated in a short time, making high concurrency a key challenge for engineers.
    • Various to-do lists: Any scenario requiring a \"first-come, first-served\" functionality, such as a printer's task queue or a restaurant's food delivery queue, can effectively maintain the order of processing with a queue.
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 Stack","text":"

    A \"Stack\" is a linear data structure that follows the principle of Last-In-First-Out (LIFO).

    We can compare a stack to a pile of plates on a table. To access the bottom plate, one must first remove the plates on top. By replacing the plates with various types of elements (such as integers, characters, objects, etc.), we obtain the data structure known as a stack.

    As shown in the Figure 5-1 , we refer to the top of the pile of elements as the \"top of the stack\" and the bottom as the \"bottom of the stack.\" The operation of adding elements to the top of the stack is called \"push,\" and the operation of removing the top element is called \"pop.\"

    Figure 5-1 \u00a0 Stack's last-in-first-out rule

    "},{"location":"chapter_stack_and_queue/stack/#511-common-operations-on-stack","title":"5.1.1 \u00a0 Common operations on stack","text":"

    The common operations on a stack are shown in the Table 5-1 . The specific method names depend on the programming language used. Here, we use push(), pop(), and peek() as examples.

    Table 5-1 \u00a0 Efficiency of stack operations

    Method Description Time Complexity push() Push an element onto the stack (add to the top) \\(O(1)\\) pop() Pop the top element from the stack \\(O(1)\\) peek() Access the top element of the stack \\(O(1)\\)

    Typically, we can directly use the stack class built into the programming language. However, some languages may not specifically provide a stack class. In these cases, we can use the language's \"array\" or \"linked list\" as a stack and ignore operations that are not related to stack logic in the program.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig stack.py
    # Initialize the stack\n# Python does not have a built-in stack class, so a list can be used as a stack\nstack: list[int] = []\n\n# Push elements onto the stack\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# Access the top element of the stack\npeek: int = stack[-1]\n\n# Pop an element from the stack\npop: int = stack.pop()\n\n# Get the length of the stack\nsize: int = len(stack)\n\n# Check if the stack is empty\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* Initialize the stack */\nstack<int> stack;\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint top = stack.top();\n\n/* Pop an element from the stack */\nstack.pop(); // No return value\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nbool empty = stack.empty();\n
    stack.java
    /* Initialize the stack */\nStack<Integer> stack = new Stack<>();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint peek = stack.peek();\n\n/* Pop an element from the stack */\nint pop = stack.pop();\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* Initialize the stack */\nStack<int> stack = new();\n\n/* Push elements onto the stack */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* Access the top element of the stack */\nint peek = stack.Peek();\n\n/* Pop an element from the stack */\nint pop = stack.Pop();\n\n/* Get the length of the stack */\nint size = stack.Count;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* Initialize the stack */\n// In Go, it is recommended to use a Slice as a stack\nvar stack []int\n\n/* Push elements onto the stack */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* Access the top element of the stack */\npeek := stack[len(stack)-1]\n\n/* Pop an element from the stack */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* Get the length of the stack */\nsize := len(stack)\n\n/* Check if the stack is empty */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* Initialize the stack */\n// Swift does not have a built-in stack class, so Array can be used as a stack\nvar stack: [Int] = []\n\n/* Push elements onto the stack */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* Access the top element of the stack */\nlet peek = stack.last!\n\n/* Pop an element from the stack */\nlet pop = stack.removeLast()\n\n/* Get the length of the stack */\nlet size = stack.count\n\n/* Check if the stack is empty */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* Initialize the stack */\n// JavaScript does not have a built-in stack class, so Array can be used as a stack\nconst stack = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length-1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* Initialize the stack */\n// TypeScript does not have a built-in stack class, so Array can be used as a stack\nconst stack: number[] = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length - 1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* Initialize the stack */\n// Dart does not have a built-in stack class, so List can be used as a stack\nList<int> stack = [];\n\n/* Push elements onto the stack */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* Access the top element of the stack */\nint peek = stack.last;\n\n/* Pop an element from the stack */\nint pop = stack.removeLast();\n\n/* Get the length of the stack */\nint size = stack.length;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* Initialize the stack */\n// Use Vec as a stack\nlet mut stack: Vec<i32> = Vec::new();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nlet top = stack.last().unwrap();\n\n/* Pop an element from the stack */\nlet pop = stack.pop().unwrap();\n\n/* Get the length of the stack */\nlet size = stack.len();\n\n/* Check if the stack is empty */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C does not provide a built-in stack\n
    stack.kt
    \n
    stack.zig
    \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#512-implementing-a-stack","title":"5.1.2 \u00a0 Implementing a stack","text":"

    To gain a deeper understanding of how a stack operates, let's try implementing a stack class ourselves.

    A stack follows the principle of Last-In-First-Out, which means we can only add or remove elements at the top of the stack. However, both arrays and linked lists allow adding and removing elements at any position, therefore a stack can be seen as a restricted array or linked list. In other words, we can \"shield\" certain irrelevant operations of an array or linked list, aligning their external behavior with the characteristics of a stack.

    "},{"location":"chapter_stack_and_queue/stack/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

    When implementing a stack using a linked list, we can consider the head node of the list as the top of the stack and the tail node as the bottom of the stack.

    As shown in the Figure 5-2 , for the push operation, we simply insert elements at the head of the linked list. This method of node insertion is known as \"head insertion.\" For the pop operation, we just need to remove the head node from the list.

    LinkedListStackpush()pop()

    Figure 5-2 \u00a0 Implementing Stack with Linked List for Push and Pop Operations

    Below is an example code for implementing a stack based on a linked list:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

    When implementing a stack using an array, we can consider the end of the array as the top of the stack. As shown in the Figure 5-3 , push and pop operations correspond to adding and removing elements at the end of the array, respectively, both with a time complexity of \\(O(1)\\).

    ArrayStackpush()pop()

    Figure 5-3 \u00a0 Implementing Stack with Array for Push and Pop Operations

    Since the elements to be pushed onto the stack may continuously increase, we can use a dynamic array, thus avoiding the need to handle array expansion ourselves. Here is an example code:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#513-comparison-of-the-two-implementations","title":"5.1.3 \u00a0 Comparison of the two implementations","text":"

    Supported Operations

    Both implementations support all the operations defined in a stack. The array implementation additionally supports random access, but this is beyond the scope of a stack definition and is generally not used.

    Time Efficiency

    In the array-based implementation, both push and pop operations occur in pre-allocated contiguous memory, which has good cache locality and therefore higher efficiency. However, if the push operation exceeds the array capacity, it triggers a resizing mechanism, making the time complexity of that push operation \\(O(n)\\).

    In the linked list implementation, list expansion is very flexible, and there is no efficiency decrease issue as in array expansion. However, the push operation requires initializing a node object and modifying pointers, so its efficiency is relatively lower. If the elements being pushed are already node objects, then the initialization step can be skipped, improving efficiency.

    Thus, when the elements for push and pop operations are basic data types like int or double, we can draw the following conclusions:

    • The array-based stack implementation's efficiency decreases during expansion, but since expansion is a low-frequency operation, its average efficiency is higher.
    • The linked list-based stack implementation provides more stable efficiency performance.

    Space Efficiency

    When initializing a list, the system allocates an \"initial capacity,\" which might exceed the actual need; moreover, the expansion mechanism usually increases capacity by a specific factor (like doubling), which may also exceed the actual need. Therefore, the array-based stack might waste some space.

    However, since linked list nodes require extra space for storing pointers, the space occupied by linked list nodes is relatively larger.

    In summary, we cannot simply determine which implementation is more memory-efficient. It requires analysis based on specific circumstances.

    "},{"location":"chapter_stack_and_queue/stack/#514-typical-applications-of-stack","title":"5.1.4 \u00a0 Typical applications of stack","text":"
    • Back and forward in browsers, undo and redo in software. Every time we open a new webpage, the browser pushes the previous page onto the stack, allowing us to go back to the previous page through the back operation, which is essentially a pop operation. To support both back and forward, two stacks are needed to work together.
    • Memory management in programs. Each time a function is called, the system adds a stack frame at the top of the stack to record the function's context information. In recursive functions, the downward recursion phase keeps pushing onto the stack, while the upward backtracking phase keeps popping from the stack.
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 Summary","text":""},{"location":"chapter_stack_and_queue/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Stack is a data structure that follows the Last-In-First-Out (LIFO) principle and can be implemented using arrays or linked lists.
    • In terms of time efficiency, the array implementation of the stack has a higher average efficiency. However, during expansion, the time complexity for a single push operation can degrade to \\(O(n)\\). In contrast, the linked list implementation of a stack offers more stable efficiency.
    • Regarding space efficiency, the array implementation of the stack may lead to a certain degree of space wastage. However, it's important to note that the memory space occupied by nodes in a linked list is generally larger than that for elements in an array.
    • A queue is a data structure that follows the First-In-First-Out (FIFO) principle, and it can also be implemented using arrays or linked lists. The conclusions regarding time and space efficiency for queues are similar to those for stacks.
    • A double-ended queue (deque) is a more flexible type of queue that allows adding and removing elements at both ends.
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the browser's forward and backward functionality implemented with a doubly linked list?

    A browser's forward and backward navigation is essentially a manifestation of the \"stack\" concept. When a user visits a new page, the page is added to the top of the stack; when they click the back button, the page is popped from the top of the stack. A double-ended queue (deque) can conveniently implement some additional operations, as mentioned in the \"Double-Ended Queue\" section.

    Q: After popping from a stack, is it necessary to free the memory of the popped node?

    If the popped node will still be used later, it's not necessary to free its memory. In languages like Java and Python that have automatic garbage collection, manual memory release is not necessary; in C and C++, manual memory release is required.

    Q: A double-ended queue seems like two stacks joined together. What are its uses?

    A double-ended queue, which is a combination of a stack and a queue or two stacks joined together, exhibits both stack and queue logic. Thus, it can implement all applications of stacks and queues while offering more flexibility.

    Q: How exactly are undo and redo implemented?

    Undo and redo operations are implemented using two stacks: Stack A for undo and Stack B for redo.

    1. Each time a user performs an operation, it is pushed onto Stack A, and Stack B is cleared.
    2. When the user executes an \"undo\", the most recent operation is popped from Stack A and pushed onto Stack B.
    3. When the user executes a \"redo\", the most recent operation is popped from Stack B and pushed back onto Stack A.
    "},{"location":"chapter_tree/","title":"Chapter 7. \u00a0 Tree","text":"

    Abstract

    The towering tree, full of vitality with its roots deep and leaves lush, branches spreading wide.

    It vividly demonstrates the form of data divide-and-conquer.

    "},{"location":"chapter_tree/#chapter-contents","title":"Chapter contents","text":"
    • 7.1 \u00a0 Binary tree
    • 7.2 \u00a0 Binary tree Traversal
    • 7.3 \u00a0 Array Representation of tree
    • 7.4 \u00a0 Binary Search tree
    • 7.5 \u00a0 AVL tree *
    • 7.6 \u00a0 Summary
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 Array representation of binary trees","text":"

    Under the linked list representation, the storage unit of a binary tree is a node TreeNode, with nodes connected by pointers. The basic operations of binary trees under the linked list representation were introduced in the previous section.

    So, can we use an array to represent a binary tree? The answer is yes.

    "},{"location":"chapter_tree/array_representation_of_tree/#731-representing-perfect-binary-trees","title":"7.3.1 \u00a0 Representing perfect binary trees","text":"

    Let's analyze a simple case first. Given a perfect binary tree, we store all nodes in an array according to the order of level-order traversal, where each node corresponds to a unique array index.

    Based on the characteristics of level-order traversal, we can deduce a \"mapping formula\" between the index of a parent node and its children: If a node's index is \\(i\\), then the index of its left child is \\(2i + 1\\) and the right child is \\(2i + 2\\). The Figure 7-12 shows the mapping relationship between the indices of various nodes.

    Figure 7-12 \u00a0 Array representation of a perfect binary tree

    The mapping formula plays a role similar to the node references (pointers) in linked lists. Given any node in the array, we can access its left (right) child node using the mapping formula.

    "},{"location":"chapter_tree/array_representation_of_tree/#732-representing-any-binary-tree","title":"7.3.2 \u00a0 Representing any binary tree","text":"

    Perfect binary trees are a special case; there are often many None values in the middle levels of a binary tree. Since the sequence of level-order traversal does not include these None values, we cannot solely rely on this sequence to deduce the number and distribution of None values. This means that multiple binary tree structures can match the same level-order traversal sequence.

    As shown in the Figure 7-13 , given a non-perfect binary tree, the above method of array representation fails.

    Figure 7-13 \u00a0 Level-order traversal sequence corresponds to multiple binary tree possibilities

    To solve this problem, we can consider explicitly writing out all None values in the level-order traversal sequence. As shown in the following figure, after this treatment, the level-order traversal sequence can uniquely represent a binary tree. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # Array representation of a binary tree\n# Using None to represent empty slots\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* Array representation of a binary tree */\n// Using the maximum integer value INT_MAX to mark empty slots\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* Array representation of a binary tree */\n// Using the Integer wrapper class allows for using null to mark empty slots\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using an any type slice, allowing for nil to mark empty slots\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* Array representation of a binary tree */\n// Using optional Int (Int?) allows for using nil to mark empty slots\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using None to mark empty slots\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
    /* Array representation of a binary tree */\n// Using the maximum int value to mark empty slots, therefore, node values must not be 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
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nval tree = mutableListOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    \n
    \n

    Figure 7-14 \u00a0 Array representation of any type of binary tree

    It's worth noting that complete binary trees are very suitable for array representation. Recalling the definition of a complete binary tree, None appears only at the bottom level and towards the right, meaning all None values definitely appear at the end of the level-order traversal sequence.

    This means that when using an array to represent a complete binary tree, it's possible to omit storing all None values, which is very convenient. The Figure 7-15 gives an example.

    Figure 7-15 \u00a0 Array representation of a complete binary tree

    The following code implements a binary tree based on array representation, including the following operations:

    • Given a node, obtain its value, left (right) child node, and parent node.
    • Obtain the preorder, inorder, postorder, and level-order traversal sequences.
    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:\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
    [class]{ArrayBinaryTree}-[func]{}\n
    array_binary_tree.zig
    [class]{ArrayBinaryTree}-[func]{}\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/array_representation_of_tree/#733-advantages-and-limitations","title":"7.3.3 \u00a0 Advantages and limitations","text":"

    The array representation of binary trees has the following advantages:

    • Arrays are stored in contiguous memory spaces, which is cache-friendly and allows for faster access and traversal.
    • It does not require storing pointers, which saves space.
    • It allows random access to nodes.

    However, the array representation also has some limitations:

    • Array storage requires contiguous memory space, so it is not suitable for storing trees with a large amount of data.
    • Adding or deleting nodes requires array insertion and deletion operations, which are less efficient.
    • When there are many None values in the binary tree, the proportion of node data contained in the array is low, leading to lower space utilization.
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL tree *","text":"

    In the \"Binary Search Tree\" section, we mentioned that after multiple insertions and removals, a binary search tree might degrade to a linked list. In such cases, the time complexity of all operations degrades from \\(O(\\log n)\\) to \\(O(n)\\).

    As shown in the Figure 7-24 , after two node removal operations, this binary search tree will degrade into a linked list.

    Figure 7-24 \u00a0 Degradation of an AVL tree after removing nodes

    For example, in the perfect binary tree shown in the Figure 7-25 , after inserting two nodes, the tree will lean heavily to the left, and the time complexity of search operations will also degrade.

    Figure 7-25 \u00a0 Degradation of an AVL tree after inserting nodes

    In 1962, G. M. Adelson-Velsky and E. M. Landis proposed the \"AVL Tree\" in their paper \"An algorithm for the organization of information\". The paper detailed a series of operations to ensure that after continuously adding and removing nodes, the AVL tree would not degrade, thus maintaining the time complexity of various operations at \\(O(\\log n)\\) level. In other words, in scenarios where frequent additions, removals, searches, and modifications are needed, the AVL tree can always maintain efficient data operation performance, which has great application value.

    "},{"location":"chapter_tree/avl_tree/#751-common-terminology-in-avl-trees","title":"7.5.1 \u00a0 Common terminology in AVL trees","text":"

    An AVL tree is both a binary search tree and a balanced binary tree, satisfying all properties of these two types of binary trees, hence it is a \"balanced binary search tree\".

    "},{"location":"chapter_tree/avl_tree/#1-node-height","title":"1. \u00a0 Node height","text":"

    Since the operations related to AVL trees require obtaining node heights, we need to add a height variable to the node class:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # Node value\n        self.height: int = 0                # Node height\n        self.left: TreeNode | None = None   # Left child reference\n        self.right: TreeNode | None = None  # Right child reference\n
    /* AVL tree node */\nstruct TreeNode {\n    int val{};          // Node value\n    int height = 0;     // Node height\n    TreeNode *left{};   // Left child\n    TreeNode *right{};  // Right child\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL tree node */\nclass TreeNode {\n    public int val;        // Node value\n    public int height;     // Node height\n    public TreeNode left;  // Left child\n    public TreeNode right; // Right child\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public int height;      // Node height\n    public TreeNode? left;  // Left child reference\n    public TreeNode? right; // Right child reference\n}\n
    /* AVL tree node */\ntype TreeNode struct {\n    Val    int       // Node value\n    Height int       // Node height\n    Left   *TreeNode // Left child reference\n    Right  *TreeNode // Right child reference\n}\n
    /* AVL tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var height: Int // Node height\n    var left: TreeNode? // Left child\n    var right: TreeNode? // Right child\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL tree node */\nclass TreeNode {\n    val; // Node value\n    height; // Node height\n    left; // Left child pointer\n    right; // Right child pointer\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 tree node */\nclass TreeNode {\n    val: number;            // Node value\n    height: number;         // Node height\n    left: TreeNode | null;  // Left child pointer\n    right: TreeNode | null; // Right child pointer\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 tree node */\nclass TreeNode {\n  int val;         // Node value\n  int height;      // Node height\n  TreeNode? left;  // Left child\n  TreeNode? right; // Right child\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    height: i32,                            // Node height\n    left: Option<Rc<RefCell<TreeNode>>>,    // Left child\n    right: Option<Rc<RefCell<TreeNode>>>,   // Right child\n}\n\nimpl TreeNode {\n    /* Constructor */\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 tree node */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* Constructor */\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 tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val height: Int = 0          // Node height\n    val left: TreeNode? = null   // Left child\n    val right: TreeNode? = null  // Right child\n}\n
    \n
    \n

    The \"node height\" refers to the distance from that node to its farthest leaf node, i.e., the number of \"edges\" passed. It is important to note that the height of a leaf node is \\(0\\), and the height of a null node is \\(-1\\). We will create two utility functions for getting and updating the height of a node:

    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
    [class]{AVLTree}-[func]{height}\n\n[class]{AVLTree}-[func]{update_height}\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-node-balance-factor","title":"2. \u00a0 Node balance factor","text":"

    The \"balance factor\" of a node is defined as the height of the node's left subtree minus the height of its right subtree, with the balance factor of a null node defined as \\(0\\). We will also encapsulate the functionality of obtaining the node balance factor into a function for easy use later on:

    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
    [class]{AVLTree}-[func]{balance_factor}\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

    Note

    Let the balance factor be \\(f\\), then the balance factor of any node in an AVL tree satisfies \\(-1 \\le f \\le 1\\).

    "},{"location":"chapter_tree/avl_tree/#752-rotations-in-avl-trees","title":"7.5.2 \u00a0 Rotations in AVL trees","text":"

    The characteristic feature of an AVL tree is the \"rotation\" operation, which can restore balance to an unbalanced node without affecting the in-order traversal sequence of the binary tree. In other words, the rotation operation can maintain the property of a \"binary search tree\" while also turning the tree back into a \"balanced binary tree\".

    We call nodes with an absolute balance factor \\(> 1\\) \"unbalanced nodes\". Depending on the type of imbalance, there are four kinds of rotations: right rotation, left rotation, right-left rotation, and left-right rotation. Below, we detail these rotation operations.

    "},{"location":"chapter_tree/avl_tree/#1-right-rotation","title":"1. \u00a0 Right rotation","text":"

    As shown in the Figure 7-26 , the first unbalanced node from the bottom up in the binary tree is \"node 3\". Focusing on the subtree with this unbalanced node as the root, denoted as node, and its left child as child, perform a \"right rotation\". After the right rotation, the subtree is balanced again while still maintaining the properties of a binary search tree.

    <1><2><3><4>

    Figure 7-26 \u00a0 Steps of right rotation

    As shown in the Figure 7-27 , when the child node has a right child (denoted as grand_child), a step needs to be added in the right rotation: set grand_child as the left child of node.

    Figure 7-27 \u00a0 Right rotation with grand_child

    \"Right rotation\" is a figurative term; in practice, it is achieved by modifying node pointers, as shown in the following code:

    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
    [class]{AVLTree}-[func]{right_rotate}\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-left-rotation","title":"2. \u00a0 Left rotation","text":"

    Correspondingly, if considering the \"mirror\" of the above unbalanced binary tree, the \"left rotation\" operation shown in the Figure 7-28 needs to be performed.

    Figure 7-28 \u00a0 Left rotation operation

    Similarly, as shown in the Figure 7-29 , when the child node has a left child (denoted as grand_child), a step needs to be added in the left rotation: set grand_child as the right child of node.

    Figure 7-29 \u00a0 Left rotation with grand_child

    It can be observed that the right and left rotation operations are logically symmetrical, and they solve two symmetrical types of imbalance. Based on symmetry, by replacing all left with right, and all right with left in the implementation code of right rotation, we can get the implementation code for left rotation:

    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
    [class]{AVLTree}-[func]{left_rotate}\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-right-left-rotation","title":"3. \u00a0 Right-left rotation","text":"

    For the unbalanced node 3 shown in the Figure 7-30 , using either left or right rotation alone cannot restore balance to the subtree. In this case, a \"left rotation\" needs to be performed on child first, followed by a \"right rotation\" on node.

    Figure 7-30 \u00a0 Right-left rotation

    "},{"location":"chapter_tree/avl_tree/#4-left-right-rotation","title":"4. \u00a0 Left-right rotation","text":"

    As shown in the Figure 7-31 , for the mirror case of the above unbalanced binary tree, a \"right rotation\" needs to be performed on child first, followed by a \"left rotation\" on node.

    Figure 7-31 \u00a0 Left-right rotation

    "},{"location":"chapter_tree/avl_tree/#5-choice-of-rotation","title":"5. \u00a0 Choice of rotation","text":"

    The four kinds of imbalances shown in the Figure 7-32 correspond to the cases described above, respectively requiring right rotation, left-right rotation, right-left rotation, and left rotation.

    Figure 7-32 \u00a0 The four rotation cases of AVL tree

    As shown in the Table 7-3 , we determine which of the above cases an unbalanced node belongs to by judging the sign of the balance factor of the unbalanced node and its higher-side child's balance factor.

    Table 7-3 \u00a0 Conditions for Choosing Among the Four Rotation Cases

    Balance factor of unbalanced node Balance factor of child node Rotation method to use \\(> 1\\) (Left-leaning tree) \\(\\geq 0\\) Right rotation \\(> 1\\) (Left-leaning tree) \\(<0\\) Left rotation then right rotation \\(< -1\\) (Right-leaning tree) \\(\\leq 0\\) Left rotation \\(< -1\\) (Right-leaning tree) \\(>0\\) Right rotation then left rotation

    For convenience, we encapsulate the rotation operations into a function. With this function, we can perform rotations on various kinds of imbalances, restoring balance to unbalanced nodes. The code is as follows:

    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
    [class]{AVLTree}-[func]{rotate}\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-common-operations-in-avl-trees","title":"7.5.3 \u00a0 Common operations in AVL trees","text":""},{"location":"chapter_tree/avl_tree/#1-node-insertion","title":"1. \u00a0 Node insertion","text":"

    The node insertion operation in AVL trees is similar to that in binary search trees. The only difference is that after inserting a node in an AVL tree, a series of unbalanced nodes may appear along the path from that node to the root node. Therefore, we need to start from this node and perform rotation operations upwards to restore balance to all unbalanced nodes. The code is as follows:

    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
    [class]{AVLTree}-[func]{insert}\n\n[class]{AVLTree}-[func]{insert_helper}\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-node-removal","title":"2. \u00a0 Node removal","text":"

    Similarly, based on the method of removing nodes in binary search trees, rotation operations need to be performed from the bottom up to restore balance to all unbalanced nodes. The code is as follows:

    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
    [class]{AVLTree}-[func]{remove}\n\n[class]{AVLTree}-[func]{remove_helper}\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-node-search","title":"3. \u00a0 Node search","text":"

    The node search operation in AVL trees is consistent with that in binary search trees and will not be detailed here.

    "},{"location":"chapter_tree/avl_tree/#754-typical-applications-of-avl-trees","title":"7.5.4 \u00a0 Typical applications of AVL trees","text":"
    • Organizing and storing large amounts of data, suitable for scenarios with high-frequency searches and low-frequency intertions and removals.
    • Used to build index systems in databases.
    • Red-black trees are also a common type of balanced binary search tree. Compared to AVL trees, red-black trees have more relaxed balancing conditions, require fewer rotations for node insertion and removal, and have a higher average efficiency for node addition and removal operations.
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 Binary search tree","text":"

    As shown in the Figure 7-16 , a \"binary search tree\" satisfies the following conditions.

    1. For the root node, the value of all nodes in the left subtree < the value of the root node < the value of all nodes in the right subtree.
    2. The left and right subtrees of any node are also binary search trees, i.e., they satisfy condition 1. as well.

    Figure 7-16 \u00a0 Binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#741-operations-on-a-binary-search-tree","title":"7.4.1 \u00a0 Operations on a binary search tree","text":"

    We encapsulate the binary search tree as a class BinarySearchTree and declare a member variable root, pointing to the tree's root node.

    "},{"location":"chapter_tree/binary_search_tree/#1-searching-for-a-node","title":"1. \u00a0 Searching for a node","text":"

    Given a target node value num, one can search according to the properties of the binary search tree. As shown in the Figure 7-17 , we declare a node cur and start from the binary tree's root node root, looping to compare the size relationship between the node value cur.val and num.

    • If cur.val < num, it means the target node is in cur's right subtree, thus execute cur = cur.right.
    • If cur.val > num, it means the target node is in cur's left subtree, thus execute cur = cur.left.
    • If cur.val = num, it means the target node is found, exit the loop and return the node.
    <1><2><3><4>

    Figure 7-17 \u00a0 Example of searching for a node in a binary search tree

    The search operation in a binary search tree works on the same principle as the binary search algorithm, eliminating half of the possibilities in each round. The number of loops is at most the height of the binary tree. When the binary tree is balanced, it uses \\(O(\\log n)\\) time. Example code is as follows:

    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
    [class]{BinarySearchTree}-[func]{search}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_search_tree/#2-inserting-a-node","title":"2. \u00a0 Inserting a node","text":"

    Given an element num to be inserted, to maintain the property of the binary search tree \"left subtree < root node < right subtree,\" the insertion operation proceeds as shown in the Figure 7-18 .

    1. Finding the insertion position: Similar to the search operation, start from the root node and loop downwards according to the size relationship between the current node value and num until passing through the leaf node (traversing to None) then exit the loop.
    2. Insert the node at that position: Initialize the node num and place it where None was.

    Figure 7-18 \u00a0 Inserting a node into a binary search tree

    In the code implementation, note the following two points.

    • The binary search tree does not allow duplicate nodes; otherwise, it will violate its definition. Therefore, if the node to be inserted already exists in the tree, the insertion is not performed, and it directly returns.
    • To perform the insertion operation, we need to use the node pre to save the node from the last loop. This way, when traversing to None, we can get its parent node, thus completing the node insertion operation.
    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
    [class]{BinarySearchTree}-[func]{insert}\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
    Code Visualization

    Full Screen >

    Similar to searching for a node, inserting a node uses \\(O(\\log n)\\) time.

    "},{"location":"chapter_tree/binary_search_tree/#3-removing-a-node","title":"3. \u00a0 Removing a node","text":"

    First, find the target node in the binary tree, then remove it. Similar to inserting a node, we need to ensure that after the removal operation is completed, the property of the binary search tree \"left subtree < root node < right subtree\" is still satisfied. Therefore, based on the number of child nodes of the target node, we divide it into 0, 1, and 2 cases, performing the corresponding node removal operations.

    As shown in the Figure 7-19 , when the degree of the node to be removed is \\(0\\), it means the node is a leaf node, and it can be directly removed.

    Figure 7-19 \u00a0 Removing a node in a binary search tree (degree 0)

    As shown in the Figure 7-20 , when the degree of the node to be removed is \\(1\\), replacing the node to be removed with its child node is sufficient.

    Figure 7-20 \u00a0 Removing a node in a binary search tree (degree 1)

    When the degree of the node to be removed is \\(2\\), we cannot remove it directly, but need to use a node to replace it. To maintain the property of the binary search tree \"left subtree < root node < right subtree,\" this node can be either the smallest node of the right subtree or the largest node of the left subtree.

    Assuming we choose the smallest node of the right subtree (the next node in in-order traversal), then the removal operation proceeds as shown in the Figure 7-21 .

    1. Find the next node in the \"in-order traversal sequence\" of the node to be removed, denoted as tmp.
    2. Replace the value of the node to be removed with tmp's value, and recursively remove the node tmp in the tree.
    <1><2><3><4>

    Figure 7-21 \u00a0 Removing a node in a binary search tree (degree 2)

    The operation of removing a node also uses \\(O(\\log n)\\) time, where finding the node to be removed requires \\(O(\\log n)\\) time, and obtaining the in-order traversal successor node requires \\(O(\\log n)\\) time. Example code is as follows:

    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
    [class]{BinarySearchTree}-[func]{remove}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_search_tree/#4-in-order-traversal-is-ordered","title":"4. \u00a0 In-order traversal is ordered","text":"

    As shown in the Figure 7-22 , the in-order traversal of a binary tree follows the \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\" traversal order, and a binary search tree satisfies the size relationship \"left child node < root node < right child node\".

    This means that in-order traversal in a binary search tree always traverses the next smallest node first, thus deriving an important property: The in-order traversal sequence of a binary search tree is ascending.

    Using the ascending property of in-order traversal, obtaining ordered data in a binary search tree requires only \\(O(n)\\) time, without the need for additional sorting operations, which is very efficient.

    Figure 7-22 \u00a0 In-order traversal sequence of a binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#742-efficiency-of-binary-search-trees","title":"7.4.2 \u00a0 Efficiency of binary search trees","text":"

    Given a set of data, we consider using an array or a binary search tree for storage. Observing the Table 7-2 , the operations on a binary search tree all have logarithmic time complexity, which is stable and efficient. Only in scenarios of high-frequency addition and low-frequency search and removal, arrays are more efficient than binary search trees.

    Table 7-2 \u00a0 Efficiency comparison between arrays and search trees

    Unsorted array Binary search tree Search element \\(O(n)\\) \\(O(\\log n)\\) Insert element \\(O(1)\\) \\(O(\\log n)\\) Remove element \\(O(n)\\) \\(O(\\log n)\\)

    In ideal conditions, the binary search tree is \"balanced,\" thus any node can be found within \\(\\log n\\) loops.

    However, continuously inserting and removing nodes in a binary search tree may lead to the binary tree degenerating into a chain list as shown in the Figure 7-23 , at which point the time complexity of various operations also degrades to \\(O(n)\\).

    Figure 7-23 \u00a0 Degradation of a binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#743-common-applications-of-binary-search-trees","title":"7.4.3 \u00a0 Common applications of binary search trees","text":"
    • Used as multi-level indexes in systems to implement efficient search, insertion, and removal operations.
    • Serves as the underlying data structure for certain search algorithms.
    • Used to store data streams to maintain their ordered state.
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 Binary tree","text":"

    A \"binary tree\" is a non-linear data structure that represents the ancestral and descendent relationships, embodying the \"divide and conquer\" logic. Similar to a linked list, the basic unit of a binary tree is a node, each containing a value, a reference to the left child node, and a reference to the right child node.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"Binary tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.left: TreeNode | None = None  # Reference to left child node\n        self.right: TreeNode | None = None # Reference to right child node\n
    /* Binary tree node */\nstruct TreeNode {\n    int val;          // Node value\n    TreeNode *left;   // Pointer to left child node\n    TreeNode *right;  // Pointer to right child node\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* Binary tree node */\nclass TreeNode {\n    int val;         // Node value\n    TreeNode left;   // Reference to left child node\n    TreeNode right;  // Reference to right child node\n    TreeNode(int x) { val = x; }\n}\n
    /* Binary tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public TreeNode? left;  // Reference to left child node\n    public TreeNode? right; // Reference to right child node\n}\n
    /* Binary tree node */\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, // Pointer to left child node\n        Right: nil, // Pointer to right child node\n        Val:   v,   // Node value\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var left: TreeNode? // Reference to left child node\n    var right: TreeNode? // Reference to right child node\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n    val; // Node value\n    left; // Pointer to left child node\n    right; // Pointer to right child node\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
    /* Binary tree node */\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; // Node value\n        this.left = left === undefined ? null : left; // Reference to left child node\n        this.right = right === undefined ? null : right; // Reference to right child node\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n  int val;         // Node value\n  TreeNode? left;  // Reference to left child node\n  TreeNode? right; // Reference to right child node\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Binary tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    left: Option<Rc<RefCell<TreeNode>>>,    // Reference to left child node\n    right: Option<Rc<RefCell<TreeNode>>>,   // Reference to right child node\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
    /* Binary tree node */\ntypedef struct TreeNode {\n    int val;                // Node value\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // Pointer to left child node\n    struct TreeNode *right; // Pointer to right child node\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
    /* Binary tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val left: TreeNode? = null   // Reference to left child node\n    val right: TreeNode? = null  // Reference to right child node\n}\n
    \n
    \n

    Each node has two references (pointers), pointing to the \"left-child node\" and \"right-child node,\" respectively. This node is called the \"parent node\" of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes under it the \"left subtree\" of this node. Similarly, the \"right subtree\" can be defined.

    In a binary tree, except for leaf nodes, all other nodes contain child nodes and non-empty subtrees. As shown in the Figure 7-1 , if \"Node 2\" is considered as the parent node, then its left and right child nodes are \"Node 4\" and \"Node 5,\" respectively. The left subtree is \"the tree formed by Node 4 and all nodes under it,\" and the right subtree is \"the tree formed by Node 5 and all nodes under it.\"

    Figure 7-1 \u00a0 Parent Node, child Node, subtree

    "},{"location":"chapter_tree/binary_tree/#711-common-terminology-of-binary-trees","title":"7.1.1 \u00a0 Common terminology of binary trees","text":"

    The commonly used terminology of binary trees is shown in the following figure.

    • \"Root node\": The node at the top level of the binary tree, which has no parent node.
    • \"Leaf node\": A node with no children, both of its pointers point to None.
    • \"Edge\": The line segment connecting two nodes, i.e., node reference (pointer).
    • The \"level\" of a node: Incrementing from top to bottom, with the root node's level being 1.
    • The \"degree\" of a node: The number of a node's children. In a binary tree, the degree can be 0, 1, or 2.
    • The \"height\" of a binary tree: The number of edges passed from the root node to the farthest leaf node.
    • The \"depth\" of a node: The number of edges passed from the root node to the node.
    • The \"height\" of a node: The number of edges from the farthest leaf node to the node.

    Figure 7-2 \u00a0 Common Terminology of Binary Trees

    Tip

    Please note that we usually define \"height\" and \"depth\" as \"the number of edges passed,\" but some problems or textbooks may define them as \"the number of nodes passed.\" In this case, both height and depth need to be incremented by 1.

    "},{"location":"chapter_tree/binary_tree/#712-basic-operations-of-binary-trees","title":"7.1.2 \u00a0 Basic operations of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-initializing-a-binary-tree","title":"1. \u00a0 Initializing a binary tree","text":"

    Similar to a linked list, initialize nodes first, then construct references (pointers).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # Initializing a binary tree\n# Initializing nodes\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* Initializing a binary tree */\n// Initializing nodes\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// Linking references (pointers) between nodes\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // Initializing nodes\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// Linking references (pointers) between nodes\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
    /* Initializing a binary tree */\n// Initializing nodes\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // Initializing nodes\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    Code visualization

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_tree/binary_tree/#2-inserting-and-removing-nodes","title":"2. \u00a0 Inserting and removing nodes","text":"

    Similar to a linked list, inserting and removing nodes in a binary tree can be achieved by modifying pointers. The Figure 7-3 provides an example.

    Figure 7-3 \u00a0 Inserting and removing nodes in a binary tree

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # Inserting and removing nodes\np = TreeNode(0)\n# Inserting node P between n1 -> n2\nn1.left = p\np.left = n2\n# Removing node P\nn1.left = n2\n
    binary_tree.cpp
    /* Inserting and removing nodes */\nTreeNode* P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.cs
    /* Inserting and removing nodes */\nTreeNode P = new(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.go
    /* Inserting and removing nodes */\n// Inserting node P between n1 and n2\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// Removing node P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
    binary_tree.js
    /* Inserting and removing nodes */\nlet P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.ts
    /* Inserting and removing nodes */\nconst P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.dart
    /* Inserting and removing nodes */\nTreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// Inserting node P between n1 and n2\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// Removing node P\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* Inserting and removing nodes */\nTreeNode *P = newTreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    Code visualization

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%E6%8F%92%E5%85%A5%E4%B8%8E%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%E5%9C%A8%20n1%20-%3E%20n2%20%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    Note

    It's important to note that inserting nodes may change the original logical structure of the binary tree, while removing nodes usually means removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a set of operations to achieve meaningful actions.

    "},{"location":"chapter_tree/binary_tree/#713-common-types-of-binary-trees","title":"7.1.3 \u00a0 Common types of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-perfect-binary-tree","title":"1. \u00a0 Perfect binary tree","text":"

    As shown in the Figure 7-4 , in a \"perfect binary tree,\" all levels of nodes are fully filled. In a perfect binary tree, the degree of leaf nodes is \\(0\\), and the degree of all other nodes is \\(2\\); if the tree's height is \\(h\\), then the total number of nodes is \\(2^{h+1} - 1\\), showing a standard exponential relationship, reflecting the common phenomenon of cell division in nature.

    Tip

    Please note that in the Chinese community, a perfect binary tree is often referred to as a \"full binary tree.\"

    Figure 7-4 \u00a0 Perfect binary tree

    "},{"location":"chapter_tree/binary_tree/#2-complete-binary-tree","title":"2. \u00a0 Complete binary tree","text":"

    As shown in the Figure 7-5 , a \"complete binary tree\" has only the bottom level nodes not fully filled, and the bottom level nodes are filled as far left as possible.

    Figure 7-5 \u00a0 Complete binary tree

    "},{"location":"chapter_tree/binary_tree/#3-full-binary-tree","title":"3. \u00a0 Full binary tree","text":"

    As shown in the Figure 7-6 , a \"full binary tree\" has all nodes except leaf nodes having two children.

    Figure 7-6 \u00a0 Full binary tree

    "},{"location":"chapter_tree/binary_tree/#4-balanced-binary-tree","title":"4. \u00a0 Balanced binary tree","text":"

    As shown in the Figure 7-7 , in a \"balanced binary tree,\" the absolute difference in height between the left and right subtrees of any node does not exceed 1.

    Figure 7-7 \u00a0 Balanced binary tree

    "},{"location":"chapter_tree/binary_tree/#714-degeneration-of-binary-trees","title":"7.1.4 \u00a0 Degeneration of binary trees","text":"

    The Figure 7-8 shows the ideal and degenerate structures of binary trees. When every level of a binary tree is filled, it reaches the \"perfect binary tree\"; when all nodes are biased towards one side, the binary tree degenerates into a \"linked list\".

    • The perfect binary tree is the ideal situation, fully leveraging the \"divide and conquer\" advantage of binary trees.
    • A linked list is another extreme, where operations become linear, degrading the time complexity to \\(O(n)\\).

    Figure 7-8 \u00a0 The Best and Worst Structures of Binary Trees

    As shown in the Table 7-1 , in the best and worst structures, the number of leaf nodes, total number of nodes, and height of the binary tree reach their maximum or minimum values.

    Table 7-1 \u00a0 The Best and Worst Structures of Binary Trees

    Perfect binary tree Linked list Number of nodes at level \\(i\\) \\(2^{i-1}\\) \\(1\\) Number of leaf nodes in a tree with height \\(h\\) \\(2^h\\) \\(1\\) Total number of nodes in a tree with height \\(h\\) \\(2^{h+1} - 1\\) \\(h + 1\\) Height of a tree with \\(n\\) total nodes \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 Binary tree traversal","text":"

    From the perspective of physical structure, a tree is a data structure based on linked lists, hence its traversal method involves accessing nodes one by one through pointers. However, a tree is a non-linear data structure, which makes traversing a tree more complex than traversing a linked list, requiring the assistance of search algorithms to achieve.

    Common traversal methods for binary trees include level-order traversal, preorder traversal, inorder traversal, and postorder traversal, among others.

    "},{"location":"chapter_tree/binary_tree_traversal/#721-level-order-traversal","title":"7.2.1 \u00a0 Level-order traversal","text":"

    As shown in the Figure 7-9 , \"level-order traversal\" traverses the binary tree from top to bottom, layer by layer, and accesses nodes in each layer in a left-to-right order.

    Level-order traversal essentially belongs to \"breadth-first traversal\", also known as \"breadth-first search (BFS)\", which embodies a \"circumferentially outward expanding\" layer-by-layer traversal method.

    Figure 7-9 \u00a0 Level-order traversal of a binary tree

    "},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation","title":"1. \u00a0 Code implementation","text":"

    Breadth-first traversal is usually implemented with the help of a \"queue\". The queue follows the \"first in, first out\" rule, while breadth-first traversal follows the \"layer-by-layer progression\" rule, the underlying ideas of the two are consistent. The implementation code is as follows:

    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
    [class]{}-[func]{level_order}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"
    • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time, where \\(n\\) is the number of nodes.
    • Space complexity is \\(O(n)\\): In the worst case, i.e., a full binary tree, before traversing to the lowest level, the queue can contain at most \\((n + 1) / 2\\) nodes at the same time, occupying \\(O(n)\\) space.
    "},{"location":"chapter_tree/binary_tree_traversal/#722-preorder-inorder-and-postorder-traversal","title":"7.2.2 \u00a0 Preorder, inorder, and postorder traversal","text":"

    Correspondingly, preorder, inorder, and postorder traversal all belong to \"depth-first traversal\", also known as \"depth-first search (DFS)\", which embodies a \"proceed to the end first, then backtrack and continue\" traversal method.

    The Figure 7-10 shows the working principle of performing a depth-first traversal on a binary tree. Depth-first traversal is like walking around the perimeter of the entire binary tree, encountering three positions at each node, corresponding to preorder traversal, inorder traversal, and postorder traversal.

    Figure 7-10 \u00a0 Preorder, inorder, and postorder traversal of a binary search tree

    "},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation_1","title":"1. \u00a0 Code implementation","text":"

    Depth-first search is usually implemented based on recursion:

    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
    [class]{}-[func]{pre_order}\n\n[class]{}-[func]{in_order}\n\n[class]{}-[func]{post_order}\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
    Code Visualization

    Full Screen >

    Tip

    Depth-first search can also be implemented based on iteration, interested readers can study this on their own.

    The Figure 7-11 shows the recursive process of preorder traversal of a binary tree, which can be divided into two opposite parts: \"recursion\" and \"return\".

    1. \"Recursion\" means starting a new method, the program accesses the next node in this process.
    2. \"Return\" means the function returns, indicating the current node has been fully accessed.
    <1><2><3><4><5><6><7><8><9><10><11>

    Figure 7-11 \u00a0 The recursive process of preorder traversal

    "},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"
    • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time.
    • Space complexity is \\(O(n)\\): In the worst case, i.e., the tree degrades into a linked list, the recursion depth reaches \\(n\\), the system occupies \\(O(n)\\) stack frame space.
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 Summary","text":""},{"location":"chapter_tree/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A binary tree is a non-linear data structure that reflects the \"divide and conquer\" logic of splitting one into two. Each binary tree node contains a value and two pointers, which point to its left and right child nodes, respectively.
    • For a node in a binary tree, the tree formed by its left (right) child node and all nodes under it is called the node's left (right) subtree.
    • Related terminology of binary trees includes root node, leaf node, level, degree, edge, height, and depth, among others.
    • The operations of initializing a binary tree, inserting nodes, and removing nodes are similar to those of linked list operations.
    • Common types of binary trees include perfect binary trees, complete binary trees, full binary trees, and balanced binary trees. The perfect binary tree represents the ideal state, while the linked list is the worst state after degradation.
    • A binary tree can be represented using an array by arranging the node values and empty slots in a level-order traversal sequence and implementing pointers based on the index mapping relationship between parent nodes and child nodes.
    • The level-order traversal of a binary tree is a breadth-first search method, which reflects a layer-by-layer traversal manner of \"expanding circle by circle.\" It is usually implemented using a queue.
    • Pre-order, in-order, and post-order traversals are all depth-first search methods, reflecting the traversal manner of \"going to the end first, then backtracking to continue.\" They are usually implemented using recursion.
    • A binary search tree is an efficient data structure for element searching, with the time complexity of search, insert, and remove operations all being \\(O(\\log n)\\). When a binary search tree degrades into a linked list, these time complexities deteriorate to \\(O(n)\\).
    • An AVL tree, also known as a balanced binary search tree, ensures that the tree remains balanced after continuous node insertions and removals through rotation operations.
    • Rotation operations in an AVL tree include right rotation, left rotation, right-then-left rotation, and left-then-right rotation. After inserting or removing nodes, an AVL tree performs rotation operations from bottom to top to rebalance the tree.
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: For a binary tree with only one node, are both the height of the tree and the depth of the root node \\(0\\)?

    Yes, because height and depth are typically defined as \"the number of edges passed.\"

    Q: The insertion and removal in a binary tree are generally completed by a set of operations. What does \"a set of operations\" refer to here? Can it be understood as the release of resources of the child nodes?

    Taking the binary search tree as an example, the operation of removing a node needs to be handled in three different scenarios, each requiring multiple steps of node operations.

    Q: Why are there three sequences: pre-order, in-order, and post-order for DFS traversal of a binary tree, and what are their uses?

    Similar to sequential and reverse traversal of arrays, pre-order, in-order, and post-order traversals are three methods of traversing a binary tree, allowing us to obtain a traversal result in a specific order. For example, in a binary search tree, since the node sizes satisfy left child node value < root node value < right child node value, we can obtain an ordered node sequence by traversing the tree in the \"left \u2192 root \u2192 right\" priority.

    Q: In a right rotation operation that deals with the relationship between the imbalance nodes node, child, grand_child, isn't the connection between node and its parent node and the original link of node lost after the right rotation?

    We need to view this problem from a recursive perspective. The right_rotate(root) operation passes the root node of the subtree and eventually returns the root node of the rotated subtree with return child. The connection between the subtree's root node and its parent node is established after this function returns, which is outside the scope of the right rotation operation's maintenance.

    Q: In C++, functions are divided into private and public sections. What considerations are there for this? Why are the height() function and the updateHeight() function placed in public and private, respectively?

    It depends on the scope of the method's use. If a method is only used within the class, then it is designed to be private. For example, it makes no sense for users to call updateHeight() on their own, as it is just a step in the insertion or removal operations. However, height() is for accessing node height, similar to vector.size(), thus it is set to public for use.

    Q: How do you build a binary search tree from a set of input data? Is the choice of root node very important?

    Yes, the method for building the tree is provided in the build_tree() method in the binary search tree code. As for the choice of the root node, we usually sort the input data and then select the middle element as the root node, recursively building the left and right subtrees. This approach maximizes the balance of the tree.

    Q: In Java, do you always have to use the equals() method for string comparison?

    In Java, for primitive data types, == is used to compare whether the values of two variables are equal. For reference types, the working principles of the two symbols are different.

    • ==: Used to compare whether two variables point to the same object, i.e., whether their positions in memory are the same.
    • equals(): Used to compare whether the values of two objects are equal.

    Therefore, to compare values, we should use equals(). However, strings initialized with String a = \"hi\"; String b = \"hi\"; are stored in the string constant pool and point to the same object, so a == b can also be used to compare the contents of two strings.

    Q: Before reaching the bottom level, is the number of nodes in the queue \\(2^h\\) in breadth-first traversal?

    Yes, for example, a full binary tree with height \\(h = 2\\) has a total of \\(n = 7\\) nodes, then the bottom level has \\(4 = 2^h = (n + 1) / 2\\) nodes.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"chapter_array_and_linkedlist/","title":"Chapter 4. \u00a0 Arrays and linked lists","text":"

    Abstract

    The world of data structures resembles a sturdy brick wall.

    In arrays, envision bricks snugly aligned, each resting seamlessly beside the next, creating a unified formation. Meanwhile, in linked lists, these bricks disperse freely, embraced by vines gracefully knitting connections between them.

    "},{"location":"chapter_array_and_linkedlist/#chapter-contents","title":"Chapter contents","text":"
    • 4.1 \u00a0 Array
    • 4.2 \u00a0 Linked list
    • 4.3 \u00a0 List
    • 4.4 \u00a0 Memory and cache
    • 4.5 \u00a0 Summary
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 Array","text":"

    An \"array\" is a linear data structure that operates as a lineup of similar items, stored together in a computer's memory in contiguous spaces. It's like a sequence that maintains organized storage. Each item in this lineup has its unique 'spot' known as an \"index\". Please refer to the Figure 4-1 to observe how arrays work and grasp these key terms.

    Figure 4-1 \u00a0 Array definition and storage method

    "},{"location":"chapter_array_and_linkedlist/array/#411-common-operations-on-arrays","title":"4.1.1 \u00a0 Common operations on arrays","text":""},{"location":"chapter_array_and_linkedlist/array/#1-initializing-arrays","title":"1. \u00a0 Initializing arrays","text":"

    Arrays can be initialized in two ways depending on the needs: either without initial values or with specified initial values. When initial values are not specified, most programming languages will set the array elements to \\(0\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig array.py
    # Initialize array\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]\n
    array.cpp
    /* Initialize array */\n// Stored on stack\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// Stored on heap (manual memory release needed)\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* Initialize array */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* Initialize array */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* Initialize array */\nvar arr [5]int\n// In Go, specifying the length ([5]int) denotes an array, while not specifying it ([]int) denotes a slice.\n// Since Go's arrays are designed to have compile-time fixed length, only constants can be used to specify the length.\n// For convenience in implementing the extend() method, the Slice will be considered as an Array here.\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* Initialize array */\nlet arr = Array(repeating: 0, count: 5) // [0, 0, 0, 0, 0]\nlet nums = [1, 3, 2, 5, 4]\n
    array.js
    /* Initialize array */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* Initialize array */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* Initialize array */\nList<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]\nList<int> nums = [1, 3, 2, 5, 4];\n
    array.rs
    /* Initialize array */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* Initialize array */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    \n
    array.zig
    // Initialize array\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    "},{"location":"chapter_array_and_linkedlist/array/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

    Elements in an array are stored in contiguous memory spaces, making it simpler to compute each element's memory address. The formula shown in the Figure below aids in determining an element's memory address, utilizing the array's memory address (specifically, the first element's address) and the element's index. This computation streamlines direct access to the desired element.

    Figure 4-2 \u00a0 Memory address calculation for array elements

    As observed in the above illustration, array indexing conventionally begins at \\(0\\). While this might appear counterintuitive, considering counting usually starts at \\(1\\), within the address calculation formula, an index is essentially an offset from the memory address. For the first element's address, this offset is \\(0\\), validating its index as \\(0\\).

    Accessing elements in an array is highly efficient, allowing us to randomly access any element in \\(O(1)\\) time.

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#3-inserting-elements","title":"3. \u00a0 Inserting elements","text":"

    Array elements are tightly packed in memory, with no space available to accommodate additional data between them. Illustrated in Figure below, inserting an element in the middle of an array requires shifting all subsequent elements back by one position to create room for the new element.

    Figure 4-3 \u00a0 Array element insertion example

    It's important to note that due to the fixed length of an array, inserting an element will unavoidably result in the loss of the last element in the array. Solutions to address this issue will be explored in the \"List\" chapter.

    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 Vec<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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#4-deleting-elements","title":"4. \u00a0 Deleting elements","text":"

    Similarly, as depicted in the Figure 4-4 , to delete an element at index \\(i\\), all elements following index \\(i\\) must be moved forward by one position.

    Figure 4-4 \u00a0 Array element deletion example

    Please note that after deletion, the former last element becomes \"meaningless,\" hence requiring no specific modification.

    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 Vec<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
    Code Visualization

    Full Screen >

    In summary, the insertion and deletion operations in arrays present the following disadvantages:

    • High time complexity: Both insertion and deletion in an array have an average time complexity of \\(O(n)\\), where \\(n\\) is the length of the array.
    • Loss of elements: Due to the fixed length of arrays, elements that exceed the array's capacity are lost during insertion.
    • Waste of memory: Initializing a longer array and utilizing only the front part results in \"meaningless\" end elements during insertion, leading to some wasted memory space.
    "},{"location":"chapter_array_and_linkedlist/array/#5-traversing-arrays","title":"5. \u00a0 Traversing arrays","text":"

    In most programming languages, we can traverse an array either by using indices or by directly iterating over each element:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#6-finding-elements","title":"6. \u00a0 Finding elements","text":"

    Locating a specific element within an array involves iterating through the array, checking each element to determine if it matches the desired value.

    Because arrays are linear data structures, this operation is commonly referred to as \"linear search.\"

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#7-expanding-arrays","title":"7. \u00a0 Expanding arrays","text":"

    In complex system environments, ensuring the availability of memory space after an array for safe capacity extension becomes challenging. Consequently, in most programming languages, the length of an array is immutable.

    To expand an array, it's necessary to create a larger array and then copy the elements from the original array. This operation has a time complexity of \\(O(n)\\) and can be time-consuming for large arrays. The code are as follows:

    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: Vec<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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/array/#412-advantages-and-limitations-of-arrays","title":"4.1.2 \u00a0 Advantages and limitations of arrays","text":"

    Arrays are stored in contiguous memory spaces and consist of elements of the same type. This approach provides substantial prior information that systems can leverage to optimize the efficiency of data structure operations.

    • High space efficiency: Arrays allocate a contiguous block of memory for data, eliminating the need for additional structural overhead.
    • Support for random access: Arrays allow \\(O(1)\\) time access to any element.
    • Cache locality: When accessing array elements, the computer not only loads them but also caches the surrounding data, utilizing high-speed cache to enchance subsequent operation speeds.

    However, continuous space storage is a double-edged sword, with the following limitations:

    • Low efficiency in insertion and deletion: As arrays accumulate many elements, inserting or deleting elements requires shifting a large number of elements.
    • Fixed length: The length of an array is fixed after initialization. Expanding an array requires copying all data to a new array, incurring significant costs.
    • Space wastage: If the allocated array size exceeds the what is necessary, the extra space is wasted.
    "},{"location":"chapter_array_and_linkedlist/array/#413-typical-applications-of-arrays","title":"4.1.3 \u00a0 Typical applications of arrays","text":"

    Arrays are fundamental and widely used data structures. They find frequent application in various algorithms and serve in the implementation of complex data structures.

    • Random access: Arrays are ideal for storing data when random sampling is required. By generating a random sequence based on indices, we can achieve random sampling efficiently.
    • Sorting and searching: Arrays are the most commonly used data structure for sorting and searching algorithms. Techniques like quick sort, merge sort, binary search, etc., are primarily operate on arrays.
    • Lookup tables: Arrays serve as efficient lookup tables for quick element or relationship retrieval. For instance, mapping characters to ASCII codes becomes seamless by using the ASCII code values as indices and storing corresponding elements in the array.
    • Machine learning: Within the domain of neural networks, arrays play a pivotal role in executing crucial linear algebra operations involving vectors, matrices, and tensors. Arrays serve as the primary and most extensively used data structure in neural network programming.
    • Data structure implementation: Arrays serve as the building blocks for implementing various data structures like stacks, queues, hash tables, heaps, graphs, etc. For instance, the adjacency matrix representation of a graph is essentially a two-dimensional array.
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 Linked list","text":"

    Memory space is a shared resource among all programs. In a complex system environment, available memory can be dispersed throughout the memory space. We understand that the memory allocated for an array must be continuous. However, for very large arrays, finding a sufficiently large contiguous memory space might be challenging. This is where the flexible advantage of linked lists becomes evident.

    A \"linked list\" is a linear data structure in which each element is a node object, and the nodes are interconnected through \"references\". These references hold the memory addresses of subsequent nodes, enabling navigation from one node to the next.

    The design of linked lists allows for their nodes to be distributed across memory locations without requiring contiguous memory addresses.

    Figure 4-5 \u00a0 Linked list definition and storage method

    As shown in the figure, we see that the basic building block of a linked list is the \"node\" object. Each node comprises two key components: the node's \"value\" and a \"reference\" to the next node.

    • The first node in a linked list is the \"head node\", and the final one is the \"tail node\".
    • The tail node points to \"null\", designated as null in Java, nullptr in C++, and None in Python.
    • In languages that support pointers, like C, C++, Go, and Rust, this \"reference\" is typically implemented as a \"pointer\".

    As the code below illustrates, a ListNode in a linked list, besides holding a value, must also maintain an additional reference (or pointer). Therefore, a linked list occupies more memory space than an array when storing the same quantity of data..

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class ListNode:\n    \"\"\"Linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # Node value\n        self.next: ListNode | None = None # Reference to the next node\n
    /* Linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the next node\n    ListNode(int x) : val(x), next(nullptr) {}  // Constructor\n};\n
    /* Linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
    /* Linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;         // Node value\n    ListNode? next;      // Reference to the next node\n}\n
    /* Linked list node structure */\ntype ListNode struct {\n    Val  int       // Node value\n    Next *ListNode // Pointer to the next node\n}\n\n// NewListNode Constructor, creates a new linked list\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // Node value\n        this.next = (next === undefined ? null : next); // Reference to the next node\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // Node value\n        this.next = next === undefined ? null : next;  // Reference to the next node\n    }\n}\n
    /* Linked list node class */\nclass ListNode {\n  int val; // Node value\n  ListNode? next; // Reference to the next node\n  ListNode(this.val, [this.next]); // Constructor\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* Linked list node class */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to the next node\n}\n
    /* Linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the next node\n} ListNode;\n\n/* Constructor */\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
    \n
    // Linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the next node\n\n        // Constructor\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-common-operations-on-linked-lists","title":"4.2.1 \u00a0 Common operations on linked lists","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1-initializing-a-linked-list","title":"1. \u00a0 Initializing a linked list","text":"

    Constructing a linked list is a two-step process: first, initializing each node object, and second, forming the reference links between the nodes. After initialization, we can traverse all nodes sequentially from the head node by following the next reference.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig linked_list.py
    # Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4\n# Initialize each node\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// Build references between nodes\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// Build references between nodes\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\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// Build references between nodes\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
    /* Initialize linked list: 1 -> 3 -> 2 -> 5 -> 4 */\n// Initialize each node\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// Build references between nodes\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    \n
    linked_list.zig
    // Initialize linked list\n// Initialize each node\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// Build references between nodes\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n

    The array as a whole is a variable, for instance, the array nums includes elements like nums[0], nums[1], and so on, whereas a linked list is made up of several distinct node objects. We typically refer to a linked list by its head node, for example, the linked list in the previous code snippet is referred to as n0.

    "},{"location":"chapter_array_and_linkedlist/linked_list/#2-inserting-nodes","title":"2. \u00a0 Inserting nodes","text":"

    Inserting a node into a linked list is very easy. As shown in the figure, let's assume we aim to insert a new node P between two adjacent nodes n0 and n1. This can be achieved by simply modifying two node references (pointers), with a time complexity of \\(O(1)\\).

    By comparison, inserting an element into an array has a time complexity of \\(O(n)\\), which becomes less efficient when dealing with large data volumes.

    Figure 4-6 \u00a0 Linked list node insertion example

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3-deleting-nodes","title":"3. \u00a0 Deleting nodes","text":"

    As shown in the figure, deleting a node from a linked list is also very easy, involving only the modification of a single node's reference (pointer).

    It's important to note that even though node P continues to point to n1 after being deleted, it becomes inaccessible during linked list traversal. This effectively means that P is no longer a part of the linked list.

    Figure 4-7 \u00a0 Linked list node deletion

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4-accessing-nodes","title":"4. \u00a0 Accessing nodes","text":"

    Accessing nodes in a linked list is less efficient. As previously mentioned, any element in an array can be accessed in \\(O(1)\\) time. In contrast, with a linked list, the program involves starting from the head node and sequentially traversing through the nodes until the desired node is found. In other words, to access the \\(i\\)-th node in a linked list, the program must iterate through \\(i - 1\\) nodes, resulting in a time complexity of \\(O(n)\\).

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5-finding-nodes","title":"5. \u00a0 Finding nodes","text":"

    Traverse the linked list to locate a node whose value matches target, and then output the index of that node within the linked list. This procedure is also an example of linear search. The corresponding code is provided below:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-arrays-vs-linked-lists","title":"4.2.2 \u00a0 Arrays vs. linked lists","text":"

    The Table 4-1 summarizes the characteristics of arrays and linked lists, and it also compares their efficiencies in various operations. Because they utilize opposing storage strategies, their respective properties and operational efficiencies exhibit distinct contrasts.

    Table 4-1 \u00a0 Efficiency comparison of arrays and linked lists

    Arrays Linked Lists Storage Contiguous Memory Space Dispersed Memory Space Capacity Expansion Fixed Length Flexible Expansion Memory Efficiency Less Memory per Element, Potential Space Wastage More Memory per Element Accessing Elements \\(O(1)\\) \\(O(n)\\) Adding Elements \\(O(n)\\) \\(O(1)\\) Deleting Elements \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423-common-types-of-linked-lists","title":"4.2.3 \u00a0 Common types of linked lists","text":"

    As shown in the figure, there are three common types of linked lists.

    • Singly linked list: This is the standard linked list described earlier. Nodes in a singly linked list include a value and a reference to the next node. The first node is known as the head node, and the last node, which points to null (None), is the tail node.
    • Circular linked list: This is formed when the tail node of a singly linked list points back to the head node, creating a loop. In a circular linked list, any node can function as the head node.
    • Doubly linked list: In contrast to a singly linked list, a doubly linked list maintains references in two directions. Each node contains references (pointer) to both its successor (the next node) and predecessor (the previous node). Although doubly linked lists offer more flexibility for traversing in either direction, they also consume more memory space.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class ListNode:\n    \"\"\"Bidirectional linked list node class\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.next: ListNode | None = None  # Reference to the successor node\n        self.prev: ListNode | None = None  # Reference to a predecessor node\n
    /* Bidirectional linked list node structure */\nstruct ListNode {\n    int val;         // Node value\n    ListNode *next;  // Pointer to the successor node\n    ListNode *prev;  // Pointer to the predecessor node\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // Constructor\n};\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(int x) { val = x; }  // Constructor\n}\n
    /* Bidirectional linked list node class */\nclass ListNode(int x) {  // Constructor\n    int val = x;    // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n}\n
    /* Bidirectional linked list node structure */\ntype DoublyListNode struct {\n    Val  int             // Node value\n    Next *DoublyListNode // Pointer to the successor node\n    Prev *DoublyListNode // Pointer to the predecessor node\n}\n\n// NewDoublyListNode initialization\nfunc NewDoublyListNode(val int) *DoublyListNode {\n    return &DoublyListNode{\n        Val:  val,\n        Next: nil,\n        Prev: nil,\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    var val: Int // Node value\n    var next: ListNode? // Reference to the next node\n    var prev: ListNode? // Reference to the predecessor node\n\n    init(x: Int) { // Constructor\n        val = x\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
    /* Bidirectional linked list node class */\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;        // Node value\n        this.next = next  ===  undefined ? null : next;  // Reference to the successor node\n        this.prev = prev  ===  undefined ? null : prev;  // Reference to the predecessor node\n    }\n}\n
    /* Bidirectional linked list node class */\nclass ListNode {\n    int val;        // Node value\n    ListNode next;  // Reference to the next node\n    ListNode prev;  // Reference to the predecessor node\n    ListNode(this.val, [this.next, this.prev]);  // Constructor\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Bidirectional linked list node type */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // Node value\n    next: Option<Rc<RefCell<ListNode>>>, // Pointer to successor node\n    prev: Option<Rc<RefCell<ListNode>>>, // Pointer to predecessor node\n}\n\n/* Constructors */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* Bidirectional linked list node structure */\ntypedef struct ListNode {\n    int val;               // Node value\n    struct ListNode *next; // Pointer to the successor node\n    struct ListNode *prev; // Pointer to the predecessor node\n} ListNode;\n\n/* Constructors */\nListNode *newListNode(int val) {\n    ListNode *node, *next;\n    node = (ListNode *) malloc(sizeof(ListNode));\n    node->val = val;\n    node->next = NULL;\n    node->prev = NULL;\n    return node;\n}\n
    \n
    // Bidirectional linked list node class\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // Node value\n        next: ?*Self = null, // Pointer to the successor node\n        prev: ?*Self = null, // Pointer to the predecessor node\n\n        // Constructor\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

    Figure 4-8 \u00a0 Common types of linked lists

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424-typical-applications-of-linked-lists","title":"4.2.4 \u00a0 Typical applications of linked lists","text":"

    Singly linked lists are frequently utilized in implementing stacks, queues, hash tables, and graphs.

    • Stacks and queues: In singly linked lists, if insertions and deletions occur at the same end, it behaves like a stack (last-in-first-out). Conversely, if insertions are at one end and deletions at the other, it functions like a queue (first-in-first-out).
    • Hash tables: Linked lists are used in chaining, a popular method for resolving hash collisions. Here, all collided elements are grouped into a linked list.
    • Graphs: Adjacency lists, a standard method for graph representation, associate each graph vertex with a linked list. This list contains elements that represent vertices connected to the corresponding vertex.

    Doubly linked lists are ideal for scenarios requiring rapid access to preceding and succeeding elements.

    • Advanced data structures: In structures like red-black trees and B-trees, accessing a node's parent is essential. This is achieved by incorporating a reference to the parent node in each node, akin to a doubly linked list.
    • Browser history: In web browsers, doubly linked lists facilitate navigating the history of visited pages when users click forward or back.
    • LRU algorithm: Doubly linked lists are apt for Least Recently Used (LRU) cache eviction algorithms, enabling swift identification of the least recently used data and facilitating fast node addition and removal.

    Circular linked lists are ideal for applications that require periodic operations, such as resource scheduling in operating systems.

    • Round-robin scheduling algorithm: In operating systems, the round-robin scheduling algorithm is a common CPU scheduling method, requiring cycling through a group of processes. Each process is assigned a time slice, and upon expiration, the CPU rotates to the next process. This cyclical operation can be efficiently realized using a circular linked list, allowing for a fair and time-shared system among all processes.
    • Data buffers: Circular linked lists are also used in data buffers, like in audio and video players, where the data stream is divided into multiple buffer blocks arranged in a circular fashion for seamless playback.
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 List","text":"

    A \"list\" is an abstract data structure concept that represents an ordered collection of elements, supporting operations such as element access, modification, addition, deletion, and traversal, without requiring users to consider capacity limitations. Lists can be implemented based on linked lists or arrays.

    • A linked list inherently serves as a list, supporting operations for adding, deleting, searching, and modifying elements, with the flexibility to dynamically adjust its size.
    • Arrays also support these operations, but due to their immutable length, they can be considered as a list with a length limit.

    When implementing lists using arrays, the immutability of length reduces the practicality of the list. This is because predicting the amount of data to be stored in advance is often challenging, making it difficult to choose an appropriate list length. If the length is too small, it may not meet the requirements; if too large, it may waste memory space.

    To solve this problem, we can implement lists using a \"dynamic array.\" It inherits the advantages of arrays and can dynamically expand during program execution.

    In fact, many programming languages' standard libraries implement lists using dynamic arrays, such as Python's list, Java's ArrayList, C++'s vector, and C#'s List. In the following discussion, we will consider \"list\" and \"dynamic array\" as synonymous concepts.

    "},{"location":"chapter_array_and_linkedlist/list/#431-common-list-operations","title":"4.3.1 \u00a0 Common list operations","text":""},{"location":"chapter_array_and_linkedlist/list/#1-initializing-a-list","title":"1. \u00a0 Initializing a list","text":"

    We typically use two initialization methods: \"without initial values\" and \"with initial values\".

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Initialize list\n# Without initial values\nnums1: list[int] = []\n# With initial values\nnums: list[int] = [1, 3, 2, 5, 4]\n
    list.cpp
    /* Initialize list */\n// Note, in C++ the vector is the equivalent of nums described here\n// Without initial values\nvector<int> nums1;\n// With initial values\nvector<int> nums = { 1, 3, 2, 5, 4 };\n
    list.java
    /* Initialize list */\n// Without initial values\nList<Integer> nums1 = new ArrayList<>();\n// With initial values (note the element type should be the wrapper class Integer[] for int[])\nInteger[] numbers = new Integer[] { 1, 3, 2, 5, 4 };\nList<Integer> nums = new ArrayList<>(Arrays.asList(numbers));\n
    list.cs
    /* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nint[] numbers = [1, 3, 2, 5, 4];\nList<int> nums = [.. numbers];\n
    list_test.go
    /* Initialize list */\n// Without initial values\nnums1 := []int{}\n// With initial values\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* Initialize list */\n// Without initial values\nlet nums1: [Int] = []\n// With initial values\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* Initialize list */\n// Without initial values\nconst nums1 = [];\n// With initial values\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* Initialize list */\n// Without initial values\nconst nums1: number[] = [];\n// With initial values\nconst nums: number[] = [1, 3, 2, 5, 4];\n
    list.dart
    /* Initialize list */\n// Without initial values\nList<int> nums1 = [];\n// With initial values\nList<int> nums = [1, 3, 2, 5, 4];\n
    list.rs
    /* Initialize list */\n// Without initial values\nlet nums1: Vec<i32> = Vec::new();\n// With initial values\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Initialize list\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    "},{"location":"chapter_array_and_linkedlist/list/#2-accessing-elements","title":"2. \u00a0 Accessing elements","text":"

    Lists are essentially arrays, thus they can access and update elements in \\(O(1)\\) time, which is very efficient.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Access elements\nnum: int = nums[1]  # Access the element at index 1\n\n# Update elements\nnums[1] = 0    # Update the element at index 1 to 0\n
    list.cpp
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.java
    /* Access elements */\nint num = nums.get(1);  // Access the element at index 1\n\n/* Update elements */\nnums.set(1, 0);  // Update the element at index 1 to 0\n
    list.cs
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list_test.go
    /* Access elements */\nnum := nums[1]  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0     // Update the element at index 1 to 0\n
    list.swift
    /* Access elements */\nlet num = nums[1] // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0 // Update the element at index 1 to 0\n
    list.js
    /* Access elements */\nconst num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.ts
    /* Access elements */\nconst num: number = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.dart
    /* Access elements */\nint num = nums[1];  // Access the element at index 1\n\n/* Update elements */\nnums[1] = 0;  // Update the element at index 1 to 0\n
    list.rs
    /* Access elements */\nlet num: i32 = nums[1];  // Access the element at index 1\n/* Update elements */\nnums[1] = 0;             // Update the element at index 1 to 0\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Access elements\nvar num = nums.items[1]; // Access the element at index 1\n\n// Update elements\nnums.items[1] = 0; // Update the element at index 1 to 0  \n
    "},{"location":"chapter_array_and_linkedlist/list/#3-inserting-and-removing-elements","title":"3. \u00a0 Inserting and removing elements","text":"

    Compared to arrays, lists offer more flexibility in adding and removing elements. While adding elements to the end of a list is an \\(O(1)\\) operation, the efficiency of inserting and removing elements elsewhere in the list remains the same as in arrays, with a time complexity of \\(O(n)\\).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Clear list\nnums.clear()\n\n# Append elements at the end\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# Insert element in the middle\nnums.insert(3, 6)  # Insert number 6 at index 3\n\n# Remove elements\nnums.pop(3)        # Remove the element at index 3\n
    list.cpp
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push_back(1);\nnums.push_back(3);\nnums.push_back(2);\nnums.push_back(5);\nnums.push_back(4);\n\n/* Insert element in the middle */\nnums.insert(nums.begin() + 3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.erase(nums.begin() + 3);      // Remove the element at index 3\n
    list.java
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.add(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);  // Remove the element at index 3\n
    list.cs
    /* Clear list */\nnums.Clear();\n\n/* Append elements at the end */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* Insert element in the middle */\nnums.Insert(3, 6);\n\n/* Remove elements */\nnums.RemoveAt(3);\n
    list_test.go
    /* Clear list */\nnums = nil\n\n/* Append elements at the end */\nnums = append(nums, 1)\nnums = append(nums, 3)\nnums = append(nums, 2)\nnums = append(nums, 5)\nnums = append(nums, 4)\n\n/* Insert element in the middle */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // Insert number 6 at index 3\n\n/* Remove elements */\nnums = append(nums[:3], nums[4:]...) // Remove the element at index 3\n
    list.swift
    /* Clear list */\nnums.removeAll()\n\n/* Append elements at the end */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* Insert element in the middle */\nnums.insert(6, at: 3) // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(at: 3) // Remove the element at index 3\n
    list.js
    /* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
    list.ts
    /* Clear list */\nnums.length = 0;\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.splice(3, 0, 6);\n\n/* Remove elements */\nnums.splice(3, 1);\n
    list.dart
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6); // Insert number 6 at index 3\n\n/* Remove elements */\nnums.removeAt(3); // Remove the element at index 3\n
    list.rs
    /* Clear list */\nnums.clear();\n\n/* Append elements at the end */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* Insert element in the middle */\nnums.insert(3, 6);  // Insert number 6 at index 3\n\n/* Remove elements */\nnums.remove(3);    // Remove the element at index 3\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Clear list\nnums.clearRetainingCapacity();\n\n// Append elements at the end\ntry nums.append(1);\ntry nums.append(3);\ntry nums.append(2);\ntry nums.append(5);\ntry nums.append(4);\n\n// Insert element in the middle\ntry nums.insert(3, 6); // Insert number 6 at index 3\n\n// Remove elements\n_ = nums.orderedRemove(3); // Remove the element at index 3\n
    "},{"location":"chapter_array_and_linkedlist/list/#4-iterating-the-list","title":"4. \u00a0 Iterating the list","text":"

    Similar to arrays, lists can be iterated either by using indices or by directly iterating through each element.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Iterate through the list by index\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# Iterate directly through list elements\nfor num in nums:\n    count += num\n
    list.cpp
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* Iterate directly through list elements */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* Iterate through the list by index */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* Iterate through the list by index */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* Iterate through the list by index */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* Iterate directly through list elements */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* Iterate through the list by index */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* Iterate through the list by index */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* Iterate directly through list elements */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // Iterate through the list by index\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// Iterate directly through list elements\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Iterate through the list by index\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// Iterate directly through list elements\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    "},{"location":"chapter_array_and_linkedlist/list/#5-concatenating-lists","title":"5. \u00a0 Concatenating lists","text":"

    Given a new list nums1, we can append it to the end of the original list.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Concatenate two lists\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # Concatenate nums1 to the end of nums\n
    list.cpp
    /* Concatenate two lists */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// Concatenate nums1 to the end of nums\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* Concatenate two lists */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
    list.cs
    /* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // Concatenate nums1 to the end of nums\n
    list_test.go
    /* Concatenate two lists */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // Concatenate nums1 to the end of nums\n
    list.swift
    /* Concatenate two lists */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // Concatenate nums1 to the end of nums\n
    list.js
    /* Concatenate two lists */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
    list.ts
    /* Concatenate two lists */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // Concatenate nums1 to the end of nums\n
    list.dart
    /* Concatenate two lists */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // Concatenate nums1 to the end of nums\n
    list.rs
    /* Concatenate two lists */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Concatenate two lists\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); // Concatenate nums1 to the end of nums\n
    "},{"location":"chapter_array_and_linkedlist/list/#6-sorting-the-list","title":"6. \u00a0 Sorting the list","text":"

    Once the list is sorted, we can employ algorithms commonly used in array-related algorithm problems, such as \"binary search\" and \"two-pointer\" algorithms.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig list.py
    # Sort the list\nnums.sort()  # After sorting, the list elements are in ascending order\n
    list.cpp
    /* Sort the list */\nsort(nums.begin(), nums.end());  // After sorting, the list elements are in ascending order\n
    list.java
    /* Sort the list */\nCollections.sort(nums);  // After sorting, the list elements are in ascending order\n
    list.cs
    /* Sort the list */\nnums.Sort(); // After sorting, the list elements are in ascending order\n
    list_test.go
    /* Sort the list */\nsort.Ints(nums)  // After sorting, the list elements are in ascending order\n
    list.swift
    /* Sort the list */\nnums.sort() // After sorting, the list elements are in ascending order\n
    list.js
    /* Sort the list */  \nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
    list.ts
    /* Sort the list */\nnums.sort((a, b) => a - b);  // After sorting, the list elements are in ascending order\n
    list.dart
    /* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
    list.rs
    /* Sort the list */\nnums.sort(); // After sorting, the list elements are in ascending order\n
    list.c
    // C does not provide built-in dynamic arrays\n
    list.kt
    \n
    list.zig
    // Sort the list\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    "},{"location":"chapter_array_and_linkedlist/list/#432-list-implementation","title":"4.3.2 \u00a0 List implementation","text":"

    Many programming languages come with built-in lists, including Java, C++, Python, etc. Their implementations tend to be intricate, featuring carefully considered settings for various parameters, like initial capacity and expansion factors. Readers who are curious can delve into the source code for further learning.

    To enhance our understanding of how lists work, we will attempt to implement a simplified version of a list, focusing on three crucial design aspects:

    • Initial capacity: Choose a reasonable initial capacity for the array. In this example, we choose 10 as the initial capacity.
    • Size recording: Declare a variable size to record the current number of elements in the list, updating in real-time with element insertion and deletion. With this variable, we can locate the end of the list and determine whether expansion is needed.
    • Expansion mechanism: If the list reaches full capacity upon an element insertion, an expansion process is required. This involves creating a larger array based on the expansion factor, and then transferring all elements from the current array to the new one. In this example, we stipulate that the array size should double with each expansion.
    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 Memory and cache *","text":"

    In the first two sections of this chapter, we explored arrays and linked lists, two fundamental and important data structures, representing \"continuous storage\" and \"dispersed storage\" respectively.

    In fact, the physical structure largely determines the efficiency of a program's use of memory and cache, which in turn affects the overall performance of the algorithm.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441-computer-storage-devices","title":"4.4.1 \u00a0 Computer storage devices","text":"

    There are three types of storage devices in computers: \"hard disk,\" \"random-access memory (RAM),\" and \"cache memory.\" The following table shows their different roles and performance characteristics in computer systems.

    Table 4-2 \u00a0 Computer storage devices

    Hard Disk Memory Cache Usage Long-term storage of data, including OS, programs, files, etc. Temporary storage of currently running programs and data being processed Stores frequently accessed data and instructions, reducing the number of CPU accesses to memory Volatility Data is not lost after power off Data is lost after power off Data is lost after power off Capacity Larger, TB level Smaller, GB level Very small, MB level Speed Slower, several hundred to thousands MB/s Faster, several tens of GB/s Very fast, several tens to hundreds of GB/s Price Cheaper, several cents to yuan / GB More expensive, tens to hundreds of yuan / GB Very expensive, priced with CPU

    We can imagine the computer storage system as a pyramid structure shown in the Figure 4-9 . The storage devices closer to the top of the pyramid are faster, have smaller capacity, and are more costly. This multi-level design is not accidental, but the result of careful consideration by computer scientists and engineers.

    • Hard disks are difficult to replace with memory. Firstly, data in memory is lost after power off, making it unsuitable for long-term data storage; secondly, the cost of memory is dozens of times that of hard disks, making it difficult to popularize in the consumer market.
    • It is difficult for caches to have both large capacity and high speed. As the capacity of L1, L2, L3 caches gradually increases, their physical size becomes larger, increasing the physical distance from the CPU core, leading to increased data transfer time and higher element access latency. Under current technology, a multi-level cache structure is the best balance between capacity, speed, and cost.

    Figure 4-9 \u00a0 Computer storage system

    Note

    The storage hierarchy of computers reflects a delicate balance between speed, capacity, and cost. In fact, this kind of trade-off is common in all industrial fields, requiring us to find the best balance between different advantages and limitations.

    Overall, hard disks are used for long-term storage of large amounts of data, memory is used for temporary storage of data being processed during program execution, and cache is used to store frequently accessed data and instructions to improve program execution efficiency. Together, they ensure the efficient operation of computer systems.

    As shown in the Figure 4-10 , during program execution, data is read from the hard disk into memory for CPU computation. The cache can be considered a part of the CPU, smartly loading data from memory to provide fast data access to the CPU, significantly enhancing program execution efficiency and reducing reliance on slower memory.

    Figure 4-10 \u00a0 Data flow between hard disk, memory, and cache

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442-memory-efficiency-of-data-structures","title":"4.4.2 \u00a0 Memory efficiency of data structures","text":"

    In terms of memory space utilization, arrays and linked lists have their advantages and limitations.

    On one hand, memory is limited and cannot be shared by multiple programs, so we hope that data structures can use space as efficiently as possible. The elements of an array are tightly packed without extra space for storing references (pointers) between linked list nodes, making them more space-efficient. However, arrays require allocating sufficient continuous memory space at once, which may lead to memory waste, and array expansion also requires additional time and space costs. In contrast, linked lists allocate and reclaim memory dynamically on a per-node basis, providing greater flexibility.

    On the other hand, during program execution, as memory is repeatedly allocated and released, the degree of fragmentation of free memory becomes higher, leading to reduced memory utilization efficiency. Arrays, due to their continuous storage method, are relatively less likely to cause memory fragmentation. In contrast, the elements of a linked list are dispersedly stored, and frequent insertion and deletion operations make memory fragmentation more likely.

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443-cache-efficiency-of-data-structures","title":"4.4.3 \u00a0 Cache efficiency of data structures","text":"

    Although caches are much smaller in space capacity than memory, they are much faster and play a crucial role in program execution speed. Since the cache's capacity is limited and can only store a small part of frequently accessed data, when the CPU tries to access data not in the cache, a \"cache miss\" occurs, forcing the CPU to load the needed data from slower memory.

    Clearly, the fewer the cache misses, the higher the CPU's data read-write efficiency, and the better the program performance. The proportion of successful data retrieval from the cache by the CPU is called the \"cache hit rate,\" a metric often used to measure cache efficiency.

    To achieve higher efficiency, caches adopt the following data loading mechanisms.

    • Cache lines: Caches don't store and load data byte by byte but in units of cache lines. Compared to byte-by-byte transfer, the transmission of cache lines is more efficient.
    • Prefetch mechanism: Processors try to predict data access patterns (such as sequential access, fixed stride jumping access, etc.) and load data into the cache according to specific patterns to improve the hit rate.
    • Spatial locality: If data is accessed, data nearby is likely to be accessed in the near future. Therefore, when loading certain data, the cache also loads nearby data to improve the hit rate.
    • Temporal locality: If data is accessed, it's likely to be accessed again in the near future. Caches use this principle to retain recently accessed data to improve the hit rate.

    In fact, arrays and linked lists have different cache utilization efficiencies, mainly reflected in the following aspects.

    • Occupied space: Linked list elements occupy more space than array elements, resulting in less effective data volume in the cache.
    • Cache lines: Linked list data is scattered throughout memory, and since caches load \"by line,\" the proportion of loading invalid data is higher.
    • Prefetch mechanism: The data access pattern of arrays is more \"predictable\" than that of linked lists, meaning the system is more likely to guess which data will be loaded next.
    • Spatial locality: Arrays are stored in concentrated memory spaces, so the data near the loaded data is more likely to be accessed next.

    Overall, arrays have a higher cache hit rate and are generally more efficient in operation than linked lists. This makes data structures based on arrays more popular in solving algorithmic problems.

    It should be noted that high cache efficiency does not mean that arrays are always better than linked lists. Which data structure to choose in actual applications should be based on specific requirements. For example, both arrays and linked lists can implement the \"stack\" data structure (which will be detailed in the next chapter), but they are suitable for different scenarios.

    • In algorithm problems, we tend to choose stacks based on arrays because they provide higher operational efficiency and random access capabilities, with the only cost being the need to pre-allocate a certain amount of memory space for the array.
    • If the data volume is very large, highly dynamic, and the expected size of the stack is difficult to estimate, then a stack based on a linked list is more appropriate. Linked lists can disperse a large amount of data in different parts of the memory and avoid the additional overhead of array expansion.
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 Summary","text":""},{"location":"chapter_array_and_linkedlist/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Arrays and linked lists are two basic data structures, representing two storage methods in computer memory: contiguous space storage and non-contiguous space storage. Their characteristics complement each other.
    • Arrays support random access and use less memory; however, they are inefficient in inserting and deleting elements and have a fixed length after initialization.
    • Linked lists implement efficient node insertion and deletion through changing references (pointers) and can flexibly adjust their length; however, they have lower node access efficiency and consume more memory.
    • Common types of linked lists include singly linked lists, circular linked lists, and doubly linked lists, each with its own application scenarios.
    • Lists are ordered collections of elements that support addition, deletion, and modification, typically implemented based on dynamic arrays, retaining the advantages of arrays while allowing flexible length adjustment.
    • The advent of lists significantly enhanced the practicality of arrays but may lead to some memory space wastage.
    • During program execution, data is mainly stored in memory. Arrays provide higher memory space efficiency, while linked lists are more flexible in memory usage.
    • Caches provide fast data access to CPUs through mechanisms like cache lines, prefetching, spatial locality, and temporal locality, significantly enhancing program execution efficiency.
    • Due to higher cache hit rates, arrays are generally more efficient than linked lists. When choosing a data structure, the appropriate choice should be made based on specific needs and scenarios.
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Does storing arrays on the stack versus the heap affect time and space efficiency?

    Arrays stored on both the stack and heap are stored in contiguous memory spaces, and data operation efficiency is essentially the same. However, stacks and heaps have their own characteristics, leading to the following differences.

    1. Allocation and release efficiency: The stack is a smaller memory block, allocated automatically by the compiler; the heap memory is relatively larger and can be dynamically allocated in the code, more prone to fragmentation. Therefore, allocation and release operations on the heap are generally slower than on the stack.
    2. Size limitation: Stack memory is relatively small, while the heap size is generally limited by available memory. Therefore, the heap is more suitable for storing large arrays.
    3. Flexibility: The size of arrays on the stack needs to be determined at compile-time, while the size of arrays on the heap can be dynamically determined at runtime.

    Q: Why do arrays require elements of the same type, while linked lists do not emphasize same-type elements?

    Linked lists consist of nodes connected by references (pointers), and each node can store data of different types, such as int, double, string, object, etc.

    In contrast, array elements must be of the same type, allowing the calculation of offsets to access the corresponding element positions. For example, an array containing both int and long types, with single elements occupying 4 bytes and 8 bytes respectively, cannot use the following formula to calculate offsets, as the array contains elements of two different lengths.

    # Element memory address = array memory address + element length * element index\n

    Q: After deleting a node, is it necessary to set P.next to None?

    Not modifying P.next is also acceptable. From the perspective of the linked list, traversing from the head node to the tail node will no longer encounter P. This means that node P has been effectively removed from the list, and where P points no longer affects the list.

    From a garbage collection perspective, for languages with automatic garbage collection mechanisms like Java, Python, and Go, whether node P is collected depends on whether there are still references pointing to it, not on the value of P.next. In languages like C and C++, we need to manually free the node's memory.

    Q: In linked lists, the time complexity for insertion and deletion operations is O(1). But searching for the element before insertion or deletion takes O(n) time, so why isn't the time complexity O(n)?

    If an element is searched first and then deleted, the time complexity is indeed O(n). However, the O(1) advantage of linked lists in insertion and deletion can be realized in other applications. For example, in the implementation of double-ended queues using linked lists, we maintain pointers always pointing to the head and tail nodes, making each insertion and deletion operation O(1).

    Q: In the image \"Linked List Definition and Storage Method\", do the light blue storage nodes occupy a single memory address, or do they share half with the node value?

    The diagram is just a qualitative representation; quantitative analysis depends on specific situations.

    • Different types of node values occupy different amounts of space, such as int, long, double, and object instances.
    • The memory space occupied by pointer variables depends on the operating system and compilation environment used, usually 8 bytes or 4 bytes.

    Q: Is adding elements to the end of a list always O(1)?

    If adding an element exceeds the list length, the list needs to be expanded first. The system will request a new memory block and move all elements of the original list over, in which case the time complexity becomes O(n).

    Q: The statement \"The emergence of lists greatly improves the practicality of arrays, but may lead to some memory space wastage\" - does this refer to the memory occupied by additional variables like capacity, length, and expansion multiplier?

    The space wastage here mainly refers to two aspects: on the one hand, lists are set with an initial length, which we may not always need; on the other hand, to prevent frequent expansion, expansion usually multiplies by a coefficient, such as \\(\\times 1.5\\). This results in many empty slots, which we typically cannot fully fill.

    Q: In Python, after initializing n = [1, 2, 3], the addresses of these 3 elements are contiguous, but initializing m = [2, 1, 3] shows that each element's id is not consecutive but identical to those in n. If the addresses of these elements are not contiguous, is m still an array?

    If we replace list elements with linked list nodes n = [n1, n2, n3, n4, n5], these 5 node objects are also typically dispersed throughout memory. However, given a list index, we can still access the node's memory address in O(1) time, thereby accessing the corresponding node. This is because the array stores references to the nodes, not the nodes themselves.

    Unlike many languages, in Python, numbers are also wrapped as objects, and lists store references to these numbers, not the numbers themselves. Therefore, we find that the same number in two arrays has the same id, and these numbers' memory addresses need not be contiguous.

    Q: The std::list in C++ STL has already implemented a doubly linked list, but it seems that some algorithm books don't directly use it. Is there any limitation?

    On the one hand, we often prefer to use arrays to implement algorithms, only using linked lists when necessary, mainly for two reasons.

    • Space overhead: Since each element requires two additional pointers (one for the previous element and one for the next), std::list usually occupies more space than std::vector.
    • Cache unfriendly: As the data is not stored continuously, std::list has a lower cache utilization rate. Generally, std::vector performs better.

    On the other hand, linked lists are primarily necessary for binary trees and graphs. Stacks and queues are often implemented using the programming language's stack and queue classes, rather than linked lists.

    Q: Does initializing a list res = [0] * self.size() result in each element of res referencing the same address?

    No. However, this issue arises with two-dimensional arrays, for example, initializing a two-dimensional list res = [[0] * self.size()] would reference the same list [0] multiple times.

    Q: In deleting a node, is it necessary to break the reference to its successor node?

    From the perspective of data structures and algorithms (problem-solving), it's okay not to break the link, as long as the program's logic is correct. From the perspective of standard libraries, breaking the link is safer and more logically clear. If the link is not broken, and the deleted node is not properly recycled, it could affect the recycling of the successor node's memory.

    "},{"location":"chapter_computational_complexity/","title":"Chapter 2. \u00a0 Complexity analysis","text":"

    Abstract

    Complexity analysis is like a space-time navigator in the vast universe of algorithms.

    It guides us in exploring deeper within the the dimensions of time and space, seeking more elegant solutions.

    "},{"location":"chapter_computational_complexity/#chapter-contents","title":"Chapter contents","text":"
    • 2.1 \u00a0 Algorithm efficiency assessment
    • 2.2 \u00a0 Iteration and recursion
    • 2.3 \u00a0 Time complexity
    • 2.4 \u00a0 Space complexity
    • 2.5 \u00a0 Summary
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 Iteration and recursion","text":"

    In algorithms, the repeated execution of a task is quite common and is closely related to the analysis of complexity. Therefore, before delving into the concepts of time complexity and space complexity, let's first explore how to implement repetitive tasks in programming. This involves understanding two fundamental programming control structures: iteration and recursion.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#221-iteration","title":"2.2.1 \u00a0 Iteration","text":"

    \"Iteration\" is a control structure for repeatedly performing a task. In iteration, a program repeats a block of code as long as a certain condition is met until this condition is no longer satisfied.

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

    The for loop is one of the most common forms of iteration, and it's particularly suitable when the number of iterations is known in advance.

    The following function uses a for loop to perform a summation of \\(1 + 2 + \\dots + n\\), with the sum being stored in the variable res. It's important to note that in Python, range(a, b) creates an interval that is inclusive of a but exclusive of b, meaning it iterates over the range from \\(a\\) up to \\(b\u22121\\).

    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
    Code Visualization

    Full Screen >

    The flowchart below represents this sum function.

    Figure 2-1 \u00a0 Flowchart of the sum function

    The number of operations in this summation function is proportional to the size of the input data \\(n\\), or in other words, it has a \"linear relationship.\" This \"linear relationship\" is what time complexity describes. This topic will be discussed in more detail in the next section.

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

    Similar to for loops, while loops are another approach for implementing iteration. In a while loop, the program checks a condition at the beginning of each iteration; if the condition is true, the execution continues, otherwise, the loop ends.

    Below we use a while loop to implement the sum \\(1 + 2 + \\dots + n\\).

    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
    Code Visualization

    Full Screen >

    While loops provide more flexibility than for loops, especially since they allow for custom initialization and modification of the condition variable at each step.

    For example, in the following code, the condition variable \\(i\\) is updated twice each round, which would be inconvenient to implement with a for loop.

    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
    Code Visualization

    Full Screen >

    Overall, for loops are more concise, while while loops are more flexible. Both can implement iterative structures. Which one to use should be determined based on the specific requirements of the problem.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-nested-loops","title":"3. \u00a0 Nested loops","text":"

    We can nest one loop structure within another. Below is an example using for loops:

    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
    Code Visualization

    Full Screen >

    The flowchart below represents this nested loop.

    Figure 2-2 \u00a0 Flowchart of the nested loop

    In such cases, the number of operations of the function is proportional to \\(n^2\\), meaning the algorithm's runtime and the size of the input data \\(n\\) has a 'quadratic relationship.'

    We can further increase the complexity by adding more nested loops, each level of nesting effectively \"increasing the dimension,\" which raises the time complexity to \"cubic,\" \"quartic,\" and so on.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#222-recursion","title":"2.2.2 \u00a0 Recursion","text":"

    \"Recursion\" is an algorithmic strategy where a function solves a problem by calling itself. It primarily involves two phases:

    1. Calling: This is where the program repeatedly calls itself, often with progressively smaller or simpler arguments, moving towards the \"termination condition.\"
    2. Returning: Upon triggering the \"termination condition,\" the program begins to return from the deepest recursive function, aggregating the results of each layer.

    From an implementation perspective, recursive code mainly includes three elements.

    1. Termination Condition: Determines when to switch from \"calling\" to \"returning.\"
    2. Recursive Call: Corresponds to \"calling,\" where the function calls itself, usually with smaller or more simplified parameters.
    3. Return Result: Corresponds to \"returning,\" where the result of the current recursion level is returned to the previous layer.

    Observe the following code, where simply calling the function recur(n) can compute the sum of \\(1 + 2 + \\dots + n\\):

    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
    Code Visualization

    Full Screen >

    The Figure 2-3 shows the recursive process of this function.

    Figure 2-3 \u00a0 Recursive process of the sum function

    Although iteration and recursion can achieve the same results from a computational standpoint, they represent two entirely different paradigms of thinking and problem-solving.

    • Iteration: Solves problems \"from the bottom up.\" It starts with the most basic steps, and then repeatedly adds or accumulates these steps until the task is complete.
    • Recursion: Solves problems \"from the top down.\" It breaks down the original problem into smaller sub-problems, each of which has the same form as the original problem. These sub-problems are then further decomposed into even smaller sub-problems, stopping at the base case whose solution is known.

    Let's take the earlier example of the summation function, defined as \\(f(n) = 1 + 2 + \\dots + n\\).

    • Iteration: In this approach, we simulate the summation process within a loop. Starting from \\(1\\) and traversing to \\(n\\), we perform the summation operation in each iteration to eventually compute \\(f(n)\\).
    • Recursion: Here, the problem is broken down into a sub-problem: \\(f(n) = n + f(n-1)\\). This decomposition continues recursively until reaching the base case, \\(f(1) = 1\\), at which point the recursion terminates.
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1-call-stack","title":"1. \u00a0 Call stack","text":"

    Every time a recursive function calls itself, the system allocates memory for the newly initiated function to store local variables, the return address, and other relevant information. This leads to two primary outcomes.

    • The function's context data is stored in a memory area called \"stack frame space\" and is only released after the function returns. Therefore, recursion generally consumes more memory space than iteration.
    • Recursive calls introduce additional overhead. Hence, recursion is usually less time-efficient than loops.

    As shown in the Figure 2-4 , there are \\(n\\) unreturned recursive functions before triggering the termination condition, indicating a recursion depth of \\(n\\).

    Figure 2-4 \u00a0 Recursion call depth

    In practice, the depth of recursion allowed by programming languages is usually limited, and excessively deep recursion can lead to stack overflow errors.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#2-tail-recursion","title":"2. \u00a0 Tail recursion","text":"

    Interestingly, if a function performs its recursive call as the very last step before returning, it can be optimized by the compiler or interpreter to be as space-efficient as iteration. This scenario is known as \"tail recursion.\"

    • Regular recursion: In standard recursion, when the function returns to the previous level, it continues to execute more code, requiring the system to save the context of the previous call.
    • Tail recursion: Here, the recursive call is the final operation before the function returns. This means that upon returning to the previous level, no further actions are needed, so the system does not need to save the context of the previous level.

    For example, in calculating \\(1 + 2 + \\dots + n\\), we can make the result variable res a parameter of the function, thereby achieving tail recursion:

    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
    Code Visualization

    Full Screen >

    The execution process of tail recursion is shown in the following figure. Comparing regular recursion and tail recursion, the point of the summation operation is different.

    • Regular recursion: The summation operation occurs during the \"returning\" phase, requiring another summation after each layer returns.
    • Tail recursion: The summation operation occurs during the \"calling\" phase, and the \"returning\" phase only involves returning through each layer.

    Figure 2-5 \u00a0 Tail recursion process

    Tip

    Note that many compilers or interpreters do not support tail recursion optimization. For example, Python does not support tail recursion optimization by default, so even if the function is in the form of tail recursion, it may still encounter stack overflow issues.

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3-recursion-tree","title":"3. \u00a0 Recursion tree","text":"

    When dealing with algorithms related to \"divide and conquer\", recursion often offers a more intuitive approach and more readable code than iteration. Take the \"Fibonacci sequence\" as an example.

    Question

    Given a Fibonacci sequence \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\), find the \\(n\\)th number in the sequence.

    Let the \\(n\\)th number of the Fibonacci sequence be \\(f(n)\\), it's easy to deduce two conclusions:

    • The first two numbers of the sequence are \\(f(1) = 0\\) and \\(f(2) = 1\\).
    • Each number in the sequence is the sum of the two preceding ones, that is, \\(f(n) = f(n - 1) + f(n - 2)\\).

    Using the recursive relation, and considering the first two numbers as termination conditions, we can write the recursive code. Calling fib(n) will yield the \\(n\\)th number of the Fibonacci sequence:

    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
    Code Visualization

    Full Screen >

    Observing the above code, we see that it recursively calls two functions within itself, meaning that one call generates two branching calls. As illustrated below, this continuous recursive calling eventually creates a \"recursion tree\" with a depth of \\(n\\).

    Figure 2-6 \u00a0 Fibonacci sequence recursion tree

    Fundamentally, recursion embodies the paradigm of \"breaking down a problem into smaller sub-problems.\" This divide-and-conquer strategy is crucial.

    • From an algorithmic perspective, many important strategies like searching, sorting, backtracking, divide-and-conquer, and dynamic programming directly or indirectly use this way of thinking.
    • From a data structure perspective, recursion is naturally suited for dealing with linked lists, trees, and graphs, as they are well suited for analysis using the divide-and-conquer approach.
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223-comparison","title":"2.2.3 \u00a0 Comparison","text":"

    Summarizing the above content, the following table shows the differences between iteration and recursion in terms of implementation, performance, and applicability.

    Table: Comparison of iteration and recursion characteristics

    Iteration Recursion Approach Loop structure Function calls itself Time Efficiency Generally higher efficiency, no function call overhead Each function call generates overhead Memory Usage Typically uses a fixed size of memory space Accumulative function calls can use a substantial amount of stack frame space Suitable Problems Suitable for simple loop tasks, intuitive and readable code Suitable for problem decomposition, like trees, graphs, divide-and-conquer, backtracking, etc., concise and clear code structure

    Tip

    If you find the following content difficult to understand, consider revisiting it after reading the \"Stack\" chapter.

    So, what is the intrinsic connection between iteration and recursion? Taking the above recursive function as an example, the summation operation occurs during the recursion's \"return\" phase. This means that the initially called function is the last to complete its summation operation, mirroring the \"last in, first out\" principle of a stack.

    Recursive terms like \"call stack\" and \"stack frame space\" hint at the close relationship between recursion and stacks.

    1. Calling: When a function is called, the system allocates a new stack frame on the \"call stack\" for that function, storing local variables, parameters, return addresses, and other data.
    2. Returning: When a function completes execution and returns, the corresponding stack frame is removed from the \"call stack,\" restoring the execution environment of the previous function.

    Therefore, we can use an explicit stack to simulate the behavior of the call stack, thus transforming recursion into an iterative form:

    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
    Code Visualization

    Full Screen >

    Observing the above code, when recursion is transformed into iteration, the code becomes more complex. Although iteration and recursion can often be transformed into each other, it's not always advisable to do so for two reasons:

    • The transformed code may become more challenging to understand and less readable.
    • For some complex problems, simulating the behavior of the system's call stack can be quite challenging.

    In conclusion, whether to choose iteration or recursion depends on the specific nature of the problem. In programming practice, it's crucial to weigh the pros and cons of both and choose the most suitable approach for the situation at hand.

    "},{"location":"chapter_computational_complexity/performance_evaluation/","title":"2.1 \u00a0 Algorithm efficiency assessment","text":"

    In algorithm design, we pursue the following two objectives in sequence.

    1. Finding a Solution to the Problem: The algorithm should reliably find the correct solution within the stipulated range of inputs.
    2. Seeking the Optimal Solution: For the same problem, multiple solutions might exist, and we aim to find the most efficient algorithm possible.

    In other words, under the premise of being able to solve the problem, algorithm efficiency has become the main criterion for evaluating the merits of an algorithm, which includes the following two dimensions.

    • Time efficiency: The speed at which an algorithm runs.
    • Space efficiency: The size of the memory space occupied by an algorithm.

    In short, our goal is to design data structures and algorithms that are both fast and memory-efficient. Effectively assessing algorithm efficiency is crucial because only then can we compare various algorithms and guide the process of algorithm design and optimization.

    There are mainly two methods of efficiency assessment: actual testing and theoretical estimation.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211-actual-testing","title":"2.1.1 \u00a0 Actual testing","text":"

    Suppose we have algorithms A and B, both capable of solving the same problem, and we need to compare their efficiencies. The most direct method is to use a computer to run these two algorithms and monitor and record their runtime and memory usage. This assessment method reflects the actual situation but has significant limitations.

    On one hand, it's difficult to eliminate interference from the testing environment. Hardware configurations can affect algorithm performance. For example, algorithm A might run faster than B on one computer, but the opposite result may occur on another computer with different configurations. This means we would need to test on a variety of machines to calculate average efficiency, which is impractical.

    On the other hand, conducting a full test is very resource-intensive. As the volume of input data changes, the efficiency of the algorithms may vary. For example, with smaller data volumes, algorithm A might run faster than B, but the opposite might be true with larger data volumes. Therefore, to draw convincing conclusions, we need to test a wide range of input data sizes, which requires significant computational resources.

    "},{"location":"chapter_computational_complexity/performance_evaluation/#212-theoretical-estimation","title":"2.1.2 \u00a0 Theoretical estimation","text":"

    Due to the significant limitations of actual testing, we can consider evaluating algorithm efficiency solely through calculations. This estimation method is known as \"asymptotic complexity analysis,\" or simply \"complexity analysis.\"

    Complexity analysis reflects the relationship between the time and space resources required for algorithm execution and the size of the input data. It describes the trend of growth in the time and space required by the algorithm as the size of the input data increases. This definition might sound complex, but we can break it down into three key points to understand it better.

    • \"Time and space resources\" correspond to \"time complexity\" and \"space complexity,\" respectively.
    • \"As the size of input data increases\" means that complexity reflects the relationship between algorithm efficiency and the volume of input data.
    • \"The trend of growth in time and space\" indicates that complexity analysis focuses not on the specific values of runtime or space occupied but on the \"rate\" at which time or space grows.

    Complexity analysis overcomes the disadvantages of actual testing methods, reflected in the following aspects:

    • It is independent of the testing environment and applicable to all operating platforms.
    • It can reflect algorithm efficiency under different data volumes, especially in the performance of algorithms with large data volumes.

    Tip

    If you're still confused about the concept of complexity, don't worry. We will introduce it in detail in subsequent chapters.

    Complexity analysis provides us with a \"ruler\" to measure the time and space resources needed to execute an algorithm and compare the efficiency between different algorithms.

    Complexity is a mathematical concept and may be abstract and challenging for beginners. From this perspective, complexity analysis might not be the best content to introduce first. However, when discussing the characteristics of a particular data structure or algorithm, it's hard to avoid analyzing its speed and space usage.

    In summary, it's recommended that you establish a preliminary understanding of complexity analysis before diving deep into data structures and algorithms, so that you can carry out simple complexity analyses of algorithms.

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 Space complexity","text":"

    \"Space complexity\" is used to measure the growth trend of the memory space occupied by an algorithm as the amount of data increases. This concept is very similar to time complexity, except that \"running time\" is replaced with \"occupied memory space\".

    "},{"location":"chapter_computational_complexity/space_complexity/#241-space-related-to-algorithms","title":"2.4.1 \u00a0 Space related to algorithms","text":"

    The memory space used by an algorithm during its execution mainly includes the following types.

    • Input space: Used to store the input data of the algorithm.
    • Temporary space: Used to store variables, objects, function contexts, and other data during the algorithm's execution.
    • Output space: Used to store the output data of the algorithm.

    Generally, the scope of space complexity statistics includes both \"Temporary Space\" and \"Output Space\".

    Temporary space can be further divided into three parts.

    • Temporary data: Used to save various constants, variables, objects, etc., during the algorithm's execution.
    • Stack frame space: Used to save the context data of the called function. The system creates a stack frame at the top of the stack each time a function is called, and the stack frame space is released after the function returns.
    • Instruction space: Used to store compiled program instructions, which are usually negligible in actual statistics.

    When analyzing the space complexity of a program, we typically count the Temporary Data, Stack Frame Space, and Output Data, as shown in the Figure 2-15 .

    Figure 2-15 \u00a0 Space types used in algorithms

    The relevant code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    class Node:\n    \"\"\"Classes\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x               # node value\n        self.next: Node | None = None   # reference to the next node\n\ndef function() -> int:\n    \"\"\"Functions\"\"\"\n    # Perform certain operations...\n    return 0\n\ndef algorithm(n) -> int:    # input data\n    A = 0                   # temporary data (constant, usually in uppercase)\n    b = 0                   # temporary data (variable)\n    node = Node(0)          # temporary data (object)\n    c = function()          # Stack frame space (call function)\n    return A + b + c        # output data\n
    /* Structures */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    const int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node* node = new Node(0);   // temporary data (object)\n    int c = func();             // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {          // input data\n    final int a = 0;            // temporary data (constant)\n    int b = 0;                  // temporary data (variable)\n    Node node = new Node(0);    // temporary data (object)\n    int c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* Functions */\nint Function() {\n    // Perform certain operations...\n    return 0;\n}\n\nint Algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    Node node = new(0); // temporary data (object)\n    int c = Function(); // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
    /* Structures */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* Create node structure */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* Functions */\nfunc function() int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n int) int { // input data\n    const a = 0             // temporary data (constant)\n    b := 0                  // temporary storage of data (variable)\n    newNode(0)              // temporary data (object)\n    c := function()         // stack frame space (call function)\n    return a + b + c        // output data\n}\n
    /* Classes */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* Functions */\nfunc function() -> Int {\n    // Perform certain operations...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // input data\n    let a = 0                   // temporary data (constant)\n    var b = 0                   // temporary data (variable)\n    let node = Node(x: 0)       // temporary data (object)\n    let c = function()          // stack frame space (call function)\n    return a + b + c            // output data\n}\n
    /* Classes */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc() {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n) {         // input data\n    const a = 0;                // temporary data (constant)\n    let b = 0;                  // temporary data (variable)\n    const node = new Node(0);   // temporary data (object)\n    const c = constFunc();      // Stack frame space (calling function)\n    return a + b + c;           // output data\n}\n
    /* Classes */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // node value\n        this.next = null;                       // reference to the next node\n    }\n}\n\n/* Functions */\nfunction constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n\nfunction algorithm(n: number): number { // input data\n    const a = 0;                        // temporary data (constant)\n    let b = 0;                          // temporary data (variable)\n    const node = new Node(0);           // temporary data (object)\n    const c = constFunc();              // Stack frame space (calling function)\n    return a + b + c;                   // output data\n}\n
    /* Classes */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* Functions */\nint function() {\n  // Perform certain operations...\n  return 0;\n}\n\nint algorithm(int n) {  // input data\n  const int a = 0;      // temporary data (constant)\n  int b = 0;            // temporary data (variable)\n  Node node = Node(0);  // temporary data (object)\n  int c = function();   // stack frame space (call function)\n  return a + b + c;     // output data\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Structures */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* Constructor */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* Functions */\nfn function() -> i32 {     \n    // Perform certain operations...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {   // input data\n    const a: i32 = 0;           // temporary data (constant)\n    let mut b = 0;              // temporary data (variable)\n    let node = Node::new(0);    // temporary data (object)\n    let c = function();         // stack frame space (call function)\n    return a + b + c;           // output data\n}\n
    /* Functions */\nint func() {\n    // Perform certain operations...\n    return 0;\n}\n\nint algorithm(int n) {  // input data\n    const int a = 0;    // temporary data (constant)\n    int b = 0;          // temporary data (variable)\n    int c = func();     // stack frame space (call function)\n    return a + b + c;   // output data\n}\n
    \n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242-calculation-method","title":"2.4.2 \u00a0 Calculation method","text":"

    The method for calculating space complexity is roughly similar to that of time complexity, with the only change being the shift of the statistical object from \"number of operations\" to \"size of used space\".

    However, unlike time complexity, we usually only focus on the worst-case space complexity. This is because memory space is a hard requirement, and we must ensure that there is enough memory space reserved under all input data.

    Consider the following code, the term \"worst-case\" in worst-case space complexity has two meanings.

    1. Based on the worst input data: When \\(n < 10\\), the space complexity is \\(O(1)\\); but when \\(n > 10\\), the initialized array nums occupies \\(O(n)\\) space, thus the worst-case space complexity is \\(O(n)\\).
    2. Based on the peak memory used during the algorithm's execution: For example, before executing the last line, the program occupies \\(O(1)\\) space; when initializing the array nums, the program occupies \\(O(n)\\) space, hence the worst-case space complexity is \\(O(n)\\).
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    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
    \n
    \n

    In recursive functions, stack frame space must be taken into count. Consider the following code:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def function() -> int:\n    # Perform certain operations\n    return 0\n\ndef loop(n: int):\n    \"\"\"Loop O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"Recursion O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* Recursion O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // Perform certain operations\n    return 0\n}\n\n/* Cycle O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* Recursion O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* Recursion O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // Perform certain operations\n  return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* Recursion O(n) */\nvoid recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // Perform certain operations\n    return 0;\n}\n/* Cycle O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* Recursion O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    \n
    \n

    The time complexity of both loop() and recur() functions is \\(O(n)\\), but their space complexities differ.

    • The loop() function calls function() \\(n\\) times in a loop, where each iteration's function() returns and releases its stack frame space, so the space complexity remains \\(O(1)\\).
    • The recursive function recur() will have \\(n\\) instances of unreturned recur() existing simultaneously during its execution, thus occupying \\(O(n)\\) stack frame space.
    "},{"location":"chapter_computational_complexity/space_complexity/#243-common-types","title":"2.4.3 \u00a0 Common types","text":"

    Let the size of the input data be \\(n\\), the following chart displays common types of space complexities (arranged from low to high).

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n^2) < O(2^n) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Quadratic Order} < \\text{Exponential Order} \\end{aligned} \\]

    Figure 2-16 \u00a0 Common types of space complexity

    "},{"location":"chapter_computational_complexity/space_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

    Constant order is common in constants, variables, objects that are independent of the size of input data \\(n\\).

    Note that memory occupied by initializing variables or calling functions in a loop, which is released upon entering the next cycle, does not accumulate over space, thus the space complexity remains \\(O(1)\\):

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_computational_complexity/space_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

    Linear order is common in arrays, linked lists, stacks, queues, etc., where the number of elements is proportional to \\(n\\):

    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
    Code Visualization

    Full Screen >

    As shown below, this function's recursive depth is \\(n\\), meaning there are \\(n\\) instances of unreturned linear_recur() function, using \\(O(n)\\) size of stack frame space:

    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
    Code Visualization

    Full Screen >

    Figure 2-17 \u00a0 Recursive function generating linear order space complexity

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

    Quadratic order is common in matrices and graphs, where the number of elements is quadratic to \\(n\\):

    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
    Code Visualization

    Full Screen >

    As shown below, the recursive depth of this function is \\(n\\), and in each recursive call, an array is initialized with lengths \\(n\\), \\(n-1\\), \\(\\dots\\), \\(2\\), \\(1\\), averaging \\(n/2\\), thus overall occupying \\(O(n^2)\\) space:

    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
    Code Visualization

    Full Screen >

    Figure 2-18 \u00a0 Recursive function generating quadratic order space complexity

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

    Exponential order is common in binary trees. Observe the below image, a \"full binary tree\" with \\(n\\) levels has \\(2^n - 1\\) nodes, occupying \\(O(2^n)\\) space:

    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
    Code Visualization

    Full Screen >

    Figure 2-19 \u00a0 Full binary tree generating exponential order space complexity

    "},{"location":"chapter_computational_complexity/space_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

    Logarithmic order is common in divide-and-conquer algorithms. For example, in merge sort, an array of length \\(n\\) is recursively divided in half each round, forming a recursion tree of height \\(\\log n\\), using \\(O(\\log n)\\) stack frame space.

    Another example is converting a number to a string. Given a positive integer \\(n\\), its number of digits is \\(\\log_{10} n + 1\\), corresponding to the length of the string, thus the space complexity is \\(O(\\log_{10} n + 1) = O(\\log n)\\).

    "},{"location":"chapter_computational_complexity/space_complexity/#244-balancing-time-and-space","title":"2.4.4 \u00a0 Balancing time and space","text":"

    Ideally, we aim for both time complexity and space complexity to be optimal. However, in practice, optimizing both simultaneously is often difficult.

    Lowering time complexity usually comes at the cost of increased space complexity, and vice versa. The approach of sacrificing memory space to improve algorithm speed is known as \"space-time tradeoff\"; the reverse is known as \"time-space tradeoff\".

    The choice depends on which aspect we value more. In most cases, time is more precious than space, so \"space-time tradeoff\" is often the more common strategy. Of course, controlling space complexity is also very important when dealing with large volumes of data.

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 Summary","text":""},{"location":"chapter_computational_complexity/summary/#1-key-review","title":"1. \u00a0 Key review","text":"

    Algorithm Efficiency Assessment

    • Time efficiency and space efficiency are the two main criteria for assessing the merits of an algorithm.
    • We can assess algorithm efficiency through actual testing, but it's challenging to eliminate the influence of the test environment, and it consumes substantial computational resources.
    • Complexity analysis can overcome the disadvantages of actual testing. Its results are applicable across all operating platforms and can reveal the efficiency of algorithms at different data scales.

    Time Complexity

    • Time complexity measures the trend of an algorithm's running time with the increase in data volume, effectively assessing algorithm efficiency. However, it can fail in certain cases, such as with small input data volumes or when time complexities are the same, making it challenging to precisely compare the efficiency of algorithms.
    • Worst-case time complexity is denoted using big O notation, representing the asymptotic upper bound, reflecting the growth level of the number of operations \\(T(n)\\) as \\(n\\) approaches infinity.
    • Calculating time complexity involves two steps: first counting the number of operations, then determining the asymptotic upper bound.
    • Common time complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n \\log n)\\), \\(O(n^2)\\), \\(O(2^n)\\), and \\(O(n!)\\), among others.
    • The time complexity of some algorithms is not fixed and depends on the distribution of input data. Time complexities are divided into worst, best, and average cases. The best case is rarely used because input data generally needs to meet strict conditions to achieve the best case.
    • Average time complexity reflects the efficiency of an algorithm under random data inputs, closely resembling the algorithm's performance in actual applications. Calculating average time complexity requires accounting for the distribution of input data and the subsequent mathematical expectation.

    Space Complexity

    • Space complexity, similar to time complexity, measures the trend of memory space occupied by an algorithm with the increase in data volume.
    • The relevant memory space used during the algorithm's execution can be divided into input space, temporary space, and output space. Generally, input space is not included in space complexity calculations. Temporary space can be divided into temporary data, stack frame space, and instruction space, where stack frame space usually affects space complexity only in recursive functions.
    • We usually focus only on the worst-case space complexity, which means calculating the space complexity of the algorithm under the worst input data and at the worst moment of operation.
    • Common space complexities, arranged from low to high, include \\(O(1)\\), \\(O(\\log n)\\), \\(O(n)\\), \\(O(n^2)\\), and \\(O(2^n)\\), among others.
    "},{"location":"chapter_computational_complexity/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the space complexity of tail recursion \\(O(1)\\)?

    Theoretically, the space complexity of a tail-recursive function can be optimized to \\(O(1)\\). However, most programming languages (such as Java, Python, C++, Go, C#) do not support automatic optimization of tail recursion, so it's generally considered to have a space complexity of \\(O(n)\\).

    Q: What is the difference between the terms \"function\" and \"method\"?

    A \"function\" can be executed independently, with all parameters passed explicitly. A \"method\" is associated with an object and is implicitly passed to the object calling it, able to operate on the data contained within an instance of a class.

    Here are some examples from common programming languages:

    • C is a procedural programming language without object-oriented concepts, so it only has functions. However, we can simulate object-oriented programming by creating structures (struct), and functions associated with these structures are equivalent to methods in other programming languages.
    • Java and C# are object-oriented programming languages where code blocks (methods) are typically part of a class. Static methods behave like functions because they are bound to the class and cannot access specific instance variables.
    • C++ and Python support both procedural programming (functions) and object-oriented programming (methods).

    Q: Does the \"Common Types of Space Complexity\" figure reflect the absolute size of occupied space?

    No, the figure shows space complexities, which reflect growth trends, not the absolute size of the occupied space.

    If you take \\(n = 8\\), you might find that the values of each curve don't correspond to their functions. This is because each curve includes a constant term, intended to compress the value range into a visually comfortable range.

    In practice, since we usually don't know the \"constant term\" complexity of each method, it's generally not possible to choose the best solution for \\(n = 8\\) based solely on complexity. However, for \\(n = 8^5\\), it's much easier to choose, as the growth trend becomes dominant.

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 Time complexity","text":"

    Time complexity is a concept used to measure how the run time of an algorithm increases with the size of the input data. Understanding time complexity is crucial for accurately assessing the efficiency of an algorithm.

    1. Determining the Running Platform: This includes hardware configuration, programming language, system environment, etc., all of which can affect the efficiency of code execution.
    2. Evaluating the Run Time for Various Computational Operations: For instance, an addition operation + might take 1 ns, a multiplication operation * might take 10 ns, a print operation print() might take 5 ns, etc.
    3. Counting All the Computational Operations in the Code: Summing the execution times of all these operations gives the total run time.

    For example, consider the following code with an input size of \\(n\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Under an operating platform\ndef algorithm(n: int):\n    a = 2      # 1 ns\n    a = a + 1  # 1 ns\n    a = a * 2  # 10 ns\n    # Cycle n times\n    for _ in range(n):  # 1 ns\n        print(0)        # 5 ns\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        cout << 0 << endl;         // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        System.out.println(0);     // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid Algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {  // 1 ns , every round i++ is executed\n        Console.WriteLine(0);      // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunc algorithm(n int) {\n    a := 2     // 1 ns\n    a = a + 1  // 1 ns\n    a = a * 2  // 10 ns\n    // Loop n times\n    for i := 0; i < n; i++ {  // 1 ns\n        fmt.Println(a)        // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunc algorithm(n: Int) {\n    var a = 2 // 1 ns\n    a = a + 1 // 1 ns\n    a = a * 2 // 10 ns\n    // Loop n times\n    for _ in 0 ..< n { // 1 ns\n        print(0) // 5 ns\n    }\n}\n
    // Under a particular operating platform\nfunction algorithm(n) {\n    var a = 2; // 1 ns\n    a = a + 1; // 1 ns\n    a = a * 2; // 10 ns\n    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
    // Under a particular operating platform\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    // Loop n times\n    for(let i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n        console.log(0); // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n  int a = 2; // 1 ns\n  a = a + 1; // 1 ns\n  a = a * 2; // 10 ns\n  // Loop n times\n  for (int i = 0; i < n; i++) { // 1 ns , every round i++ is executed\n    print(0); // 5 ns\n  }\n}\n
    // Under a particular operating platform\nfn algorithm(n: i32) {\n    let mut a = 2;      // 1 ns\n    a = a + 1;          // 1 ns\n    a = a * 2;          // 10 ns\n    // Loop n times\n    for _ in 0..n {     // 1 ns for each round i++\n        println!(\"{}\", 0);  // 5 ns\n    }\n}\n
    // Under a particular operating platform\nvoid algorithm(int n) {\n    int a = 2;  // 1 ns\n    a = a + 1;  // 1 ns\n    a = a * 2;  // 10 ns\n    // Loop n times\n    for (int i = 0; i < n; i++) {   // 1 ns , every round i++ is executed\n        printf(\"%d\", 0);            // 5 ns\n    }\n}\n
    \n
    // Under a particular operating platform\nfn algorithm(n: usize) void {\n    var a: i32 = 2; // 1 ns\n    a += 1; // 1 ns\n    a *= 2; // 10 ns\n    // Loop n times\n    for (0..n) |_| { // 1 ns\n        std.debug.print(\"{}\\n\", .{0}); // 5 ns\n    }\n}\n

    Using the above method, the run time of the algorithm can be calculated as \\((6n + 12)\\) ns:

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

    However, in practice, counting the run time of an algorithm is neither practical nor reasonable. First, we don't want to tie the estimated time to the running platform, as algorithms need to run on various platforms. Second, it's challenging to know the run time for each type of operation, making the estimation process difficult.

    "},{"location":"chapter_computational_complexity/time_complexity/#231-assessing-time-growth-trend","title":"2.3.1 \u00a0 Assessing time growth trend","text":"

    Time complexity analysis does not count the algorithm's run time, but rather the growth trend of the run time as the data volume increases.

    Let's understand this concept of \"time growth trend\" with an example. Assume the input data size is \\(n\\), and consider three algorithms A, B, and C:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Time complexity of algorithm A: constant order\ndef algorithm_A(n: int):\n    print(0)\n# Time complexity of algorithm B: linear order\ndef algorithm_B(n: int):\n    for _ in range(n):\n        print(0)\n# Time complexity of algorithm C: constant order\ndef algorithm_C(n: int):\n    for _ in range(1000000):\n        print(0)\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    cout << 0 << endl;\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        cout << 0 << endl;\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        cout << 0 << endl;\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    System.out.println(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        System.out.println(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        System.out.println(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid AlgorithmA(int n) {\n    Console.WriteLine(0);\n}\n// Time complexity of algorithm B: linear order\nvoid AlgorithmB(int n) {\n    for (int i = 0; i < n; i++) {\n        Console.WriteLine(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid AlgorithmC(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        Console.WriteLine(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunc algorithm_A(n int) {\n    fmt.Println(0)\n}\n// Time complexity of algorithm B: linear order\nfunc algorithm_B(n int) {\n    for i := 0; i < n; i++ {\n        fmt.Println(0)\n    }\n}\n// Time complexity of algorithm C: constant order\nfunc algorithm_C(n int) {\n    for i := 0; i < 1000000; i++ {\n        fmt.Println(0)\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunc algorithmA(n: Int) {\n    print(0)\n}\n\n// Time complexity of algorithm B: linear order\nfunc algorithmB(n: Int) {\n    for _ in 0 ..< n {\n        print(0)\n    }\n}\n\n// Time complexity of algorithm C: constant order\nfunc algorithmC(n: Int) {\n    for _ in 0 ..< 1_000_000 {\n        print(0)\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunction algorithm_A(n) {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n) {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n) {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nfunction algorithm_A(n: number): void {\n    console.log(0);\n}\n// Time complexity of algorithm B: linear order\nfunction algorithm_B(n: number): void {\n    for (let i = 0; i < n; i++) {\n        console.log(0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfunction algorithm_C(n: number): void {\n    for (let i = 0; i < 1000000; i++) {\n        console.log(0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithmA(int n) {\n  print(0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithmB(int n) {\n  for (int i = 0; i < n; i++) {\n    print(0);\n  }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithmC(int n) {\n  for (int i = 0; i < 1000000; i++) {\n    print(0);\n  }\n}\n
    // Time complexity of algorithm A: constant order\nfn algorithm_A(n: i32) {\n    println!(\"{}\", 0);\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) {\n    for _ in 0..n {\n        println!(\"{}\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) {\n    for _ in 0..1000000 {\n        println!(\"{}\", 0);\n    }\n}\n
    // Time complexity of algorithm A: constant order\nvoid algorithm_A(int n) {\n    printf(\"%d\", 0);\n}\n// Time complexity of algorithm B: linear order\nvoid algorithm_B(int n) {\n    for (int i = 0; i < n; i++) {\n        printf(\"%d\", 0);\n    }\n}\n// Time complexity of algorithm C: constant order\nvoid algorithm_C(int n) {\n    for (int i = 0; i < 1000000; i++) {\n        printf(\"%d\", 0);\n    }\n}\n
    \n
    // Time complexity of algorithm A: constant order\nfn algorithm_A(n: usize) void {\n    _ = n;\n    std.debug.print(\"{}\\n\", .{0});\n}\n// Time complexity of algorithm B: linear order\nfn algorithm_B(n: i32) void {\n    for (0..n) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n// Time complexity of algorithm C: constant order\nfn algorithm_C(n: i32) void {\n    _ = n;\n    for (0..1000000) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n}\n

    The following figure shows the time complexities of these three algorithms.

    • Algorithm A has just one print operation, and its run time does not grow with \\(n\\). Its time complexity is considered \"constant order.\"
    • Algorithm B involves a print operation looping \\(n\\) times, and its run time grows linearly with \\(n\\). Its time complexity is \"linear order.\"
    • Algorithm C has a print operation looping 1,000,000 times. Although it takes a long time, it is independent of the input data size \\(n\\). Therefore, the time complexity of C is the same as A, which is \"constant order.\"

    Figure 2-7 \u00a0 Time growth trend of algorithms a, b, and c

    Compared to directly counting the run time of an algorithm, what are the characteristics of time complexity analysis?

    • Time complexity effectively assesses algorithm efficiency. For instance, algorithm B has linearly growing run time, which is slower than algorithm A when \\(n > 1\\) and slower than C when \\(n > 1,000,000\\). In fact, as long as the input data size \\(n\\) is sufficiently large, a \"constant order\" complexity algorithm will always be better than a \"linear order\" one, demonstrating the essence of time growth trend.
    • Time complexity analysis is more straightforward. Obviously, the running platform and the types of computational operations are irrelevant to the trend of run time growth. Therefore, in time complexity analysis, we can simply treat the execution time of all computational operations as the same \"unit time,\" simplifying the \"computational operation run time count\" to a \"computational operation count.\" This significantly reduces the complexity of estimation.
    • Time complexity has its limitations. For example, although algorithms A and C have the same time complexity, their actual run times can be quite different. Similarly, even though algorithm B has a higher time complexity than C, it is clearly superior when the input data size \\(n\\) is small. In these cases, it's difficult to judge the efficiency of algorithms based solely on time complexity. Nonetheless, despite these issues, complexity analysis remains the most effective and commonly used method for evaluating algorithm efficiency.
    "},{"location":"chapter_computational_complexity/time_complexity/#232-asymptotic-upper-bound","title":"2.3.2 \u00a0 Asymptotic upper bound","text":"

    Consider a function with an input size of \\(n\\):

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # Cycle n times\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    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\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    // Loop n times\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    // Loop n times\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    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\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    // Loop n times\n    for(let i = 0; i < n; i++){ // +1 (execute i ++ every round)\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  // Loop n times\n  for (int i = 0; i < n; i++) { // +1 (execute i ++ every round)\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    // Loop n times\n    for _ in 0..n { // +1 (execute i ++ every round)\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    // Loop n times\n    for (int i = 0; i < n; i++) {   // +1 (execute i ++ every round)\n        printf(\"%d\", 0);            // +1\n    }\n} \n
    \n
    fn algorithm(n: usize) void {\n    var a: i32 = 1; // +1\n    a += 1; // +1\n    a *= 2; // +1\n    // Loop n times\n    for (0..n) |_| { // +1 (execute i ++ every round)\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    Given a function that represents the number of operations of an algorithm as a function of the input size \\(n\\), denoted as \\(T(n)\\), consider the following example:

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

    Since \\(T(n)\\) is a linear function, its growth trend is linear, and therefore, its time complexity is of linear order, denoted as \\(O(n)\\). This mathematical notation, known as \"big-O notation,\" represents the \"asymptotic upper bound\" of the function \\(T(n)\\).

    In essence, time complexity analysis is about finding the asymptotic upper bound of the \"number of operations \\(T(n)\\)\". It has a precise mathematical definition.

    Asymptotic Upper Bound

    If there exist positive real numbers \\(c\\) and \\(n_0\\) such that for all \\(n > n_0\\), \\(T(n) \\leq c \\cdot f(n)\\), then \\(f(n)\\) is considered an asymptotic upper bound of \\(T(n)\\), denoted as \\(T(n) = O(f(n))\\).

    As illustrated below, calculating the asymptotic upper bound involves finding a function \\(f(n)\\) such that, as \\(n\\) approaches infinity, \\(T(n)\\) and \\(f(n)\\) have the same growth order, differing only by a constant factor \\(c\\).

    Figure 2-8 \u00a0 Asymptotic upper bound of a function

    "},{"location":"chapter_computational_complexity/time_complexity/#233-calculation-method","title":"2.3.3 \u00a0 Calculation method","text":"

    While the concept of asymptotic upper bound might seem mathematically dense, you don't need to fully grasp it right away. Let's first understand the method of calculation, which can be practiced and comprehended over time.

    Once \\(f(n)\\) is determined, we obtain the time complexity \\(O(f(n))\\). But how do we determine the asymptotic upper bound \\(f(n)\\)? This process generally involves two steps: counting the number of operations and determining the asymptotic upper bound.

    "},{"location":"chapter_computational_complexity/time_complexity/#1-step-1-counting-the-number-of-operations","title":"1. \u00a0 Step 1: counting the number of operations","text":"

    This step involves going through the code line by line. However, due to the presence of the constant \\(c\\) in \\(c \\cdot f(n)\\), all coefficients and constant terms in \\(T(n)\\) can be ignored. This principle allows for simplification techniques in counting operations.

    1. Ignore constant terms in \\(T(n)\\), as they do not affect the time complexity being independent of \\(n\\).
    2. Omit all coefficients. For example, looping \\(2n\\), \\(5n + 1\\) times, etc., can be simplified to \\(n\\) times since the coefficient before \\(n\\) does not impact the time complexity.
    3. Use multiplication for nested loops. The total number of operations equals the product of the number of operations in each loop, applying the simplification techniques from points 1 and 2 for each loop level.

    Given a function, we can use these techniques to count operations:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    def algorithm(n: int):\n    a = 1      # +0 (trick 1)\n    a = a + n  # +0 (trick 1)\n    # +n (technique 2)\n    for i in range(5 * n + 1):\n        print(0)\n    # +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        cout << 0 << endl;\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        System.out.println(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        Console.WriteLine(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n  // +0 (trick 1)\n    // +n (technique 2)\n    for i := 0; i < 5 * n + 1; i++ {\n        fmt.Println(0)\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n // +0 (trick 1)\n    // +n (technique 2)\n    for _ in 0 ..< (5 * n + 1) {\n        print(0)\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (let i = 0; i < 5 * n + 1; i++) {\n        console.log(0);\n    }\n    // +n*n (technique 3)\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 (trick 1)\n  a = a + n; // +0 (trick 1)\n  // +n (technique 2)\n  for (int i = 0; i < 5 * n + 1; i++) {\n    print(0);\n  }\n  // +n*n (technique 3)\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 (trick 1)\n    a = a + n;        // +0 (trick 1)\n\n    // +n (technique 2)\n    for i in 0..(5 * n + 1) {\n        println!(\"{}\", 0);\n    }\n\n    // +n*n (technique 3)\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 (trick 1)\n    a = a + n;  // +0 (trick 1)\n    // +n (technique 2)\n    for (int i = 0; i < 5 * n + 1; i++) {\n        printf(\"%d\", 0);\n    }\n    // +n*n (technique 3)\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
    \n
    fn algorithm(n: usize) void {\n    var a: i32 = 1;     // +0 (trick 1)\n    a = a + @as(i32, @intCast(n));        // +0 (trick 1)\n\n    // +n (technique 2)\n    for(0..(5 * n + 1)) |_| {\n        std.debug.print(\"{}\\n\", .{0});\n    }\n\n    // +n*n (technique 3)\n    for(0..(2 * n)) |_| {\n        for(0..(n + 1)) |_| {\n            std.debug.print(\"{}\\n\", .{0});\n        }\n    }\n}\n

    The formula below shows the counting results before and after simplification, both leading to a time complexity of \\(O(n^2)\\):

    \\[ \\begin{aligned} T(n) & = 2n(n + 1) + (5n + 1) + 2 & \\text{Complete Count (-.-|||)} \\newline & = 2n^2 + 7n + 3 \\newline T(n) & = n^2 + n & \\text{Simplified Count (o.O)} \\end{aligned} \\]"},{"location":"chapter_computational_complexity/time_complexity/#2-step-2-determining-the-asymptotic-upper-bound","title":"2. \u00a0 Step 2: determining the asymptotic upper bound","text":"

    The time complexity is determined by the highest order term in \\(T(n)\\). This is because, as \\(n\\) approaches infinity, the highest order term dominates, rendering the influence of other terms negligible.

    The following table illustrates examples of different operation counts and their corresponding time complexities. Some exaggerated values are used to emphasize that coefficients cannot alter the order of growth. When \\(n\\) becomes very large, these constants become insignificant.

    Table: Time complexity for different operation counts

    Operation Count \\(T(n)\\) Time Complexity \\(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-common-types-of-time-complexity","title":"2.3.4 \u00a0 Common types of time complexity","text":"

    Let's consider the input data size as \\(n\\). The common types of time complexities are illustrated below, arranged from lowest to highest:

    \\[ \\begin{aligned} O(1) < O(\\log n) < O(n) < O(n \\log n) < O(n^2) < O(2^n) < O(n!) \\newline \\text{Constant Order} < \\text{Logarithmic Order} < \\text{Linear Order} < \\text{Linear-Logarithmic Order} < \\text{Quadratic Order} < \\text{Exponential Order} < \\text{Factorial Order} \\end{aligned} \\]

    Figure 2-9 \u00a0 Common types of time complexity

    "},{"location":"chapter_computational_complexity/time_complexity/#1-constant-order-o1","title":"1. \u00a0 Constant order \\(O(1)\\)","text":"

    Constant order means the number of operations is independent of the input data size \\(n\\). In the following function, although the number of operations size might be large, the time complexity remains \\(O(1)\\) as it's unrelated to \\(n\\):

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_computational_complexity/time_complexity/#2-linear-order-on","title":"2. \u00a0 Linear order \\(O(n)\\)","text":"

    Linear order indicates the number of operations grows linearly with the input data size \\(n\\). Linear order commonly appears in single-loop structures:

    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
    Code Visualization

    Full Screen >

    Operations like array traversal and linked list traversal have a time complexity of \\(O(n)\\), where \\(n\\) is the length of the array or list:

    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
    Code Visualization

    Full Screen >

    It's important to note that the input data size \\(n\\) should be determined based on the type of input data. For example, in the first example, \\(n\\) represents the input data size, while in the second example, the length of the array \\(n\\) is the data size.

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

    Quadratic order means the number of operations grows quadratically with the input data size \\(n\\). Quadratic order typically appears in nested loops, where both the outer and inner loops have a time complexity of \\(O(n)\\), resulting in an overall complexity of \\(O(n^2)\\):

    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
    Code Visualization

    Full Screen >

    The following image compares constant order, linear order, and quadratic order time complexities.

    Figure 2-10 \u00a0 Constant, linear, and quadratic order time complexities

    For instance, in bubble sort, the outer loop runs \\(n - 1\\) times, and the inner loop runs \\(n-1\\), \\(n-2\\), ..., \\(2\\), \\(1\\) times, averaging \\(n / 2\\) times, resulting in a time complexity of \\(O((n - 1) n / 2) = O(n^2)\\):

    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
    Code Visualization

    Full Screen >

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

    Biological \"cell division\" is a classic example of exponential order growth: starting with one cell, it becomes two after one division, four after two divisions, and so on, resulting in \\(2^n\\) cells after \\(n\\) divisions.

    The following image and code simulate the cell division process, with a time complexity of \\(O(2^n)\\):

    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
    Code Visualization

    Full Screen >

    Figure 2-11 \u00a0 Exponential order time complexity

    In practice, exponential order often appears in recursive functions. For example, in the code below, it recursively splits into two halves, stopping after \\(n\\) divisions:

    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
    Code Visualization

    Full Screen >

    Exponential order growth is extremely rapid and is commonly seen in exhaustive search methods (brute force, backtracking, etc.). For large-scale problems, exponential order is unacceptable, often requiring dynamic programming or greedy algorithms as solutions.

    "},{"location":"chapter_computational_complexity/time_complexity/#5-logarithmic-order-olog-n","title":"5. \u00a0 Logarithmic order \\(O(\\log n)\\)","text":"

    In contrast to exponential order, logarithmic order reflects situations where \"the size is halved each round.\" Given an input data size \\(n\\), since the size is halved each round, the number of iterations is \\(\\log_2 n\\), the inverse function of \\(2^n\\).

    The following image and code simulate the \"halving each round\" process, with a time complexity of \\(O(\\log_2 n)\\), commonly abbreviated as \\(O(\\log n)\\):

    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
    Code Visualization

    Full Screen >

    Figure 2-12 \u00a0 Logarithmic order time complexity

    Like exponential order, logarithmic order also frequently appears in recursive functions. The code below forms a recursive tree of height \\(\\log_2 n\\):

    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
    Code Visualization

    Full Screen >

    Logarithmic order is typical in algorithms based on the divide-and-conquer strategy, embodying the \"split into many\" and \"simplify complex problems\" approach. It's slow-growing and is the most ideal time complexity after constant order.

    What is the base of \\(O(\\log n)\\)?

    Technically, \"splitting into \\(m\\)\" corresponds to a time complexity of \\(O(\\log_m n)\\). Using the logarithm base change formula, we can equate different logarithmic complexities:

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

    This means the base \\(m\\) can be changed without affecting the complexity. Therefore, we often omit the base \\(m\\) and simply denote logarithmic order as \\(O(\\log n)\\).

    "},{"location":"chapter_computational_complexity/time_complexity/#6-linear-logarithmic-order-on-log-n","title":"6. \u00a0 Linear-logarithmic order \\(O(n \\log n)\\)","text":"

    Linear-logarithmic order often appears in nested loops, with the complexities of the two loops being \\(O(\\log n)\\) and \\(O(n)\\) respectively. The related code is as follows:

    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    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\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
    Code Visualization

    Full Screen >

    The image below demonstrates how linear-logarithmic order is generated. Each level of a binary tree has \\(n\\) operations, and the tree has \\(\\log_2 n + 1\\) levels, resulting in a time complexity of \\(O(n \\log n)\\).

    Figure 2-13 \u00a0 Linear-logarithmic order time complexity

    Mainstream sorting algorithms typically have a time complexity of \\(O(n \\log n)\\), such as quicksort, mergesort, and heapsort.

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

    Factorial order corresponds to the mathematical problem of \"full permutation.\" Given \\(n\\) distinct elements, the total number of possible permutations is:

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

    Factorials are typically implemented using recursion. As shown in the image and code below, the first level splits into \\(n\\) branches, the second level into \\(n - 1\\) branches, and so on, stopping after the \\(n\\)th level:

    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
    Code Visualization

    Full Screen >

    Figure 2-14 \u00a0 Factorial order time complexity

    Note that factorial order grows even faster than exponential order; it's unacceptable for larger \\(n\\) values.

    "},{"location":"chapter_computational_complexity/time_complexity/#235-worst-best-and-average-time-complexities","title":"2.3.5 \u00a0 Worst, best, and average time complexities","text":"

    The time efficiency of an algorithm is often not fixed but depends on the distribution of the input data. Assume we have an array nums of length \\(n\\), consisting of numbers from \\(1\\) to \\(n\\), each appearing only once, but in a randomly shuffled order. The task is to return the index of the element \\(1\\). We can draw the following conclusions:

    • When nums = [?, ?, ..., 1], that is, when the last element is \\(1\\), it requires a complete traversal of the array, achieving the worst-case time complexity of \\(O(n)\\).
    • When nums = [1, ?, ?, ...], that is, when the first element is \\(1\\), no matter the length of the array, no further traversal is needed, achieving the best-case time complexity of \\(\\Omega(1)\\).

    The \"worst-case time complexity\" corresponds to the asymptotic upper bound, denoted by the big \\(O\\) notation. Correspondingly, the \"best-case time complexity\" corresponds to the asymptotic lower bound, denoted by \\(\\Omega\\):

    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
    Code Visualization

    Full Screen >

    It's important to note that the best-case time complexity is rarely used in practice, as it is usually only achievable under very low probabilities and might be misleading. The worst-case time complexity is more practical as it provides a safety value for efficiency, allowing us to confidently use the algorithm.

    From the above example, it's clear that both the worst-case and best-case time complexities only occur under \"special data distributions,\" which may have a small probability of occurrence and may not accurately reflect the algorithm's run efficiency. In contrast, the average time complexity can reflect the algorithm's efficiency under random input data, denoted by the \\(\\Theta\\) notation.

    For some algorithms, we can simply estimate the average case under a random data distribution. For example, in the aforementioned example, since the input array is shuffled, the probability of element \\(1\\) appearing at any index is equal. Therefore, the average number of loops for the algorithm is half the length of the array \\(n / 2\\), giving an average time complexity of \\(\\Theta(n / 2) = \\Theta(n)\\).

    However, calculating the average time complexity for more complex algorithms can be quite difficult, as it's challenging to analyze the overall mathematical expectation under the data distribution. In such cases, we usually use the worst-case time complexity as the standard for judging the efficiency of the algorithm.

    Why is the \\(\\Theta\\) symbol rarely seen?

    Possibly because the \\(O\\) notation is more commonly spoken, it is often used to represent the average time complexity. However, strictly speaking, this practice is not accurate. In this book and other materials, if you encounter statements like \"average time complexity \\(O(n)\\)\", please understand it directly as \\(\\Theta(n)\\).

    "},{"location":"chapter_data_structure/","title":"Chapter 3. \u00a0 Data structures","text":"

    Abstract

    Data structures serve as a robust and diverse framework.

    They offer a blueprint for the orderly organization of data, upon which algorithms come to life.

    "},{"location":"chapter_data_structure/#chapter-contents","title":"Chapter contents","text":"
    • 3.1 \u00a0 Classification of data structures
    • 3.2 \u00a0 Basic data types
    • 3.3 \u00a0 Number encoding *
    • 3.4 \u00a0 Character encoding *
    • 3.5 \u00a0 Summary
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 Basic data types","text":"

    When discussing data in computers, various forms like text, images, videos, voice and 3D models comes to mind. Despite their different organizational forms, they are all composed of various basic data types.

    Basic data types are those that the CPU can directly operate on and are directly used in algorithms, mainly including the following.

    • Integer types: byte, short, int, long.
    • Floating-point types: float, double, used to represent decimals.
    • Character type: char, used to represent letters, punctuation, and even emojis in various languages.
    • Boolean type: bool, used to represent \"yes\" or \"no\" decisions.

    Basic data types are stored in computers in binary form. One binary digit is 1 bit. In most modern operating systems, 1 byte consists of 8 bits.

    The range of values for basic data types depends on the size of the space they occupy. Below, we take Java as an example.

    • The integer type byte occupies 1 byte = 8 bits and can represent \\(2^8\\) numbers.
    • The integer type int occupies 4 bytes = 32 bits and can represent \\(2^{32}\\) numbers.

    The following table lists the space occupied, value range, and default values of various basic data types in Java. While memorizing this table isn't necessary, having a general understanding of it and referencing it when required is recommended.

    Table 3-1 \u00a0 Space occupied and value range of basic data types

    Type Symbol Space Occupied Minimum Value Maximum Value Default Value Integer byte 1 byte \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) 0 short 2 bytes \\(-2^{15}\\) \\(2^{15} - 1\\) 0 int 4 bytes \\(-2^{31}\\) \\(2^{31} - 1\\) 0 long 8 bytes \\(-2^{63}\\) \\(2^{63} - 1\\) 0 Float float 4 bytes \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 bytes \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) 0.0 Char char 2 bytes 0 \\(2^{16} - 1\\) 0 Boolean bool 1 byte \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    Please note that the above table is specific to Java's basic data types. Every programming language has its own data type definitions, which might differ in space occupied, value ranges, and default values.

    • In Python, the integer type int can be of any size, limited only by available memory; the floating-point float is double precision 64-bit; there is no char type, as a single character is actually a string str of length 1.
    • C and C++ do not specify the size of basic data types, it varies with implementation and platform. The above table follows the LP64 data model, used for Unix 64-bit operating systems including Linux and macOS.
    • The size of char in C and C++ is 1 byte, while in most programming languages, it depends on the specific character encoding method, as detailed in the \"Character Encoding\" chapter.
    • Even though representing a boolean only requires 1 bit (0 or 1), it is usually stored in memory as 1 byte. This is because modern computer CPUs typically use 1 byte as the smallest addressable memory unit.

    So, what is the connection between basic data types and data structures? We know that data structures are ways to organize and store data in computers. The focus here is on \"structure\" rather than \"data\".

    If we want to represent \"a row of numbers\", we naturally think of using an array. This is because the linear structure of an array can represent the adjacency and the ordering of the numbers, but whether the stored content is an integer int, a decimal float, or a character char, is irrelevant to the \"data structure\".

    In other words, basic data types provide the \"content type\" of data, while data structures provide the \"way of organizing\" data. For example, in the following code, we use the same data structure (array) to store and represent different basic data types, including int, float, char, bool, etc.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    # Using various basic data types to initialize arrays\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python's characters are actually strings of length 1\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python's lists can freely store various basic data types and object references\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // Using various basic data types to initialize arrays\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // Using various basic data types to initialize arrays\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // Using various basic data types to initialize arrays\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // Using various basic data types to initialize arrays\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's arrays can freely store various basic data types and objects\nconst array = [0, 0.0, 'a', false];\n
    // Using various basic data types to initialize arrays\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // Using various basic data types to initialize arrays\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
    // Using various basic data types to initialize arrays\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
    // Using various basic data types to initialize arrays\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    \n
    // Using various basic data types to initialize arrays\nvar numbers: [5]i32 = undefined;\nvar decimals: [5]f32 = undefined;\nvar characters: [5]u8 = undefined;\nvar bools: [5]bool = undefined;\n
    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 Character encoding *","text":"

    In the computer system, all data is stored in binary form, and characters (represented by char) are no exception. To represent characters, we need to develop a \"character set\" that defines a one-to-one mapping between each character and binary numbers. With the character set, computers can convert binary numbers to characters by looking up the table.

    "},{"location":"chapter_data_structure/character_encoding/#341-ascii-character-set","title":"3.4.1 \u00a0 ASCII character set","text":"

    The \"ASCII code\" is one of the earliest character sets, officially known as the American Standard Code for Information Interchange. It uses 7 binary digits (the lower 7 bits of a byte) to represent a character, allowing for a maximum of 128 different characters. As shown in the Figure 3-6 , ASCII includes uppercase and lowercase English letters, numbers 0 ~ 9, various punctuation marks, and certain control characters (such as newline and tab).

    Figure 3-6 \u00a0 ASCII code

    However, ASCII can only represent English characters. With the globalization of computers, a character set called \"EASCII\" was developed to represent more languages. It expands from the 7-bit structure of ASCII to 8 bits, enabling the representation of 256 characters.

    Globally, various region-specific EASCII character sets have been introduced. The first 128 characters of these sets are consistent with the ASCII, while the remaining 128 characters are defined differently to accommodate the requirements of different languages.

    "},{"location":"chapter_data_structure/character_encoding/#342-gbk-character-set","title":"3.4.2 \u00a0 GBK character set","text":"

    Later, it was found that EASCII still could not meet the character requirements of many languages. For instance, there are nearly a hundred thousand Chinese characters, with several thousand used regularly. In 1980, the Standardization Administration of China released the \"GB2312\" character set, which included 6763 Chinese characters, essentially fulfilling the computer processing needs for the Chinese language.

    However, GB2312 could not handle some rare and traditional characters. The \"GBK\" character set expands GB2312 and includes 21886 Chinese characters. In the GBK encoding scheme, ASCII characters are represented with one byte, while Chinese characters use two bytes.

    "},{"location":"chapter_data_structure/character_encoding/#343-unicode-character-set","title":"3.4.3 \u00a0 Unicode character set","text":"

    With the rapid evolution of computer technology and a plethora of character sets and encoding standards, numerous problems arose. On the one hand, these character sets generally only defined characters for specific languages and could not function properly in multilingual environments. On the other hand, the existence of multiple character set standards for the same language caused garbled text when information was exchanged between computers using different encoding standards.

    Researchers of that era thought: What if a comprehensive character set encompassing all global languages and symbols was developed? Wouldn't this resolve the issues associated with cross-linguistic environments and garbled text? Inspired by this idea, the extensive character set, Unicode, was born.

    \"Unicode\" is referred to as \"\u7edf\u4e00\u7801\" (Unified Code) in Chinese, theoretically capable of accommodating over a million characters. It aims to incorporate characters from all over the world into a single set, providing a universal character set for processing and displaying various languages and reducing the issues of garbled text due to different encoding standards.

    Since its release in 1991, Unicode has continually expanded to include new languages and characters. As of September 2022, Unicode contains 149,186 characters, including characters, symbols, and even emojis from various languages. In the vast Unicode character set, commonly used characters occupy 2 bytes, while some rare characters may occupy 3 or even 4 bytes.

    Unicode is a universal character set that assigns a number (called a \"code point\") to each character, but it does not specify how these character code points should be stored in a computer system. One might ask: How does a system interpret Unicode code points of varying lengths within a text? For example, given a 2-byte code, how does the system determine if it represents a single 2-byte character or two 1-byte characters?

    A straightforward solution to this problem is to store all characters as equal-length encodings. As shown in the Figure 3-7 , each character in \"Hello\" occupies 1 byte, while each character in \"\u7b97\u6cd5\" (algorithm) occupies 2 bytes. We could encode all characters in \"Hello \u7b97\u6cd5\" as 2 bytes by padding the higher bits with zeros. This method would enable the system to interpret a character every 2 bytes, recovering the content of the phrase.

    Figure 3-7 \u00a0 Unicode encoding example

    However, as ASCII has shown us, encoding English only requires 1 byte. Using the above approach would double the space occupied by English text compared to ASCII encoding, which is a waste of memory space. Therefore, a more efficient Unicode encoding method is needed.

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

    Currently, UTF-8 has become the most widely used Unicode encoding method internationally. It is a variable-length encoding, using 1 to 4 bytes to represent a character, depending on the complexity of the character. ASCII characters need only 1 byte, Latin and Greek letters require 2 bytes, commonly used Chinese characters need 3 bytes, and some other rare characters need 4 bytes.

    The encoding rules for UTF-8 are not complex and can be divided into two cases:

    • For 1-byte characters, set the highest bit to \\(0\\), and the remaining 7 bits to the Unicode code point. Notably, ASCII characters occupy the first 128 code points in the Unicode set. This means that UTF-8 encoding is backward compatible with ASCII. This implies that UTF-8 can be used to parse ancient ASCII text.
    • For characters of length \\(n\\) bytes (where \\(n > 1\\)), set the highest \\(n\\) bits of the first byte to \\(1\\), and the \\((n + 1)^{\\text{th}}\\) bit to \\(0\\); starting from the second byte, set the highest 2 bits of each byte to \\(10\\); the rest of the bits are used to fill the Unicode code point.

    The Figure 3-8 shows the UTF-8 encoding for \"Hello\u7b97\u6cd5\". It can be observed that since the highest \\(n\\) bits are set to \\(1\\), the system can determine the length of the character as \\(n\\) by counting the number of highest bits set to \\(1\\).

    But why set the highest 2 bits of the remaining bytes to \\(10\\)? Actually, this \\(10\\) serves as a kind of checksum. If the system starts parsing text from an incorrect byte, the \\(10\\) at the beginning of the byte can help the system quickly detect anomalies.

    The reason for using \\(10\\) as a checksum is that, under UTF-8 encoding rules, it's impossible for the highest two bits of a character to be \\(10\\). This can be proven by contradiction: If the highest two bits of a character are \\(10\\), it indicates that the character's length is \\(1\\), corresponding to ASCII. However, the highest bit of an ASCII character should be \\(0\\), which contradicts the assumption.

    Figure 3-8 \u00a0 UTF-8 encoding example

    Apart from UTF-8, other common encoding methods include:

    • UTF-16 encoding: Uses 2 or 4 bytes to represent a character. All ASCII characters and commonly used non-English characters are represented with 2 bytes; a few characters require 4 bytes. For 2-byte characters, the UTF-16 encoding equals the Unicode code point.
    • UTF-32 encoding: Every character uses 4 bytes. This means UTF-32 occupies more space than UTF-8 and UTF-16, especially for texts with a high proportion of ASCII characters.

    From the perspective of storage space, using UTF-8 to represent English characters is very efficient because it only requires 1 byte; using UTF-16 to encode some non-English characters (such as Chinese) can be more efficient because it only requires 2 bytes, while UTF-8 might need 3 bytes.

    From a compatibility perspective, UTF-8 is the most versatile, with many tools and libraries supporting UTF-8 as a priority.

    "},{"location":"chapter_data_structure/character_encoding/#345-character-encoding-in-programming-languages","title":"3.4.5 \u00a0 Character encoding in programming languages","text":"

    Historically, many programming languages utilized fixed-length encodings such as UTF-16 or UTF-32 for processing strings during program execution. This allows strings to be handled as arrays, offering several advantages:

    • Random access: Strings encoded in UTF-16 can be accessed randomly with ease. For UTF-8, which is a variable-length encoding, locating the \\(i^{th}\\) character requires traversing the string from the start to the \\(i^{th}\\) position, taking \\(O(n)\\) time.
    • Character counting: Similar to random access, counting the number of characters in a UTF-16 encoded string is an \\(O(1)\\) operation. However, counting characters in a UTF-8 encoded string requires traversing the entire string.
    • String operations: Many string operations like splitting, concatenating, inserting, and deleting are easier on UTF-16 encoded strings. These operations generally require additional computation on UTF-8 encoded strings to ensure the validity of the UTF-8 encoding.

    The design of character encoding schemes in programming languages is an interesting topic involving various factors:

    • Java\u2019s String type uses UTF-16 encoding, with each character occupying 2 bytes. This was based on the initial belief that 16 bits were sufficient to represent all possible characters and proven incorrect later. As the Unicode standard expanded beyond 16 bits, characters in Java may now be represented by a pair of 16-bit values, known as \u201csurrogate pairs.\u201d
    • JavaScript and TypeScript use UTF-16 encoding for similar reasons as Java. When JavaScript was first introduced by Netscape in 1995, Unicode was still in its early stages, and 16-bit encoding was sufficient to represent all Unicode characters.
    • C# uses UTF-16 encoding, largely because the .NET platform, designed by Microsoft, and many Microsoft technologies, including the Windows operating system, extensively use UTF-16 encoding.

    Due to the underestimation of character counts, these languages had to use \"surrogate pairs\" to represent Unicode characters exceeding 16 bits. This approach has its drawbacks: strings containing surrogate pairs may have characters occupying 2 or 4 bytes, losing the advantage of fixed-length encoding. Additionally, handling surrogate pairs adds complexity and debugging difficulty to programming.

    Addressing these challenges, some languages have adopted alternative encoding strategies:

    • Python\u2019s str type uses Unicode encoding with a flexible representation where the storage length of characters depends on the largest Unicode code point in the string. If all characters are ASCII, each character occupies 1 byte, 2 bytes for characters within the Basic Multilingual Plane (BMP), and 4 bytes for characters beyond the BMP.
    • Go\u2019s string type internally uses UTF-8 encoding. Go also provides the rune type for representing individual Unicode code points.
    • Rust\u2019s str and String types use UTF-8 encoding internally. Rust also offers the char type for individual Unicode code points.

    It\u2019s important to note that the above discussion pertains to how strings are stored in programming languages, which is different from how strings are stored in files or transmitted over networks. For file storage or network transmission, strings are usually encoded in UTF-8 format for optimal compatibility and space efficiency.

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 Classification of data structures","text":"

    Common data structures include arrays, linked lists, stacks, queues, hash tables, trees, heaps, and graphs. They can be classified into \"logical structure\" and \"physical structure\".

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311-logical-structure-linear-and-non-linear","title":"3.1.1 \u00a0 Logical structure: linear and non-linear","text":"

    The logical structures reveal the logical relationships between data elements. In arrays and linked lists, data are arranged in a specific sequence, demonstrating the linear relationship between data; while in trees, data are arranged hierarchically from the top down, showing the derived relationship between \"ancestors\" and \"descendants\"; and graphs are composed of nodes and edges, reflecting the intricate network relationship.

    As shown in the Figure 3-1 , logical structures can be divided into two major categories: \"linear\" and \"non-linear\". Linear structures are more intuitive, indicating data is arranged linearly in logical relationships; non-linear structures, conversely, are arranged non-linearly.

    • Linear data structures: Arrays, Linked Lists, Stacks, Queues, Hash Tables.
    • Non-linear data structures: Trees, Heaps, Graphs, Hash Tables.

    Figure 3-1 \u00a0 Linear and non-linear data structures

    Non-linear data structures can be further divided into tree structures and network structures.

    • Linear structures: Arrays, linked lists, queues, stacks, and hash tables, where elements have a one-to-one sequential relationship.
    • Tree structures: Trees, Heaps, Hash Tables, where elements have a one-to-many relationship.
    • Network structures: Graphs, where elements have a many-to-many relationships.
    "},{"location":"chapter_data_structure/classification_of_data_structure/#312-physical-structure-contiguous-and-dispersed","title":"3.1.2 \u00a0 Physical structure: contiguous and dispersed","text":"

    During the execution of an algorithm, the data being processed is stored in memory. The Figure 3-2 shows a computer memory stick where each black square is a physical memory space. We can think of memory as a vast Excel spreadsheet, with each cell capable of storing a certain amount of data.

    The system accesses the data at the target location by means of a memory address. As shown in the Figure 3-2 , the computer assigns a unique identifier to each cell in the table according to specific rules, ensuring that each memory space has a unique memory address. With these addresses, the program can access the data stored in memory.

    Figure 3-2 \u00a0 Memory stick, memory spaces, memory addresses

    Tip

    It's worth noting that comparing memory to an Excel spreadsheet is a simplified analogy. The actual working mechanism of memory is more complex, involving concepts like address space, memory management, cache mechanisms, virtual memory, and physical memory.

    Memory is a shared resource for all programs. When a block of memory is occupied by one program, it cannot be simultaneously used by other programs. Therefore, considering memory resources is crucial in designing data structures and algorithms. For instance, the algorithm's peak memory usage should not exceed the remaining free memory of the system; if there is a lack of contiguous memory blocks, then the data structure chosen must be able to be stored in non-contiguous memory blocks.

    As illustrated in the Figure 3-3 , the physical structure reflects the way data is stored in computer memory and it can be divided into contiguous space storage (arrays) and non-contiguous space storage (linked lists). The two types of physical structures exhibit complementary characteristics in terms of time efficiency and space efficiency.

    Figure 3-3 \u00a0 Contiguous space storage and dispersed space storage

    It is worth noting that all data structures are implemented based on arrays, linked lists, or a combination of both. For example, stacks and queues can be implemented using either arrays or linked lists; while implementations of hash tables may involve both arrays and linked lists. - Array-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, Matrices, Tensors (arrays with dimensions \\(\\geq 3\\)). - Linked-list-based implementations: Stacks, Queues, Hash Tables, Trees, Heaps, Graphs, etc.

    Data structures implemented based on arrays are also called \u201cStatic Data Structures,\u201d meaning their length cannot be changed after initialization. Conversely, those based on linked lists are called \u201cDynamic Data Structures,\u201d which can still adjust their size during program execution.

    Tip

    If you find it challenging to comprehend the physical structure, it is recommended that you read the next chapter, \"Arrays and Linked Lists,\" and revisit this section later.

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 Number encoding *","text":"

    Note

    In this book, chapters marked with an asterisk '*' are optional readings. If you are short on time or find them challenging, you may skip these initially and return to them after completing the essential chapters.

    "},{"location":"chapter_data_structure/number_encoding/#331-integer-encoding","title":"3.3.1 \u00a0 Integer encoding","text":"

    In the table from the previous section, we observed that all integer types can represent one more negative number than positive numbers, such as the byte range of \\([-128, 127]\\). This phenomenon seems counterintuitive, and its underlying reason involves knowledge of sign-magnitude, one's complement, and two's complement encoding.

    Firstly, it's important to note that numbers are stored in computers using the two's complement form. Before analyzing why this is the case, let's define these three encoding methods:

    • Sign-magnitude: The highest bit of a binary representation of a number is considered the sign bit, where \\(0\\) represents a positive number and \\(1\\) represents a negative number. The remaining bits represent the value of the number.
    • One's complement: The one's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by inverting all bits except the sign bit.
    • Two's complement: The two's complement of a positive number is the same as its sign-magnitude. For negative numbers, it's obtained by adding \\(1\\) to their one's complement.

    The following diagram illustrates the conversions among sign-magnitude, one's complement, and two's complement:

    Figure 3-4 \u00a0 Conversions between sign-magnitude, one's complement, and two's complement

    Although sign-magnitude is the most intuitive, it has limitations. For one, negative numbers in sign-magnitude cannot be directly used in calculations. For example, in sign-magnitude, calculating \\(1 + (-2)\\) results in \\(-3\\), which is incorrect.

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

    To address this, computers introduced the one's complement. If we convert to one's complement and calculate \\(1 + (-2)\\), then convert the result back to sign-magnitude, we get the correct result of \\(-1\\).

    \\[ \\begin{aligned} & 1 + (-2) \\newline & \\rightarrow 0000 \\; 0001 \\; \\text{(Sign-magnitude)} + 1000 \\; 0010 \\; \\text{(Sign-magnitude)} \\newline & = 0000 \\; 0001 \\; \\text{(One's complement)} + 1111 \\; 1101 \\; \\text{(One's complement)} \\newline & = 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & \\rightarrow -1 \\end{aligned} \\]

    Additionally, there are two representations of zero in sign-magnitude: \\(+0\\) and \\(-0\\). This means two different binary encodings for zero, which could lead to ambiguity. For example, in conditional checks, not differentiating between positive and negative zero might result in incorrect outcomes. Addressing this ambiguity would require additional checks, potentially reducing computational efficiency.

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

    Like sign-magnitude, one's complement also suffers from the positive and negative zero ambiguity. Therefore, computers further introduced the two's complement. Let's observe the conversion process for negative zero in sign-magnitude, one's complement, and two's complement:

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(Sign-magnitude)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(One's complement)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(Two's complement)} \\newline \\end{aligned} \\]

    Adding \\(1\\) to the one's complement of negative zero produces a carry, but with byte length being only 8 bits, the carried-over \\(1\\) to the 9th bit is discarded. Therefore, the two's complement of negative zero is \\(0000 \\; 0000\\), the same as positive zero, thus resolving the ambiguity.

    One last puzzle is the \\([-128, 127]\\) range for byte, with an additional negative number, \\(-128\\). We observe that for the interval \\([-127, +127]\\), all integers have corresponding sign-magnitude, one's complement, and two's complement, allowing for mutual conversion between them.

    However, the two's complement \\(1000 \\; 0000\\) is an exception without a corresponding sign-magnitude. According to the conversion method, its sign-magnitude would be \\(0000 \\; 0000\\), indicating zero. This presents a contradiction because its two's complement should represent itself. Computers designate this special two's complement \\(1000 \\; 0000\\) as representing \\(-128\\). In fact, the calculation of \\((-1) + (-127)\\) in two's complement results in \\(-128\\).

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(Sign-magnitude)} + 1000 \\; 0001 \\; \\text{(Sign-magnitude)} \\newline & = 1000 \\; 0000 \\; \\text{(One's complement)} + 1111 \\; 1110 \\; \\text{(One's complement)} \\newline & = 1000 \\; 0001 \\; \\text{(Two's complement)} + 1111 \\; 1111 \\; \\text{(Two's complement)} \\newline & = 1000 \\; 0000 \\; \\text{(Two's complement)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    As you might have noticed, all these calculations are additions, hinting at an important fact: computers' internal hardware circuits are primarily designed around addition operations. This is because addition is simpler to implement in hardware compared to other operations like multiplication, division, and subtraction, allowing for easier parallelization and faster computation.

    It's important to note that this doesn't mean computers can only perform addition. By combining addition with basic logical operations, computers can execute a variety of other mathematical operations. For example, the subtraction \\(a - b\\) can be translated into \\(a + (-b)\\); multiplication and division can be translated into multiple additions or subtractions.

    We can now summarize the reason for using two's complement in computers: with two's complement representation, computers can use the same circuits and operations to handle both positive and negative number addition, eliminating the need for special hardware circuits for subtraction and avoiding the ambiguity of positive and negative zero. This greatly simplifies hardware design and enhances computational efficiency.

    The design of two's complement is quite ingenious, and due to space constraints, we'll stop here. Interested readers are encouraged to explore further.

    "},{"location":"chapter_data_structure/number_encoding/#332-floating-point-number-encoding","title":"3.3.2 \u00a0 Floating-point number encoding","text":"

    You might have noticed something intriguing: despite having the same length of 4 bytes, why does a float have a much larger range of values compared to an int? This seems counterintuitive, as one would expect the range to shrink for float since it needs to represent fractions.

    In fact, this is due to the different representation method used by floating-point numbers (float). Let's consider a 32-bit binary number as:

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

    According to the IEEE 754 standard, a 32-bit float consists of the following three parts:

    • Sign bit \\(\\mathrm{S}\\): Occupies 1 bit, corresponding to \\(b_{31}\\).
    • Exponent bit \\(\\mathrm{E}\\): Occupies 8 bits, corresponding to \\(b_{30} b_{29} \\ldots b_{23}\\).
    • Fraction bit \\(\\mathrm{N}\\): Occupies 23 bits, corresponding to \\(b_{22} b_{21} \\ldots b_0\\).

    The value of a binary float number is calculated as:

    \\[ \\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 \\]

    Converted to a decimal formula, this becomes:

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

    The range of each component is:

    \\[ \\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} \\times 2^{-i}) \\subset [1, 2 - 2^{-23}] \\end{aligned} \\]

    Figure 3-5 \u00a0 Example calculation of a float in IEEE 754 standard

    Observing the diagram, given an example data \\(\\mathrm{S} = 0\\), \\(\\mathrm{E} = 124\\), \\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\), we have:

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

    Now we can answer the initial question: The representation of float includes an exponent bit, leading to a much larger range than int. Based on the above calculation, the maximum positive number representable by float is approximately \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\), and the minimum negative number is obtained by switching the sign bit.

    However, the trade-off for float's expanded range is a sacrifice in precision. The integer type int uses all 32 bits to represent the number, with values evenly distributed; but due to the exponent bit, the larger the value of a float, the greater the difference between adjacent numbers.

    As shown in the Table 3-2 , exponent bits \\(\\mathrm{E} = 0\\) and \\(\\mathrm{E} = 255\\) have special meanings, used to represent zero, infinity, \\(\\mathrm{NaN}\\), etc.

    Table 3-2 \u00a0 Meaning of exponent bits

    Exponent Bit E Fraction Bit \\(\\mathrm{N} = 0\\) Fraction Bit \\(\\mathrm{N} \\ne 0\\) Calculation Formula \\(0\\) \\(\\pm 0\\) Subnormal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{-126} \\times (0.\\mathrm{N})\\) \\(1, 2, \\dots, 254\\) Normal Numbers Normal Numbers \\((-1)^{\\mathrm{S}} \\times 2^{(\\mathrm{E} -127)} \\times (1.\\mathrm{N})\\) \\(255\\) \\(\\pm \\infty\\) \\(\\mathrm{NaN}\\)

    It's worth noting that subnormal numbers significantly improve the precision of floating-point numbers. The smallest positive normal number is \\(2^{-126}\\), and the smallest positive subnormal number is \\(2^{-126} \\times 2^{-23}\\).

    Double-precision double also uses a similar representation method to float, which is not elaborated here for brevity.

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 Summary","text":""},{"location":"chapter_data_structure/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Data structures can be categorized from two perspectives: logical structure and physical structure. Logical structure describes the logical relationships between data elements, while physical structure describes how data is stored in computer memory.
    • Common logical structures include linear, tree-like, and network structures. We generally classify data structures into linear (arrays, linked lists, stacks, queues) and non-linear (trees, graphs, heaps) based on their logical structure. The implementation of hash tables may involve both linear and non-linear data structures.
    • When a program runs, data is stored in computer memory. Each memory space has a corresponding memory address, and the program accesses data through these addresses.
    • Physical structures are primarily divided into contiguous space storage (arrays) and dispersed space storage (linked lists). All data structures are implemented using arrays, linked lists, or a combination of both.
    • Basic data types in computers include integers (byte, short, int, long), floating-point numbers (float, double), characters (char), and booleans (boolean). Their range depends on the size of the space occupied and the representation method.
    • Original code, complement code, and two's complement code are three methods of encoding numbers in computers, and they can be converted into each other. The highest bit of the original code of an integer is the sign bit, and the remaining bits represent the value of the number.
    • Integers are stored in computers in the form of two's complement. In this representation, the computer can treat the addition of positive and negative numbers uniformly, without the need for special hardware circuits for subtraction, and there is no ambiguity of positive and negative zero.
    • The encoding of floating-point numbers consists of 1 sign bit, 8 exponent bits, and 23 fraction bits. Due to the presence of the exponent bit, the range of floating-point numbers is much greater than that of integers, but at the cost of sacrificing precision.
    • ASCII is the earliest English character set, 1 byte in length, and includes 127 characters. The GBK character set is a commonly used Chinese character set, including more than 20,000 Chinese characters. Unicode strives to provide a complete character set standard, including characters from various languages worldwide, thus solving the problem of garbled characters caused by inconsistent character encoding methods.
    • UTF-8 is the most popular Unicode encoding method, with excellent universality. It is a variable-length encoding method with good scalability and effectively improves the efficiency of space usage. UTF-16 and UTF-32 are fixed-length encoding methods. When encoding Chinese characters, UTF-16 occupies less space than UTF-8. Programming languages like Java and C# use UTF-16 encoding by default.
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Why does a hash table contain both linear and non-linear data structures?

    The underlying structure of a hash table is an array. To resolve hash collisions, we may use \"chaining\": each bucket in the array points to a linked list, which, when exceeding a certain threshold, might be transformed into a tree (usually a red-black tree). From a storage perspective, the foundation of a hash table is an array, where each bucket slot might contain a value, a linked list, or a tree. Therefore, hash tables may contain both linear data structures (arrays, linked lists) and non-linear data structures (trees).

    Q: Is the length of the char type 1 byte?

    The length of the char type is determined by the encoding method used by the programming language. For example, Java, JavaScript, TypeScript, and C# all use UTF-16 encoding (to save Unicode code points), so the length of the char type is 2 bytes.

    Q: Is there ambiguity in calling data structures based on arrays \"static data structures\"? Because operations like push and pop on stacks are \"dynamic\".

    While stacks indeed allow for dynamic data operations, the data structure itself remains \"static\" (with unchangeable length). Even though data structures based on arrays can dynamically add or remove elements, their capacity is fixed. If the data volume exceeds the pre-allocated size, a new, larger array needs to be created, and the contents of the old array copied into it.

    Q: When building stacks (queues) without specifying their size, why are they considered \"static data structures\"?

    In high-level programming languages, we don't need to manually specify the initial capacity of stacks (queues); this task is automatically handled internally by the class. For example, the initial capacity of Java's ArrayList is usually 10. Furthermore, the expansion operation is also implemented automatically. See the subsequent \"List\" chapter for details.

    "},{"location":"chapter_graph/","title":"Chapter 9. \u00a0 Graph","text":"

    Abstract

    In the journey of life, we are like individual nodes, connected by countless invisible edges.

    Each encounter and parting leaves a distinctive imprint on this vast network graph.

    "},{"location":"chapter_graph/#chapter-contents","title":"Chapter contents","text":"
    • 9.1 \u00a0 Graph
    • 9.2 \u00a0 Basic graph operations
    • 9.3 \u00a0 Graph traversal
    • 9.4 \u00a0 Summary
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 Graph","text":"

    A \"graph\" is a type of nonlinear data structure, consisting of \"vertices\" and \"edges\". A graph \\(G\\) can be abstractly represented as a collection of a set of vertices \\(V\\) and a set of edges \\(E\\). The following example shows a graph containing 5 vertices and 7 edges.

    \\[ \\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} \\]

    If vertices are viewed as nodes and edges as references (pointers) connecting the nodes, graphs can be seen as a data structure that extends from linked lists. As shown below, compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) are more complex due to their higher degree of freedom.

    Figure 9-1 \u00a0 Relationship between linked lists, trees, and graphs

    "},{"location":"chapter_graph/graph/#911-common-types-of-graphs","title":"9.1.1 \u00a0 Common types of graphs","text":"

    Based on whether edges have direction, graphs can be divided into \"undirected graphs\" and \"directed graphs\", as shown below.

    • In undirected graphs, edges represent a \"bidirectional\" connection between two vertices, for example, the \"friendship\" in WeChat or QQ.
    • In directed graphs, edges have directionality, that is, the edges \\(A \\rightarrow B\\) and \\(A \\leftarrow B\\) are independent of each other, for example, the \"follow\" and \"be followed\" relationship on Weibo or TikTok.

    Figure 9-2 \u00a0 Directed and undirected graphs

    Based on whether all vertices are connected, graphs can be divided into \"connected graphs\" and \"disconnected graphs\", as shown below.

    • For connected graphs, it is possible to reach any other vertex starting from a certain vertex.
    • For disconnected graphs, there is at least one vertex that cannot be reached from a certain starting vertex.

    Figure 9-3 \u00a0 Connected and disconnected graphs

    We can also add a \"weight\" variable to edges, resulting in \"weighted graphs\" as shown below. For example, in mobile games like \"Honor of Kings\", the system calculates the \"closeness\" between players based on shared gaming time, and this closeness network can be represented with a weighted graph.

    Figure 9-4 \u00a0 Weighted and unweighted graphs

    Graph data structures include the following commonly used terms.

    • \"Adjacency\": When there is an edge connecting two vertices, these two vertices are said to be \"adjacent\". In the above figure, the adjacent vertices of vertex 1 are vertices 2, 3, and 5.
    • \"Path\": The sequence of edges passed from vertex A to vertex B is called a \"path\" from A to B. In the above figure, the edge sequence 1-5-2-4 is a path from vertex 1 to vertex 4.
    • \"Degree\": The number of edges a vertex has. For directed graphs, \"in-degree\" refers to how many edges point to the vertex, and \"out-degree\" refers to how many edges point out from the vertex.
    "},{"location":"chapter_graph/graph/#912-representation-of-graphs","title":"9.1.2 \u00a0 Representation of graphs","text":"

    Common representations of graphs include \"adjacency matrices\" and \"adjacency lists\". The following examples use undirected graphs.

    "},{"location":"chapter_graph/graph/#1-adjacency-matrix","title":"1. \u00a0 Adjacency matrix","text":"

    Let the number of vertices in the graph be \\(n\\), the \"adjacency matrix\" uses an \\(n \\times n\\) matrix to represent the graph, where each row (column) represents a vertex, and the matrix elements represent edges, with \\(1\\) or \\(0\\) indicating whether there is an edge between two vertices.

    As shown below, let the adjacency matrix be \\(M\\), and the list of vertices be \\(V\\), then the matrix element \\(M[i, j] = 1\\) indicates there is an edge between vertex \\(V[i]\\) and vertex \\(V[j]\\), conversely \\(M[i, j] = 0\\) indicates there is no edge between the two vertices.

    Figure 9-5 \u00a0 Representation of a graph with an adjacency matrix

    Adjacency matrices have the following characteristics.

    • A vertex cannot be connected to itself, so the elements on the main diagonal of the adjacency matrix are meaningless.
    • For undirected graphs, edges in both directions are equivalent, thus the adjacency matrix is symmetric about the main diagonal.
    • By replacing the elements of the adjacency matrix from \\(1\\) and \\(0\\) to weights, it can represent weighted graphs.

    When representing graphs with adjacency matrices, it is possible to directly access matrix elements to obtain edges, thus operations of addition, deletion, lookup, and modification are very efficient, all with a time complexity of \\(O(1)\\). However, the space complexity of the matrix is \\(O(n^2)\\), which consumes more memory.

    "},{"location":"chapter_graph/graph/#2-adjacency-list","title":"2. \u00a0 Adjacency list","text":"

    The \"adjacency list\" uses \\(n\\) linked lists to represent the graph, with each linked list node representing a vertex. The \\(i\\)-th linked list corresponds to vertex \\(i\\) and contains all adjacent vertices (vertices connected to that vertex). The Figure 9-6 shows an example of a graph stored using an adjacency list.

    Figure 9-6 \u00a0 Representation of a graph with an adjacency list

    The adjacency list only stores actual edges, and the total number of edges is often much less than \\(n^2\\), making it more space-efficient. However, finding edges in the adjacency list requires traversing the linked list, so its time efficiency is not as good as that of the adjacency matrix.

    Observing the above figure, the structure of the adjacency list is very similar to the \"chaining\" in hash tables, hence we can use similar methods to optimize efficiency. For example, when the linked list is long, it can be transformed into an AVL tree or red-black tree, thus optimizing the time efficiency from \\(O(n)\\) to \\(O(\\log n)\\); the linked list can also be transformed into a hash table, thus reducing the time complexity to \\(O(1)\\).

    "},{"location":"chapter_graph/graph/#913-common-applications-of-graphs","title":"9.1.3 \u00a0 Common applications of graphs","text":"

    As shown in the Table 9-1 , many real-world systems can be modeled with graphs, and corresponding problems can be reduced to graph computing problems.

    Table 9-1 \u00a0 Common graphs in real life

    Vertices Edges Graph Computing Problem Social Networks Users Friendships Potential Friend Recommendations Subway Lines Stations Connectivity Between Stations Shortest Route Recommendations Solar System Celestial Bodies Gravitational Forces Between Celestial Bodies Planetary Orbit Calculations"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 Basic operations on graphs","text":"

    The basic operations on graphs can be divided into operations on \"edges\" and operations on \"vertices\". Under the two representation methods of \"adjacency matrix\" and \"adjacency list\", the implementation methods are different.

    "},{"location":"chapter_graph/graph_operations/#921-implementation-based-on-adjacency-matrix","title":"9.2.1 \u00a0 Implementation based on adjacency matrix","text":"

    Given an undirected graph with \\(n\\) vertices, the various operations are implemented as shown in the Figure 9-7 .

    • Adding or removing an edge: Directly modify the specified edge in the adjacency matrix, using \\(O(1)\\) time. Since it is an undirected graph, it is necessary to update the edges in both directions simultaneously.
    • Adding a vertex: Add a row and a column at the end of the adjacency matrix and fill them all with \\(0\\)s, using \\(O(n)\\) time.
    • Removing a vertex: Delete a row and a column in the adjacency matrix. The worst case is when the first row and column are removed, requiring \\((n-1)^2\\) elements to be \"moved up and to the left\", thus using \\(O(n^2)\\) time.
    • Initialization: Pass in \\(n\\) vertices, initialize a vertex list vertices of length \\(n\\), using \\(O(n)\\) time; initialize an \\(n \\times n\\) size adjacency matrix adjMat, using \\(O(n^2)\\) time.
    Initialize adjacency matrixAdd an edgeRemove an edgeAdd a vertexRemove a vertex

    Figure 9-7 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency matrix

    Below is the implementation code for graphs represented using an adjacency matrix:

    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
    [class]{GraphAdjMat}-[func]{}\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_graph/graph_operations/#922-implementation-based-on-adjacency-list","title":"9.2.2 \u00a0 Implementation based on adjacency list","text":"

    Given an undirected graph with a total of \\(n\\) vertices and \\(m\\) edges, the various operations can be implemented as shown in the Figure 9-8 .

    • Adding an edge: Simply add the edge at the end of the corresponding vertex's linked list, using \\(O(1)\\) time. Because it is an undirected graph, it is necessary to add edges in both directions simultaneously.
    • Removing an edge: Find and remove the specified edge in the corresponding vertex's linked list, using \\(O(m)\\) time. In an undirected graph, it is necessary to remove edges in both directions simultaneously.
    • Adding a vertex: Add a linked list in the adjacency list and make the new vertex the head node of the list, using \\(O(1)\\) time.
    • Removing a vertex: It is necessary to traverse the entire adjacency list, removing all edges that include the specified vertex, using \\(O(n + m)\\) time.
    • Initialization: Create \\(n\\) vertices and \\(2m\\) edges in the adjacency list, using \\(O(n + m)\\) time.
    Initialize adjacency listAdd an edgeRemove an edgeAdd a vertexRemove a vertex

    Figure 9-8 \u00a0 Initialization, adding and removing edges, adding and removing vertices in adjacency list

    Below is the adjacency list code implementation. Compared to the above diagram, the actual code has the following differences.

    • For convenience in adding and removing vertices, and to simplify the code, we use lists (dynamic arrays) instead of linked lists.
    • Use a hash table to store the adjacency list, key being the vertex instance, value being the list (linked list) of adjacent vertices of that vertex.

    Additionally, we use the Vertex class to represent vertices in the adjacency list. The reason for this is: if, like with the adjacency matrix, list indexes were used to distinguish different vertices, then suppose you want to delete the vertex at index \\(i\\), you would need to traverse the entire adjacency list and decrement all indexes greater than \\(i\\) by \\(1\\), which is very inefficient. However, if each vertex is a unique Vertex instance, then deleting a vertex does not require any changes to other vertices.

    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
    [class]{GraphAdjList}-[func]{}\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_graph/graph_operations/#923-efficiency-comparison","title":"9.2.3 \u00a0 Efficiency comparison","text":"

    Assuming there are \\(n\\) vertices and \\(m\\) edges in the graph, the Table 9-2 compares the time efficiency and space efficiency of the adjacency matrix and adjacency list.

    Table 9-2 \u00a0 Comparison of adjacency matrix and adjacency list

    Adjacency matrix Adjacency list (Linked list) Adjacency list (Hash table) Determine adjacency \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add an edge \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Remove an edge \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) Add a vertex \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) Remove a vertex \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) Memory space usage \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    Observing the Table 9-2 , it seems that the adjacency list (hash table) has the best time efficiency and space efficiency. However, in practice, operating on edges in the adjacency matrix is more efficient, requiring only a single array access or assignment operation. Overall, the adjacency matrix exemplifies the principle of \"space for time\", while the adjacency list exemplifies \"time for space\".

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 Graph traversal","text":"

    Trees represent a \"one-to-many\" relationship, while graphs have a higher degree of freedom and can represent any \"many-to-many\" relationship. Therefore, we can consider trees as a special case of graphs. Clearly, tree traversal operations are also a special case of graph traversal operations.

    Both graphs and trees require the application of search algorithms to implement traversal operations. Graph traversal can be divided into two types: \"Breadth-First Search (BFS)\" and \"Depth-First Search (DFS)\".

    "},{"location":"chapter_graph/graph_traversal/#931-breadth-first-search","title":"9.3.1 \u00a0 Breadth-first search","text":"

    Breadth-first search is a near-to-far traversal method, starting from a certain node, always prioritizing the visit to the nearest vertices and expanding outwards layer by layer. As shown in the Figure 9-9 , starting from the top left vertex, first traverse all adjacent vertices of that vertex, then traverse all adjacent vertices of the next vertex, and so on, until all vertices have been visited.

    Figure 9-9 \u00a0 Breadth-first traversal of a graph

    "},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation","title":"1. \u00a0 Algorithm implementation","text":"

    BFS is usually implemented with the help of a queue, as shown in the code below. The queue has a \"first in, first out\" property, which aligns with the BFS idea of traversing \"from near to far\".

    1. Add the starting vertex startVet to the queue and start the loop.
    2. In each iteration of the loop, pop the vertex at the front of the queue and record it as visited, then add all adjacent vertices of that vertex to the back of the queue.
    3. Repeat step 2. until all vertices have been visited.

    To prevent revisiting vertices, we use a hash table visited to record which nodes have been visited.

    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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{graph_bfs}\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    Code Visualization

    Full Screen >

    The code is relatively abstract, it is suggested to compare with the following figure to deepen the understanding.

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

    Figure 9-10 \u00a0 Steps of breadth-first search of a graph

    Is the sequence of breadth-first traversal unique?

    Not unique. Breadth-first traversal only requires traversing in a \"from near to far\" order, and the traversal order of multiple vertices at the same distance can be arbitrarily shuffled. For example, in the above figure, the visitation order of vertices \\(1\\) and \\(3\\) can be switched, as can the order of vertices \\(2\\), \\(4\\), and \\(6\\).

    "},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"

    Time complexity: All vertices will be enqueued and dequeued once, using \\(O(|V|)\\) time; in the process of traversing adjacent vertices, since it is an undirected graph, all edges will be visited \\(2\\) times, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

    Space complexity: The maximum number of vertices in list res, hash table visited, and queue que is \\(|V|\\), using \\(O(|V|)\\) space.

    "},{"location":"chapter_graph/graph_traversal/#932-depth-first-search","title":"9.3.2 \u00a0 Depth-first search","text":"

    Depth-first search is a traversal method that prioritizes going as far as possible and then backtracks when no further paths are available. As shown in the Figure 9-11 , starting from the top left vertex, visit some adjacent vertex of the current vertex until no further path is available, then return and continue until all vertices are traversed.

    Figure 9-11 \u00a0 Depth-first traversal of a graph

    "},{"location":"chapter_graph/graph_traversal/#1-algorithm-implementation_1","title":"1. \u00a0 Algorithm implementation","text":"

    This \"go as far as possible and then return\" algorithm paradigm is usually implemented based on recursion. Similar to breadth-first search, in depth-first search, we also need the help of a hash table visited to record the visited vertices to avoid revisiting.

    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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    Code Visualization

    Full Screen >

    The algorithm process of depth-first search is shown in the following figure.

    • Dashed lines represent downward recursion, indicating that a new recursive method has been initiated to visit a new vertex.
    • Curved dashed lines represent upward backtracking, indicating that this recursive method has returned to the position where this method was initiated.

    To deepen the understanding, it is suggested to combine the following figure with the code to simulate (or draw) the entire DFS process in your mind, including when each recursive method is initiated and when it returns.

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

    Figure 9-12 \u00a0 Steps of depth-first search of a graph

    Is the sequence of depth-first traversal unique?

    Similar to breadth-first traversal, the order of the depth-first traversal sequence is also not unique. Given a certain vertex, exploring in any direction first is possible, that is, the order of adjacent vertices can be arbitrarily shuffled, all being part of depth-first traversal.

    Taking tree traversal as an example, \"root \\(\\rightarrow\\) left \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\", \"left \\(\\rightarrow\\) right \\(\\rightarrow\\) root\" correspond to preorder, inorder, and postorder traversals, respectively. They showcase three types of traversal priorities, yet all three are considered depth-first traversal.

    "},{"location":"chapter_graph/graph_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"

    Time complexity: All vertices will be visited once, using \\(O(|V|)\\) time; all edges will be visited twice, using \\(O(2|E|)\\) time; overall using \\(O(|V| + |E|)\\) time.

    Space complexity: The maximum number of vertices in list res, hash table visited is \\(|V|\\), and the maximum recursion depth is \\(|V|\\), therefore using \\(O(|V|)\\) space.

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 Summary","text":""},{"location":"chapter_graph/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A graph consists of vertices and edges and can be represented as a set comprising a group of vertices and a group of edges.
    • Compared to linear relationships (linked lists) and divide-and-conquer relationships (trees), network relationships (graphs) have a higher degree of freedom and are therefore more complex.
    • The edges of a directed graph have directionality, any vertex in a connected graph is reachable, and each edge in a weighted graph contains a weight variable.
    • Adjacency matrices use matrices to represent graphs, with each row (column) representing a vertex and matrix elements representing edges, using \\(1\\) or \\(0\\) to indicate the presence or absence of an edge between two vertices. Adjacency matrices are highly efficient for add, delete, find, and modify operations, but they consume more space.
    • Adjacency lists use multiple linked lists to represent graphs, with the \\(i^{th}\\) list corresponding to vertex \\(i\\), containing all its adjacent vertices. Adjacency lists save more space compared to adjacency matrices, but since it is necessary to traverse the list to find edges, their time efficiency is lower.
    • When the linked lists in the adjacency list are too long, they can be converted into red-black trees or hash tables to improve query efficiency.
    • From the perspective of algorithmic thinking, adjacency matrices embody the principle of \"space for time,\" while adjacency lists embody \"time for space.\"
    • Graphs can be used to model various real systems, such as social networks, subway routes, etc.
    • A tree is a special case of a graph, and tree traversal is also a special case of graph traversal.
    • Breadth-first traversal of a graph is a search method that expands layer by layer from near to far, usually implemented with a queue.
    • Depth-first traversal of a graph is a search method that prefers to go as deep as possible and backtracks when no further paths are available, often based on recursion.
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is a path defined as a sequence of vertices or a sequence of edges?

    Definitions vary between different language versions on Wikipedia: the English version defines a path as \"a sequence of edges,\" while the Chinese version defines it as \"a sequence of vertices.\" Here is the original text from the English version: In graph theory, a path in a graph is a finite or infinite sequence of edges which joins a sequence of vertices.

    In this document, a path is considered a sequence of edges, rather than a sequence of vertices. This is because there might be multiple edges connecting two vertices, in which case each edge corresponds to a path.

    Q: In a disconnected graph, are there points that cannot be traversed to?

    In a disconnected graph, starting from a certain vertex, there is at least one vertex that cannot be reached. Traversing a disconnected graph requires setting multiple starting points to traverse all connected components of the graph.

    Q: In an adjacency list, does the order of \"all vertices connected to that vertex\" matter?

    It can be in any order. However, in practical applications, it might be necessary to sort according to certain rules, such as the order in which vertices are added, or the order of vertex values, etc., to facilitate the quick search for vertices with certain extremal values.

    "},{"location":"chapter_hashing/","title":"Chapter 6. \u00a0 Hash table","text":"

    Abstract

    In the world of computing, a hash table is akin to an intelligent librarian.

    It understands how to compute index numbers, enabling swift retrieval of the desired book.

    "},{"location":"chapter_hashing/#chapter-contents","title":"Chapter contents","text":"
    • 6.1 \u00a0 Hash table
    • 6.2 \u00a0 Hash collision
    • 6.3 \u00a0 Hash algorithm
    • 6.4 \u00a0 Summary
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 Hash algorithms","text":"

    The previous two sections introduced the working principle of hash tables and the methods to handle hash collisions. However, both open addressing and chaining can only ensure that the hash table functions normally when collisions occur, but cannot reduce the frequency of hash collisions.

    If hash collisions occur too frequently, the performance of the hash table will deteriorate drastically. As shown in the Figure 6-8 , for a chaining hash table, in the ideal case, the key-value pairs are evenly distributed across the buckets, achieving optimal query efficiency; in the worst case, all key-value pairs are stored in the same bucket, degrading the time complexity to \\(O(n)\\).

    Figure 6-8 \u00a0 Ideal and worst cases of hash collisions

    The distribution of key-value pairs is determined by the hash function. Recalling the steps of calculating a hash function, first compute the hash value, then modulo it by the array length:

    index = hash(key) % capacity\n

    Observing the above formula, when the hash table capacity capacity is fixed, the hash algorithm hash() determines the output value, thereby determining the distribution of key-value pairs in the hash table.

    This means that, to reduce the probability of hash collisions, we should focus on the design of the hash algorithm hash().

    "},{"location":"chapter_hashing/hash_algorithm/#631-goals-of-hash-algorithms","title":"6.3.1 \u00a0 Goals of hash algorithms","text":"

    To achieve a \"fast and stable\" hash table data structure, hash algorithms should have the following characteristics:

    • Determinism: For the same input, the hash algorithm should always produce the same output. Only then can the hash table be reliable.
    • High efficiency: The process of computing the hash value should be fast enough. The smaller the computational overhead, the more practical the hash table.
    • Uniform distribution: The hash algorithm should ensure that key-value pairs are evenly distributed in the hash table. The more uniform the distribution, the lower the probability of hash collisions.

    In fact, hash algorithms are not only used to implement hash tables but are also widely applied in other fields.

    • Password storage: To protect the security of user passwords, systems usually do not store the plaintext passwords but rather the hash values of the passwords. When a user enters a password, the system calculates the hash value of the input and compares it with the stored hash value. If they match, the password is considered correct.
    • Data integrity check: The data sender can calculate the hash value of the data and send it along; the receiver can recalculate the hash value of the received data and compare it with the received hash value. If they match, the data is considered intact.

    For cryptographic applications, to prevent reverse engineering such as deducing the original password from the hash value, hash algorithms need higher-level security features.

    • Unidirectionality: It should be impossible to deduce any information about the input data from the hash value.
    • Collision resistance: It should be extremely difficult to find two different inputs that produce the same hash value.
    • Avalanche effect: Minor changes in the input should lead to significant and unpredictable changes in the output.

    Note that \"Uniform Distribution\" and \"Collision Resistance\" are two separate concepts. Satisfying uniform distribution does not necessarily mean collision resistance. For example, under random input key, the hash function key % 100 can produce a uniformly distributed output. However, this hash algorithm is too simple, and all key with the same last two digits will have the same output, making it easy to deduce a usable key from the hash value, thereby cracking the password.

    "},{"location":"chapter_hashing/hash_algorithm/#632-design-of-hash-algorithms","title":"6.3.2 \u00a0 Design of hash algorithms","text":"

    The design of hash algorithms is a complex issue that requires consideration of many factors. However, for some less demanding scenarios, we can also design some simple hash algorithms.

    • Additive hash: Add up the ASCII codes of each character in the input and use the total sum as the hash value.
    • Multiplicative hash: Utilize the non-correlation of multiplication, multiplying each round by a constant, accumulating the ASCII codes of each character into the hash value.
    • XOR hash: Accumulate the hash value by XORing each element of the input data.
    • Rotating hash: Accumulate the ASCII code of each character into a hash value, performing a rotation operation on the hash value before each accumulation.
    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
    Code Visualization

    Full Screen >

    It is observed that the last step of each hash algorithm is to take the modulus of the large prime number \\(1000000007\\) to ensure that the hash value is within an appropriate range. It is worth pondering why emphasis is placed on modulo a prime number, or what are the disadvantages of modulo a composite number? This is an interesting question.

    To conclude: Using a large prime number as the modulus can maximize the uniform distribution of hash values. Since a prime number does not share common factors with other numbers, it can reduce the periodic patterns caused by the modulo operation, thus avoiding hash collisions.

    For example, suppose we choose the composite number \\(9\\) as the modulus, which can be divided by \\(3\\), then all key divisible by \\(3\\) will be mapped to hash values \\(0\\), \\(3\\), \\(6\\).

    \\[ \\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} \\]

    If the input key happens to have this kind of arithmetic sequence distribution, then the hash values will cluster, thereby exacerbating hash collisions. Now, suppose we replace modulus with the prime number \\(13\\), since there are no common factors between key and modulus, the uniformity of the output hash values will be significantly improved.

    \\[ \\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} \\]

    It is worth noting that if the key is guaranteed to be randomly and uniformly distributed, then choosing a prime number or a composite number as the modulus can both produce uniformly distributed hash values. However, when the distribution of key has some periodicity, modulo a composite number is more likely to result in clustering.

    In summary, we usually choose a prime number as the modulus, and this prime number should be large enough to eliminate periodic patterns as much as possible, enhancing the robustness of the hash algorithm.

    "},{"location":"chapter_hashing/hash_algorithm/#633-common-hash-algorithms","title":"6.3.3 \u00a0 Common hash algorithms","text":"

    It is not hard to see that the simple hash algorithms mentioned above are quite \"fragile\" and far from reaching the design goals of hash algorithms. For example, since addition and XOR obey the commutative law, additive hash and XOR hash cannot distinguish strings with the same content but in different order, which may exacerbate hash collisions and cause security issues.

    In practice, we usually use some standard hash algorithms, such as MD5, SHA-1, SHA-2, and SHA-3. They can map input data of any length to a fixed-length hash value.

    Over the past century, hash algorithms have been in a continuous process of upgrading and optimization. Some researchers strive to improve the performance of hash algorithms, while others, including hackers, are dedicated to finding security issues in hash algorithms. The Table 6-2 shows hash algorithms commonly used in practical applications.

    • MD5 and SHA-1 have been successfully attacked multiple times and are thus abandoned in various security applications.
    • SHA-2 series, especially SHA-256, is one of the most secure hash algorithms to date, with no successful attacks reported, hence commonly used in various security applications and protocols.
    • SHA-3 has lower implementation costs and higher computational efficiency compared to SHA-2, but its current usage coverage is not as extensive as the SHA-2 series.

    Table 6-2 \u00a0 Common hash algorithms

    MD5 SHA-1 SHA-2 SHA-3 Release Year 1992 1995 2002 2008 Output Length 128 bit 160 bit 256/512 bit 224/256/384/512 bit Hash Collisions Frequent Frequent Rare Rare Security Level Low, has been successfully attacked Low, has been successfully attacked High High Applications Abandoned, still used for data integrity checks Abandoned Cryptocurrency transaction verification, digital signatures, etc. Can be used to replace SHA-2"},{"location":"chapter_hashing/hash_algorithm/#hash-values-in-data-structures","title":"Hash values in data structures","text":"

    We know that the keys in a hash table can be of various data types such as integers, decimals, or strings. Programming languages usually provide built-in hash algorithms for these data types to calculate the bucket indices in the hash table. Taking Python as an example, we can use the hash() function to compute the hash values for various data types.

    • The hash values of integers and booleans are their own values.
    • The calculation of hash values for floating-point numbers and strings is more complex, and interested readers are encouraged to study this on their own.
    • The hash value of a tuple is a combination of the hash values of each of its elements, resulting in a single hash value.
    • The hash value of an object is generated based on its memory address. By overriding the hash method of an object, hash values can be generated based on content.

    Tip

    Be aware that the definition and methods of the built-in hash value calculation functions in different programming languages vary.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# Hash value of integer 3 is 3\n\nbol = True\nhash_bol = hash(bol)\n# Hash value of boolean True is 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# Hash value of decimal 3.14159 is 326484311674566659\n\nstr = \"Hello \u7b97\u6cd5\"\nhash_str = hash(str)\n# Hash value of string \"Hello \u7b97\u6cd5\" is 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# Hash value of tuple (12836, '\u5c0f\u54c8') is 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# Hash value of ListNode object at 0x1058fd810 is 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// Hash value of integer 3 is 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// Hash value of boolean 1 is 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// Hash value of decimal 3.14159 is 4614256650576692846\n\nstring str = \"Hello \u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// Hash value of string \"Hello \u7b97\u6cd5\" is 15466937326284535026\n\n// In C++, built-in std::hash() only provides hash values for basic data types\n// Hash values for arrays and objects need to be implemented separately\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// Hash value of integer 3 is 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// Hash value of decimal 3.14159 is -1340954729\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// Hash value of array [12836, \u5c0f\u54c8] is 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// Hash value of ListNode object utils.ListNode@7dc5e7b4 is 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// Hash value of integer 3 is 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// Hash value of boolean true is 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// Hash value of decimal 3.14159 is -1340954729;\n\nstring str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// Hash value of string \"Hello \u7b97\u6cd5\" is -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// Hash value of array [12836, \u5c0f\u54c8] is 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// Hash value of ListNode object 0 is 39053774;\n
    built_in_hash.go
    // Go does not provide built-in hash code functions\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// Hash value of integer 3 is 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// Hash value of boolean true is -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// Hash value of decimal 3.14159 is -2465384235396674631\n\nlet str = \"Hello \u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// Hash value of string \"Hello \u7b97\u6cd5\" is -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// Hash value of array [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] is -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// Hash value of ListNode object utils.ListNode is -2434780518035996159\n
    built_in_hash.js
    // JavaScript does not provide built-in hash code functions\n
    built_in_hash.ts
    // TypeScript does not provide built-in hash code functions\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// Hash value of integer 3 is 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// Hash value of boolean true is 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// Hash value of decimal 3.14159 is 2570631074981783\n\nString str = \"Hello \u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// Hash value of string \"Hello \u7b97\u6cd5\" is 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// Hash value of array [12836, \u5c0f\u54c8] is 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// Hash value of ListNode object Instance of 'ListNode' is 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// Hash value of integer 3 is 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// Hash value of boolean true is 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// Hash value of decimal 3.14159 is 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// Hash value of string \"Hello \u7b97\u6cd5\" is 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// Hash value of tuple (12836, \"\u5c0f\u54c8\") is 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// Hash value of ListNode object RefCell { value: ListNode { val: 42, next: None } } is 15387811073369036852\n
    built_in_hash.c
    // C does not provide built-in hash code functions\n
    built_in_hash.kt
    \n
    built_in_hash.zig
    \n
    Code Visualization

    Full Screen >

    In many programming languages, only immutable objects can serve as the key in a hash table. If we use a list (dynamic array) as a key, when the contents of the list change, its hash value also changes, and we would no longer be able to find the original value in the hash table.

    Although the member variables of a custom object (such as a linked list node) are mutable, it is hashable. This is because the hash value of an object is usually generated based on its memory address, and even if the contents of the object change, the memory address remains the same, so the hash value remains unchanged.

    You might have noticed that the hash values output in different consoles are different. This is because the Python interpreter adds a random salt to the string hash function each time it starts up. This approach effectively prevents HashDoS attacks and enhances the security of the hash algorithm.

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 Hash collision","text":"

    As mentioned in the previous section, usually the input space of a hash function is much larger than its output space, making hash collisions theoretically inevitable. For example, if the input space consists of all integers and the output space is the size of the array capacity, multiple integers will inevitably map to the same bucket index.

    Hash collisions can lead to incorrect query results, severely affecting the usability of hash tables. To solve this problem, we expand the hash table whenever a hash collision occurs, until the collision is resolved. This method is simple and effective but inefficient due to the extensive data transfer and hash value computation involved in resizing the hash table. To improve efficiency, we can adopt the following strategies:

    1. Improve the data structure of the hash table, allowing it to function normally in the event of a hash collision.
    2. Only perform resizing when necessary, i.e., when hash collisions are severe.

    There are mainly two methods for improving the structure of hash tables: \"Separate Chaining\" and \"Open Addressing\".

    "},{"location":"chapter_hashing/hash_collision/#621-separate-chaining","title":"6.2.1 \u00a0 Separate chaining","text":"

    In the original hash table, each bucket can store only one key-value pair. \"Separate chaining\" transforms individual elements into a linked list, with key-value pairs as list nodes, storing all colliding key-value pairs in the same list. The Figure 6-5 shows an example of a hash table with separate chaining.

    Figure 6-5 \u00a0 Separate chaining hash table

    The operations of a hash table implemented with separate chaining have changed as follows:

    • Querying elements: Input key, pass through the hash function to obtain the bucket index, access the head node of the list, then traverse the list and compare key to find the target key-value pair.
    • Adding elements: First access the list head node via the hash function, then add the node (key-value pair) to the list.
    • Deleting elements: Access the list head based on the hash function's result, then traverse the list to find and remove the target node.

    Separate chaining has the following limitations:

    • Increased space usage: The linked list contains node pointers, which consume more memory space than arrays.
    • Reduced query efficiency: Due to the need for linear traversal of the list to find the corresponding element.

    The code below provides a simple implementation of a separate chaining hash table, with two things to note:

    • Lists (dynamic arrays) are used instead of linked lists for simplicity. In this setup, the hash table (array) contains multiple buckets, each of which is a list.
    • This implementation includes a method for resizing the hash table. When the load factor exceeds \\(\\frac{2}{3}\\), we resize the hash table to twice its original size.
    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
    Code Visualization

    Full Screen >

    It's worth noting that when the list is very long, the query efficiency \\(O(n)\\) is poor. At this point, the list can be converted to an \"AVL tree\" or \"Red-Black tree\" to optimize the time complexity of the query operation to \\(O(\\log n)\\).

    "},{"location":"chapter_hashing/hash_collision/#622-open-addressing","title":"6.2.2 \u00a0 Open addressing","text":"

    \"Open addressing\" does not introduce additional data structures but uses \"multiple probes\" to handle hash collisions. The probing methods mainly include linear probing, quadratic probing, and double hashing.

    Let's use linear probing as an example to introduce the mechanism of open addressing hash tables.

    "},{"location":"chapter_hashing/hash_collision/#1-linear-probing","title":"1. \u00a0 Linear probing","text":"

    Linear probing uses a fixed-step linear search for probing, differing from ordinary hash tables.

    • Inserting elements: Calculate the bucket index using the hash function. If the bucket already contains an element, linearly traverse forward from the conflict position (usually with a step size of \\(1\\)) until an empty bucket is found, then insert the element.
    • Searching for elements: If a hash collision is found, use the same step size to linearly traverse forward until the corresponding element is found and return value; if an empty bucket is encountered, it means the target element is not in the hash table, so return None.

    The Figure 6-6 shows the distribution of key-value pairs in an open addressing (linear probing) hash table. According to this hash function, keys with the same last two digits will be mapped to the same bucket. Through linear probing, they are stored consecutively in that bucket and the buckets below it.

    Figure 6-6 \u00a0 Distribution of key-value pairs in open addressing (linear probing) hash table

    However, linear probing tends to create \"clustering\". Specifically, the longer a continuous position in the array is occupied, the more likely these positions are to encounter hash collisions, further promoting the growth of these clusters and eventually leading to deterioration in the efficiency of operations.

    It's important to note that we cannot directly delete elements in an open addressing hash table. Deleting an element creates an empty bucket None in the array. When searching for elements, if linear probing encounters this empty bucket, it will return, making the elements below this bucket inaccessible. The program may incorrectly assume these elements do not exist, as shown in the Figure 6-7 .

    Figure 6-7 \u00a0 Query issues caused by deletion in open addressing

    To solve this problem, we can use a \"lazy deletion\" mechanism: instead of directly removing elements from the hash table, use a constant TOMBSTONE to mark the bucket. In this mechanism, both None and TOMBSTONE represent empty buckets and can hold key-value pairs. However, when linear probing encounters TOMBSTONE, it should continue traversing since there may still be key-value pairs below it.

    However, lazy deletion may accelerate the degradation of hash table performance. Every deletion operation produces a delete mark, and as TOMBSTONE increases, so does the search time, as linear probing may have to skip multiple TOMBSTONE to find the target element.

    Therefore, consider recording the index of the first TOMBSTONE encountered during linear probing and swapping the target element found with this TOMBSTONE. The advantage of this is that each time a query or addition is performed, the element is moved to a bucket closer to the ideal position (starting point of probing), thereby optimizing the query efficiency.

    The code below implements an open addressing (linear probing) hash table with lazy deletion. To make fuller use of the hash table space, we treat the hash table as a \"circular array,\" continuing to traverse from the beginning when the end of the array is passed.

    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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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-quadratic-probing","title":"2. \u00a0 Quadratic probing","text":"

    Quadratic probing is similar to linear probing and is one of the common strategies of open addressing. When a collision occurs, quadratic probing does not simply skip a fixed number of steps but skips \"the square of the number of probes,\" i.e., \\(1, 4, 9, \\dots\\) steps.

    Quadratic probing has the following advantages:

    • Quadratic probing attempts to alleviate the clustering effect of linear probing by skipping the distance of the square of the number of probes.
    • Quadratic probing skips larger distances to find empty positions, helping to distribute data more evenly.

    However, quadratic probing is not perfect:

    • Clustering still exists, i.e., some positions are more likely to be occupied than others.
    • Due to the growth of squares, quadratic probing may not probe the entire hash table, meaning it might not access empty buckets even if they exist in the hash table.
    "},{"location":"chapter_hashing/hash_collision/#3-double-hashing","title":"3. \u00a0 Double hashing","text":"

    As the name suggests, the double hashing method uses multiple hash functions \\(f_1(x)\\), \\(f_2(x)\\), \\(f_3(x)\\), \\(\\dots\\) for probing.

    • Inserting elements: If hash function \\(f_1(x)\\) encounters a conflict, try \\(f_2(x)\\), and so on, until an empty position is found and the element is inserted.
    • Searching for elements: Search in the same order of hash functions until the target element is found and returned; if an empty position is encountered or all hash functions have been tried, it indicates the element is not in the hash table, then return None.

    Compared to linear probing, double hashing is less prone to clustering but involves additional computation for multiple hash functions.

    Tip

    Please note that open addressing (linear probing, quadratic probing, and double hashing) hash tables all have the issue of \"not being able to directly delete elements.\"

    "},{"location":"chapter_hashing/hash_collision/#623-choice-of-programming-languages","title":"6.2.3 \u00a0 Choice of programming languages","text":"

    Various programming languages have adopted different hash table implementation strategies, here are a few examples:

    • Python uses open addressing. The dict dictionary uses pseudo-random numbers for probing.
    • Java uses separate chaining. Since JDK 1.8, when the array length in HashMap reaches 64 and the length of a linked list reaches 8, the linked list is converted to a red-black tree to improve search performance.
    • Go uses separate chaining. Go stipulates that each bucket can store up to 8 key-value pairs, and if the capacity is exceeded, an overflow bucket is connected; when there are too many overflow buckets, a special equal-size expansion operation is performed to ensure performance.
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 Hash table","text":"

    A \"hash table\", also known as a \"hash map\", achieves efficient element querying by establishing a mapping between keys and values. Specifically, when we input a key into the hash table, we can retrieve the corresponding value in \\(O(1)\\) time.

    As shown in the Figure 6-1 , given \\(n\\) students, each with two pieces of data: \"name\" and \"student number\". If we want to implement a query feature that returns the corresponding name when given a student number, we can use the hash table shown in the Figure 6-1 .

    Figure 6-1 \u00a0 Abstract representation of a hash table

    Apart from hash tables, arrays and linked lists can also be used to implement querying functions. Their efficiency is compared in the Table 6-1 .

    • Adding elements: Simply add the element to the end of the array (or linked list), using \\(O(1)\\) time.
    • Querying elements: Since the array (or linked list) is unordered, it requires traversing all the elements, using \\(O(n)\\) time.
    • Deleting elements: First, locate the element, then delete it from the array (or linked list), using \\(O(n)\\) time.

    Table 6-1 \u00a0 Comparison of element query efficiency

    Array Linked List Hash Table Find Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) Add Element \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) Delete Element \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    Observations reveal that the time complexity for adding, deleting, and querying in a hash table is \\(O(1)\\), which is highly efficient.

    "},{"location":"chapter_hashing/hash_map/#611-common-operations-of-hash-table","title":"6.1.1 \u00a0 Common operations of hash table","text":"

    Common operations of a hash table include initialization, querying, adding key-value pairs, and deleting key-value pairs, etc. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
    # Initialize hash table\nhmap: dict = {}\n\n# Add operation\n# Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n# Query operation\n# Input key into hash table, get value\nname: str = hmap[15937]\n\n# Delete operation\n# Delete key-value pair (key, value) from hash table\nhmap.pop(10583)\n
    hash_map.cpp
    /* Initialize hash table */\nunordered_map<int, string> map;\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.erase(10583);\n
    hash_map.java
    /* Initialize hash table */\nMap<Integer, String> map = new HashMap<>();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.put(12836, \"Xiao Ha\");   \nmap.put(15937, \"Xiao Luo\");   \nmap.put(16750, \"Xiao Suan\");   \nmap.put(13276, \"Xiao Fa\");\nmap.put(10583, \"Xiao Ya\");\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
    hash_map.cs
    /* Initialize hash table */\nDictionary<int, string> map = new() {\n    /* Add operation */\n    // Add key-value pair (key, value) to the hash table\n    { 12836, \"Xiao Ha\" },\n    { 15937, \"Xiao Luo\" },\n    { 16750, \"Xiao Suan\" },\n    { 13276, \"Xiao Fa\" },\n    { 10583, \"Xiao Ya\" }\n};\n\n/* Query operation */\n// Input key into hash table, get value\nstring name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.Remove(10583);\n
    hash_map_test.go
    /* Initialize hash table */\nhmap := make(map[int]string)\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nhmap[12836] = \"Xiao Ha\"\nhmap[15937] = \"Xiao Luo\"\nhmap[16750] = \"Xiao Suan\"\nhmap[13276] = \"Xiao Fa\"\nhmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nname := hmap[15937]\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\ndelete(hmap, 10583)\n
    hash_map.swift
    /* Initialize hash table */\nvar map: [Int: String] = [:]\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\"\nmap[15937] = \"Xiao Luo\"\nmap[16750] = \"Xiao Suan\"\nmap[13276] = \"Xiao Fa\"\nmap[10583] = \"Xiao Ya\"\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map[15937]!\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* Initialize hash table */\nconst map = new Map();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\n
    hash_map.ts
    /* Initialize hash table */\nconst map = new Map<number, string>();\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.set(12836, 'Xiao Ha');\nmap.set(15937, 'Xiao Luo');\nmap.set(16750, 'Xiao Suan');\nmap.set(13276, 'Xiao Fa');\nmap.set(10583, 'Xiao Ya');\nconsole.info('\\nAfter adding, the hash table is\\nKey -> Value');\nconsole.info(map);\n\n/* Query operation */\n// Input key into hash table, get value\nlet name = map.get(15937);\nconsole.info('\\nInput student number 15937, query name ' + name);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.delete(10583);\nconsole.info('\\nAfter deleting 10583, the hash table is\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* Initialize hash table */\nMap<int, String> map = {};\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap[12836] = \"Xiao Ha\";\nmap[15937] = \"Xiao Luo\";\nmap[16750] = \"Xiao Suan\";\nmap[13276] = \"Xiao Fa\";\nmap[10583] = \"Xiao Ya\";\n\n/* Query operation */\n// Input key into hash table, get value\nString name = map[15937];\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* Initialize hash table */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* Add operation */\n// Add key-value pair (key, value) to the hash table\nmap.insert(12836, \"Xiao Ha\".to_string());\nmap.insert(15937, \"Xiao Luo\".to_string());\nmap.insert(16750, \"Xiao Suan\".to_string());\nmap.insert(13279, \"Xiao Fa\".to_string());\nmap.insert(10583, \"Xiao Ya\".to_string());\n\n/* Query operation */\n// Input key into hash table, get value\nlet _name: Option<&String> = map.get(&15937);\n\n/* Delete operation */\n// Delete key-value pair (key, value) from hash table\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C does not provide a built-in hash table\n
    hash_map.kt
    \n
    hash_map.zig
    \n
    Code Visualization

    Full Screen >

    There are three common ways to traverse a hash table: traversing key-value pairs, keys, and values. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig hash_map.py
    # Traverse hash table\n# Traverse key-value pairs key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# Traverse keys only\nfor key in hmap.keys():\n    print(key)\n# Traverse values only\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// Traverse using iterator key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor (Map.Entry<Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// Traverse keys only\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// Traverse values only\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// Traverse keys only\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// Traverse values only\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* Traverse hash table */\n// Traverse key-value pairs key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// Traverse keys only\nfor key := range hmap {\n    fmt.Println(key)\n}\n// Traverse values only\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// Traverse keys only\nfor key in map.keys {\n    print(key)\n}\n// Traverse values only\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* Traverse hash table */\nconsole.info('\\nTraverse key-value pairs Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\nTraverse keys only Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\nTraverse values only Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nmap.forEach((key, value) {\nprint('$key -> $value');\n});\n\n// Traverse keys only Key\nmap.keys.forEach((key) {\nprint(key);\n});\n\n// Traverse values only Value\nmap.values.forEach((value) {\nprint(value);\n});\n
    hash_map.rs
    /* Traverse hash table */\n// Traverse key-value pairs Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// Traverse keys only Key\nfor key in map.keys() {\n    println!(\"{key}\"); \n}\n\n// Traverse values only Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C does not provide a built-in hash table\n
    hash_map.kt
    \n
    hash_map.zig
    // Zig example is not provided\n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_hashing/hash_map/#612-simple-implementation-of-hash-table","title":"6.1.2 \u00a0 Simple implementation of hash table","text":"

    First, let's consider the simplest case: implementing a hash table using just an array. In the hash table, each empty slot in the array is called a \"bucket\", and each bucket can store one key-value pair. Therefore, the query operation involves finding the bucket corresponding to the key and retrieving the value from it.

    So, how do we locate the appropriate bucket based on the key? This is achieved through a \"hash function\". The role of the hash function is to map a larger input space to a smaller output space. In a hash table, the input space is all possible keys, and the output space is all buckets (array indices). In other words, input a key, and we can use the hash function to determine the storage location of the corresponding key-value pair in the array.

    The calculation process of the hash function for a given key is divided into the following two steps:

    1. Calculate the hash value using a certain hash algorithm hash().
    2. Take the modulus of the hash value with the number of buckets (array length) capacity to obtain the array index index.
    index = hash(key) % capacity\n

    Afterward, we can use index to access the corresponding bucket in the hash table and thereby retrieve the value.

    Assuming array length capacity = 100 and hash algorithm hash(key) = key, the hash function is key % 100. The Figure 6-2 uses key as the student number and value as the name to demonstrate the working principle of the hash function.

    Figure 6-2 \u00a0 Working principle of hash function

    The following code implements a simple hash table. Here, we encapsulate key and value into a class Pair to represent the key-value pair.

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_hashing/hash_map/#613-hash-collision-and-resizing","title":"6.1.3 \u00a0 Hash collision and resizing","text":"

    Fundamentally, the role of the hash function is to map the entire input space of all keys to the output space of all array indices. However, the input space is often much larger than the output space. Therefore, theoretically, there must be situations where \"multiple inputs correspond to the same output\".

    For the hash function in the above example, if the last two digits of the input key are the same, the output of the hash function will also be the same. For example, when querying for students with student numbers 12836 and 20336, we find:

    12836 % 100 = 36\n20336 % 100 = 36\n

    As shown in the Figure 6-3 , both student numbers point to the same name, which is obviously incorrect. This situation where multiple inputs correspond to the same output is known as \"hash collision\".

    Figure 6-3 \u00a0 Example of hash collision

    It is easy to understand that the larger the capacity \\(n\\) of the hash table, the lower the probability of multiple keys being allocated to the same bucket, and the fewer the collisions. Therefore, expanding the capacity of the hash table can reduce hash collisions.

    As shown in the Figure 6-4 , before expansion, key-value pairs (136, A) and (236, D) collided; after expansion, the collision is resolved.

    Figure 6-4 \u00a0 Hash table expansion

    Similar to array expansion, resizing a hash table requires migrating all key-value pairs from the original hash table to the new one, which is time-consuming. Furthermore, since the capacity capacity of the hash table changes, we need to recalculate the storage positions of all key-value pairs using the hash function, which adds to the computational overhead of the resizing process. Therefore, programming languages often reserve a sufficiently large capacity for the hash table to prevent frequent resizing.

    The \"load factor\" is an important concept for hash tables. It is defined as the ratio of the number of elements in the hash table to the number of buckets. It is used to measure the severity of hash collisions and is often used as a trigger for resizing the hash table. For example, in Java, when the load factor exceeds \\(0.75\\), the system will resize the hash table to twice its original size.

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 Summary","text":""},{"location":"chapter_hashing/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Given an input key, a hash table can retrieve the corresponding value in \\(O(1)\\) time, which is highly efficient.
    • Common hash table operations include querying, adding key-value pairs, deleting key-value pairs, and traversing the hash table.
    • The hash function maps a key to an array index, allowing access to the corresponding bucket and retrieval of the value.
    • Two different keys may end up with the same array index after hashing, leading to erroneous query results. This phenomenon is known as hash collision.
    • The larger the capacity of the hash table, the lower the probability of hash collisions. Therefore, hash table resizing can mitigate hash collisions. Similar to array resizing, hash table resizing is costly.
    • The load factor, defined as the number of elements divided by the number of buckets, reflects the severity of hash collisions and is often used as a condition to trigger hash table resizing.
    • Chaining addresses hash collisions by converting each element into a linked list, storing all colliding elements in the same list. However, excessively long lists can reduce query efficiency, which can be improved by converting the lists into red-black trees.
    • Open addressing handles hash collisions through multiple probes. Linear probing uses a fixed step size but it cannot delete elements and is prone to clustering. Multiple hashing uses several hash functions for probing which reduces clustering compared to linear probing but increases computational overhead.
    • Different programming languages adopt various hash table implementations. For example, Java's HashMap uses chaining, while Python's dict employs open addressing.
    • In hash tables, we desire hash algorithms with determinism, high efficiency, and uniform distribution. In cryptography, hash algorithms should also possess collision resistance and the avalanche effect.
    • Hash algorithms typically use large prime numbers as moduli to ensure uniform distribution of hash values and reduce hash collisions.
    • Common hash algorithms include MD5, SHA-1, SHA-2, and SHA-3. MD5 is often used for file integrity checks, while SHA-2 is commonly used in secure applications and protocols.
    • Programming languages usually provide built-in hash algorithms for data types to calculate bucket indices in hash tables. Generally, only immutable objects are hashable.
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: When does the time complexity of a hash table degrade to \\(O(n)\\)?

    The time complexity of a hash table can degrade to \\(O(n)\\) when hash collisions are severe. When the hash function is well-designed, the capacity is set appropriately, and collisions are evenly distributed, the time complexity is \\(O(1)\\). We usually consider the time complexity to be \\(O(1)\\) when using built-in hash tables in programming languages.

    Q: Why not use the hash function \\(f(x) = x\\)? This would eliminate collisions.

    Under the hash function \\(f(x) = x\\), each element corresponds to a unique bucket index, which is equivalent to an array. However, the input space is usually much larger than the output space (array length), so the last step of a hash function is often to take the modulo of the array length. In other words, the goal of a hash table is to map a larger state space to a smaller one while providing \\(O(1)\\) query efficiency.

    Q: Why can hash tables be more efficient than arrays, linked lists, or binary trees, even though hash tables are implemented using these structures?

    Firstly, hash tables have higher time efficiency but lower space efficiency. A significant portion of memory in hash tables remains unused.

    Secondly, hash tables are only more time-efficient in specific use cases. If a feature can be implemented with the same time complexity using an array or a linked list, it's usually faster than using a hash table. This is because the computation of the hash function incurs overhead, making the constant factor in the time complexity larger.

    Lastly, the time complexity of hash tables can degrade. For example, in chaining, we perform search operations in a linked list or red-black tree, which still risks degrading to \\(O(n)\\) time.

    Q: Does multiple hashing also have the flaw of not being able to delete elements directly? Can space marked as deleted be reused?

    Multiple hashing is a form of open addressing, and all open addressing methods have the drawback of not being able to delete elements directly; they require marking elements as deleted. Marked spaces can be reused. When inserting new elements into the hash table, and the hash function points to a position marked as deleted, that position can be used by the new element. This maintains the probing sequence of the hash table while ensuring efficient use of space.

    Q: Why do hash collisions occur during the search process in linear probing?

    During the search process, the hash function points to the corresponding bucket and key-value pair. If the key doesn't match, it indicates a hash collision. Therefore, linear probing will search downwards at a predetermined step size until the correct key-value pair is found or the search fails.

    Q: Why can resizing a hash table alleviate hash collisions?

    The last step of a hash function often involves taking the modulo of the array length \\(n\\), to keep the output within the array index range. When resizing, the array length \\(n\\) changes, and the indices corresponding to the keys may also change. Keys that were previously mapped to the same bucket might be distributed across multiple buckets after resizing, thereby mitigating hash collisions.

    "},{"location":"chapter_heap/","title":"Chapter 8. \u00a0 Heap","text":"

    Abstract

    The heap is like mountain peaks, stacked and undulating, each with its unique shape.

    Among these peaks, the highest one always catches the eye first.

    "},{"location":"chapter_heap/#chapter-contents","title":"Chapter contents","text":"
    • 8.1 \u00a0 Heap
    • 8.2 \u00a0 Building a heap
    • 8.3 \u00a0 Top-k problem
    • 8.4 \u00a0 Summary
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 Heap construction operation","text":"

    In some cases, we want to build a heap using all elements of a list, and this process is known as \"heap construction operation.\"

    "},{"location":"chapter_heap/build_heap/#821-implementing-with-heap-insertion-operation","title":"8.2.1 \u00a0 Implementing with heap insertion operation","text":"

    First, we create an empty heap and then iterate through the list, performing the \"heap insertion operation\" on each element in turn. This means adding the element to the end of the heap and then \"heapifying\" it from bottom to top.

    Each time an element is added to the heap, the length of the heap increases by one. Since nodes are added to the binary tree from top to bottom, the heap is constructed \"from top to bottom.\"

    Let the number of elements be \\(n\\), and each element's insertion operation takes \\(O(\\log{n})\\) time, thus the time complexity of this heap construction method is \\(O(n \\log n)\\).

    "},{"location":"chapter_heap/build_heap/#822-implementing-by-heapifying-through-traversal","title":"8.2.2 \u00a0 Implementing by heapifying through traversal","text":"

    In fact, we can implement a more efficient method of heap construction in two steps.

    1. Add all elements of the list as they are into the heap, at this point the properties of the heap are not yet satisfied.
    2. Traverse the heap in reverse order (reverse of level-order traversal), and perform \"top to bottom heapify\" on each non-leaf node.

    After heapifying a node, the subtree with that node as the root becomes a valid sub-heap. Since the traversal is in reverse order, the heap is built \"from bottom to top.\"

    The reason for choosing reverse traversal is that it ensures the subtree below the current node is already a valid sub-heap, making the heapification of the current node effective.

    It's worth mentioning that since leaf nodes have no children, they naturally form valid sub-heaps and do not need to be heapified. As shown in the following code, the last non-leaf node is the parent of the last node; we start from it and traverse in reverse order to perform heapification:

    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
    [class]{MaxHeap}-[func]{__init__}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/build_heap/#823-complexity-analysis","title":"8.2.3 \u00a0 Complexity analysis","text":"

    Next, let's attempt to calculate the time complexity of this second method of heap construction.

    • Assuming the number of nodes in the complete binary tree is \\(n\\), then the number of leaf nodes is \\((n + 1) / 2\\), where \\(/\\) is integer division. Therefore, the number of nodes that need to be heapified is \\((n - 1) / 2\\).
    • In the process of \"top to bottom heapification,\" each node is heapified to the leaf nodes at most, so the maximum number of iterations is the height of the binary tree \\(\\log n\\).

    Multiplying the two, we get the time complexity of the heap construction process as \\(O(n \\log n)\\). But this estimate is not accurate, because it does not take into account the nature of the binary tree having far more nodes at the lower levels than at the top.

    Let's perform a more accurate calculation. To simplify the calculation, assume a \"perfect binary tree\" with \\(n\\) nodes and height \\(h\\); this assumption does not affect the correctness of the result.

    Figure 8-5 \u00a0 Node counts at each level of a perfect binary tree

    As shown in the Figure 8-5 , the maximum number of iterations for a node \"to be heapified from top to bottom\" is equal to the distance from that node to the leaf nodes, which is precisely \"node height.\" Therefore, we can sum the \"number of nodes \\(\\times\\) node height\" at each level, to get the total number of heapification iterations for all nodes.

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    To simplify the above equation, we need to use knowledge of sequences from high school, first multiply \\(T(h)\\) by \\(2\\), to get:

    \\[ \\begin{aligned} T(h) & = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{h-1}\\times1 \\newline 2T(h) & = 2^1h + 2^2(h-1) + 2^3(h-2) + \\dots + 2^h\\times1 \\newline \\end{aligned} \\]

    By subtracting \\(T(h)\\) from \\(2T(h)\\) using the method of displacement, we get:

    \\[ 2T(h) - T(h) = T(h) = -2^0h + 2^1 + 2^2 + \\dots + 2^{h-1} + 2^h \\]

    Observing the equation, \\(T(h)\\) is an geometric series, which can be directly calculated using the sum formula, resulting in a time complexity of:

    \\[ \\begin{aligned} T(h) & = 2 \\frac{1 - 2^h}{1 - 2} - h \\newline & = 2^{h+1} - h - 2 \\newline & = O(2^h) \\end{aligned} \\]

    Further, a perfect binary tree with height \\(h\\) has \\(n = 2^{h+1} - 1\\) nodes, thus the complexity is \\(O(2^h) = O(n)\\). This calculation shows that the time complexity of inputting a list and constructing a heap is \\(O(n)\\), which is very efficient.

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 Heap","text":"

    A \"heap\" is a complete binary tree that satisfies specific conditions and can be mainly divided into two types, as shown in the Figure 8-1 .

    • \"Min heap\": The value of any node \\(\\leq\\) the values of its child nodes.
    • \"Max heap\": The value of any node \\(\\geq\\) the values of its child nodes.

    Figure 8-1 \u00a0 Min heap and max heap

    As a special case of a complete binary tree, heaps have the following characteristics:

    • The bottom layer nodes are filled from left to right, and nodes in other layers are fully filled.
    • The root node of the binary tree is called the \"heap top,\" and the bottom-rightmost node is called the \"heap bottom.\"
    • For max heaps (min heaps), the value of the heap top element (root node) is the largest (smallest).
    "},{"location":"chapter_heap/heap/#811-common-operations-on-heaps","title":"8.1.1 \u00a0 Common operations on heaps","text":"

    It should be noted that many programming languages provide a \"priority queue,\" which is an abstract data structure defined as a queue with priority sorting.

    In fact, heaps are often used to implement priority queues, with max heaps equivalent to priority queues where elements are dequeued in descending order. From a usage perspective, we can consider \"priority queue\" and \"heap\" as equivalent data structures. Therefore, this book does not make a special distinction between the two, uniformly referring to them as \"heap.\"

    Common operations on heaps are shown in the Table 8-1 , and the method names depend on the programming language.

    Table 8-1 \u00a0 Efficiency of Heap Operations

    Method name Description Time complexity push() Add an element to the heap \\(O(\\log n)\\) pop() Remove the top element from the heap \\(O(\\log n)\\) peek() Access the top element (for max/min heap, the max/min value) \\(O(1)\\) size() Get the number of elements in the heap \\(O(1)\\) isEmpty() Check if the heap is empty \\(O(1)\\)

    In practice, we can directly use the heap class (or priority queue class) provided by programming languages.

    Similar to sorting algorithms where we have \"ascending order\" and \"descending order,\" we can switch between \"min heap\" and \"max heap\" by setting a flag or modifying the Comparator. The code is as follows:

    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
    \n
    heap.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    https://pythontutor.com/render.html#code=import%20heapq%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20min_heap,%20flag%20%3D%20%5B%5D,%201%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20max_heap,%20flag%20%3D%20%5B%5D,%20-1%0A%20%20%20%20%0A%20%20%20%20%23%20Python%20%E7%9A%84%20heapq%20%E6%A8%A1%E5%9D%97%E9%BB%98%E8%AE%A4%E5%AE%9E%E7%8E%B0%E5%B0%8F%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E8%80%83%E8%99%91%E5%B0%86%E2%80%9C%E5%85%83%E7%B4%A0%E5%8F%96%E8%B4%9F%E2%80%9D%E5%90%8E%E5%86%8D%E5%85%A5%E5%A0%86%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%A4%A7%E5%B0%8F%E5%85%B3%E7%B3%BB%E9%A2%A0%E5%80%92%EF%BC%8C%E4%BB%8E%E8%80%8C%E5%AE%9E%E7%8E%B0%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%23%20%E5%9C%A8%E6%9C%AC%E7%A4%BA%E4%BE%8B%E4%B8%AD%EF%BC%8Cflag%20%3D%201%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%B0%8F%E9%A1%B6%E5%A0%86%EF%BC%8Cflag%20%3D%20-1%20%E6%97%B6%E5%AF%B9%E5%BA%94%E5%A4%A7%E9%A1%B6%E5%A0%86%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E5%A0%86%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%201%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%203%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%202%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%205%29%0A%20%20%20%20heapq.heappush%28max_heap,%20flag%20*%204%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%0A%20%20%20%20peek%20%3D%20flag%20*%20max_heap%5B0%5D%20%23%205%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%A0%86%E9%A1%B6%E5%85%83%E7%B4%A0%E5%87%BA%E5%A0%86%0A%20%20%20%20%23%20%E5%87%BA%E5%A0%86%E5%85%83%E7%B4%A0%E4%BC%9A%E5%BD%A2%E6%88%90%E4%B8%80%E4%B8%AA%E4%BB%8E%E5%A4%A7%E5%88%B0%E5%B0%8F%E7%9A%84%E5%BA%8F%E5%88%97%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%205%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%204%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%203%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%202%0A%20%20%20%20val%20%3D%20flag%20*%20heapq.heappop%28max_heap%29%20%23%201%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%A0%86%E5%A4%A7%E5%B0%8F%0A%20%20%20%20size%20%3D%20len%28max_heap%29%0A%20%20%20%20%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%A0%86%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20not%20max_heap%0A%20%20%20%20%0A%20%20%20%20%23%20%E8%BE%93%E5%85%A5%E5%88%97%E8%A1%A8%E5%B9%B6%E5%BB%BA%E5%A0%86%0A%20%20%20%20min_heap%20%3D%20%5B1,%203,%202,%205,%204%5D%0A%20%20%20%20heapq.heapify%28min_heap%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_heap/heap/#812-implementation-of-heaps","title":"8.1.2 \u00a0 Implementation of heaps","text":"

    The following implementation is of a max heap. To convert it into a min heap, simply invert all size logic comparisons (for example, replace \\(\\geq\\) with \\(\\leq\\)). Interested readers are encouraged to implement it on their own.

    "},{"location":"chapter_heap/heap/#1-storage-and-representation-of-heaps","title":"1. \u00a0 Storage and representation of heaps","text":"

    As mentioned in the \"Binary Trees\" section, complete binary trees are well-suited for array representation. Since heaps are a type of complete binary tree, we will use arrays to store heaps.

    When using an array to represent a binary tree, elements represent node values, and indexes represent node positions in the binary tree. Node pointers are implemented through an index mapping formula.

    As shown in the Figure 8-2 , given an index \\(i\\), the index of its left child is \\(2i + 1\\), the index of its right child is \\(2i + 2\\), and the index of its parent is \\((i - 1) / 2\\) (floor division). When the index is out of bounds, it signifies a null node or the node does not exist.

    Figure 8-2 \u00a0 Representation and storage of heaps

    We can encapsulate the index mapping formula into functions for convenient later use:

    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
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\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-accessing-the-top-element-of-the-heap","title":"2. \u00a0 Accessing the top element of the heap","text":"

    The top element of the heap is the root node of the binary tree, which is also the first element of the list:

    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
    [class]{MaxHeap}-[func]{peek}\n
    my_heap.zig
    // \u8bbf\u95ee\u5806\u9876\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#3-inserting-an-element-into-the-heap","title":"3. \u00a0 Inserting an element into the heap","text":"

    Given an element val, we first add it to the bottom of the heap. After addition, since val may be larger than other elements in the heap, the heap's integrity might be compromised, thus it's necessary to repair the path from the inserted node to the root node. This operation is called \"heapifying\".

    Considering starting from the node inserted, perform heapify from bottom to top. As shown in the Figure 8-3 , we compare the value of the inserted node with its parent node, and if the inserted node is larger, we swap them. Then continue this operation, repairing each node in the heap from bottom to top until passing the root node or encountering a node that does not need to be swapped.

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

    Figure 8-3 \u00a0 Steps of element insertion into the heap

    Given a total of \\(n\\) nodes, the height of the tree is \\(O(\\log n)\\). Hence, the loop iterations for the heapify operation are at most \\(O(\\log n)\\), making the time complexity of the element insertion operation \\(O(\\log n)\\). The code is as shown:

    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
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#4-removing-the-top-element-from-the-heap","title":"4. \u00a0 Removing the top element from the heap","text":"

    The top element of the heap is the root node of the binary tree, that is, the first element of the list. If we directly remove the first element from the list, all node indexes in the binary tree would change, making it difficult to use heapify for repairs subsequently. To minimize changes in element indexes, we use the following steps.

    1. Swap the top element with the bottom element of the heap (swap the root node with the rightmost leaf node).
    2. After swapping, remove the bottom of the heap from the list (note, since it has been swapped, what is actually being removed is the original top element).
    3. Starting from the root node, perform heapify from top to bottom.

    As shown in the Figure 8-4 , the direction of \"heapify from top to bottom\" is opposite to \"heapify from bottom to top\". We compare the value of the root node with its two children and swap it with the largest child. Then repeat this operation until passing the leaf node or encountering a node that does not need to be swapped.

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

    Figure 8-4 \u00a0 Steps of removing the top element from the heap

    Similar to the element insertion operation, the time complexity of the top element removal operation is also \\(O(\\log n)\\). The code is as follows:

    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.remove(self.size() - 1);\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
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_heap/heap/#813-common-applications-of-heaps","title":"8.1.3 \u00a0 Common applications of heaps","text":"
    • Priority Queue: Heaps are often the preferred data structure for implementing priority queues, with both enqueue and dequeue operations having a time complexity of \\(O(\\log n)\\), and building a queue having a time complexity of \\(O(n)\\), all of which are very efficient.
    • Heap Sort: Given a set of data, we can create a heap from them and then continually perform element removal operations to obtain ordered data. However, we usually use a more elegant method to implement heap sort, as detailed in the \"Heap Sort\" section.
    • Finding the Largest \\(k\\) Elements: This is a classic algorithm problem and also a typical application, such as selecting the top 10 hot news for Weibo hot search, picking the top 10 selling products, etc.
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 Summary","text":""},{"location":"chapter_heap/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A heap is a complete binary tree, which can be divided into a max heap and a min heap based on its property. The top element of a max (min) heap is the largest (smallest).
    • A priority queue is defined as a queue with dequeue priority, usually implemented using a heap.
    • Common operations of a heap and their corresponding time complexities include: element insertion into the heap \\(O(\\log n)\\), removing the top element from the heap \\(O(\\log n)\\), and accessing the top element of the heap \\(O(1)\\).
    • A complete binary tree is well-suited to be represented by an array, thus heaps are commonly stored using arrays.
    • Heapify operations are used to maintain the properties of the heap and are used in both heap insertion and removal operations.
    • The time complexity of inserting \\(n\\) elements into a heap and building the heap can be optimized to \\(O(n)\\), which is highly efficient.
    • Top-k is a classic algorithm problem that can be efficiently solved using the heap data structure, with a time complexity of \\(O(n \\log k)\\).
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the \"heap\" in data structures the same concept as the \"heap\" in memory management?

    The two are not the same concept, even though they are both referred to as \"heap\". The heap in computer system memory is part of dynamic memory allocation, where the program can use it to store data during execution. The program can request a certain amount of heap memory to store complex structures like objects and arrays. When these data are no longer needed, the program needs to release this memory to prevent memory leaks. Compared to stack memory, the management and usage of heap memory need to be more cautious, as improper use may lead to memory leaks and dangling pointers.

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k problem","text":"

    Question

    Given an unordered array nums of length \\(n\\), return the largest \\(k\\) elements in the array.

    For this problem, we will first introduce two straightforward solutions, then explain a more efficient heap-based method.

    "},{"location":"chapter_heap/top_k/#831-method-1-iterative-selection","title":"8.3.1 \u00a0 Method 1: Iterative selection","text":"

    We can perform \\(k\\) rounds of iterations as shown in the Figure 8-6 , extracting the \\(1^{st}\\), \\(2^{nd}\\), \\(\\dots\\), \\(k^{th}\\) largest elements in each round, with a time complexity of \\(O(nk)\\).

    This method is only suitable when \\(k \\ll n\\), as the time complexity approaches \\(O(n^2)\\) when \\(k\\) is close to \\(n\\), which is very time-consuming.

    Figure 8-6 \u00a0 Iteratively finding the largest k elements

    Tip

    When \\(k = n\\), we can obtain a complete ordered sequence, which is equivalent to the \"selection sort\" algorithm.

    "},{"location":"chapter_heap/top_k/#832-method-2-sorting","title":"8.3.2 \u00a0 Method 2: Sorting","text":"

    As shown in the Figure 8-7 , we can first sort the array nums and then return the last \\(k\\) elements, with a time complexity of \\(O(n \\log n)\\).

    Clearly, this method \"overachieves\" the task, as we only need to find the largest \\(k\\) elements, without the need to sort the other elements.

    Figure 8-7 \u00a0 Sorting to find the largest k elements

    "},{"location":"chapter_heap/top_k/#833-method-3-heap","title":"8.3.3 \u00a0 Method 3: Heap","text":"

    We can solve the Top-k problem more efficiently based on heaps, as shown in the following process.

    1. Initialize a min heap, where the top element is the smallest.
    2. First, insert the first \\(k\\) elements of the array into the heap.
    3. Starting from the \\(k + 1^{th}\\) element, if the current element is greater than the top element of the heap, remove the top element of the heap and insert the current element into the heap.
    4. After completing the traversal, the heap contains the largest \\(k\\) elements.
    <1><2><3><4><5><6><7><8><9>

    Figure 8-8 \u00a0 Find the largest k elements based on heap

    Example code is as follows:

    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
    [class]{}-[func]{top_k_heap}\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    Code Visualization

    Full Screen >

    A total of \\(n\\) rounds of heap insertions and deletions are performed, with the maximum heap size being \\(k\\), hence the time complexity is \\(O(n \\log k)\\). This method is very efficient; when \\(k\\) is small, the time complexity tends towards \\(O(n)\\); when \\(k\\) is large, the time complexity will not exceed \\(O(n \\log n)\\).

    Additionally, this method is suitable for scenarios with dynamic data streams. By continuously adding data, we can maintain the elements within the heap, thereby achieving dynamic updates of the largest \\(k\\) elements.

    "},{"location":"chapter_hello_algo/","title":"Before starting","text":"

    A few years ago, I shared the \"Sword for Offer\" problem solutions on LeetCode, receiving encouragement and support from many readers. During interactions with readers, the most common question I encountered was \"how to get started with algorithms.\" Gradually, I developed a keen interest in this question.

    Directly solving problems seems to be the most popular method \u2014 it's simple, direct, and effective. However, problem-solving is like playing a game of Minesweeper: those with strong self-study abilities can defuse the mines one by one, but those with insufficient basics might end up metaphorically bruised from explosions, retreating step by step in frustration. Going through textbooks is also common, but for those aiming for job applications, the energy spent on thesis writing, resume submissions, and preparation for written tests and interviews leaves little for tackling thick books, turning it into a daunting challenge.

    If you're facing similar troubles, then this book are lucky to have found you. This book is my answer to the question. While it may not be the best solution, it is at least a positive attempt. This book may not directly land you an offer, but it will guide you through the \"knowledge map\" in data structures and algorithms, help you understand the shapes, sizes, and locations of different \"mines,\" and enable you to master various \"demining methods.\" With these skills, I believe you can solve problems and read literature more comfortably, gradually building a knowledge system.

    I deeply agree with Professor Feynman's statement: \"Knowledge isn't free. You have to pay attention.\" In this sense, this book is not entirely \"free.\" To not disappoint the precious \"attention\" you pay for this book, I will do my best, dedicating my utmost \"attention\" to this book.

    Knowing my limitations, although the content of this book has been refined over time, there are surely many errors remaining. I sincerely request critiques and corrections from all teachers and students.

    Hello, Algo!

    The advent of computers has brought significant changes to the world. With their high-speed computing power and excellent programmability, they have become the ideal medium for executing algorithms and processing data. Whether it's the realistic graphics of video games, the intelligent decisions in autonomous driving, the brilliant Go games of AlphaGo, or the natural interactions of ChatGPT, these applications are all exquisite demonstrations of algorithms at work on computers.

    In fact, before the advent of computers, algorithms and data structures already existed in every corner of the world. Early algorithms were relatively simple, such as ancient counting methods and tool-making procedures. As civilization progressed, algorithms became more refined and complex. From the exquisite craftsmanship of artisans, to industrial products that liberate productive forces, to the scientific laws governing the universe, almost every ordinary or astonishing thing has behind it the ingenious thought of algorithms.

    Similarly, data structures are everywhere: from social networks to subway lines, many systems can be modeled as \"graphs\"; from a country to a family, the main forms of social organization exhibit characteristics of \"trees\"; winter clothes are like a \"stack\", where the first item worn is the last to be taken off; a badminton shuttle tube resembles a \"queue\", with one end for insertion and the other for retrieval; a dictionary is like a \"hash table\", enabling quick search for target entries.

    This book aims to help readers understand the core concepts of algorithms and data structures through clear, easy-to-understand animated illustrations and runnable code examples, and to be able to implement them through programming. On this basis, this book strives to reveal the vivid manifestations of algorithms in the complex world, showcasing the beauty of algorithms. I hope this book can help you!

    "},{"location":"chapter_introduction/","title":"Chapter 1. \u00a0 Encounter with algorithms","text":"

    Abstract

    A graceful maiden dances, intertwined with the data, her skirt swaying to the melody of algorithms.

    She invites you to a dance, follow her steps, and enter the world of algorithms full of logic and beauty.

    "},{"location":"chapter_introduction/#chapter-contents","title":"Chapter contents","text":"
    • 1.1 \u00a0 Algorithms are everywhere
    • 1.2 \u00a0 What is an algorithm
    • 1.3 \u00a0 Summary
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 Algorithms are everywhere","text":"

    When we hear the word \"algorithm,\" we naturally think of mathematics. However, many algorithms do not involve complex mathematics but rely more on basic logic, which can be seen everywhere in our daily lives.

    Before formally discussing algorithms, there's an interesting fact worth sharing: you have already unconsciously learned many algorithms and have become accustomed to applying them in your daily life. Here, I will give a few specific examples to prove this point.

    Example 1: Looking Up a Dictionary. In an English dictionary, words are listed alphabetically. Suppose we're searching for a word that starts with the letter \\(r\\). This is typically done in the following way:

    1. Open the dictionary to about halfway and check the first letter on the page, let's say the letter is \\(m\\).
    2. Since \\(r\\) comes after \\(m\\) in the alphabet, we can ignore the first half of the dictionary and focus on the latter half.
    3. Repeat steps 1. and 2. until you find the page where the word starts with \\(r\\).
    <1><2><3><4><5>

    Figure 1-1 \u00a0 Process of Looking Up a Dictionary

    This essential skill for elementary students, looking up a dictionary, is actually the famous \"Binary Search\" algorithm. From a data structure perspective, we can consider the dictionary as a sorted \"array\"; from an algorithmic perspective, the series of actions taken to look up a word in the dictionary can be viewed as \"Binary Search.\"

    Example 2: Organizing Playing Cards. When playing cards, we need to arrange the cards in our hand in ascending order, as shown in the following process.

    1. Divide the playing cards into \"ordered\" and \"unordered\" sections, assuming initially the leftmost card is already in order.
    2. Take out a card from the unordered section and insert it into the correct position in the ordered section; after this, the leftmost two cards are in order.
    3. Continue to repeat step 2. until all cards are in order.

    Figure 1-2 \u00a0 Playing cards sorting process

    The above method of organizing playing cards is essentially the \"Insertion Sort\" algorithm, which is very efficient for small datasets. Many programming languages' sorting functions include the insertion sort.

    Example 3: Making Change. Suppose we buy goods worth \\(69\\) yuan at a supermarket and give the cashier \\(100\\) yuan, then the cashier needs to give us \\(31\\) yuan in change. They would naturally complete the thought process as shown below.

    1. The options are currencies smaller than \\(31\\), including \\(1\\), \\(5\\), \\(10\\), and \\(20\\).
    2. Take out the largest \\(20\\) from the options, leaving \\(31 - 20 = 11\\).
    3. Take out the largest \\(10\\) from the remaining options, leaving \\(11 - 10 = 1\\).
    4. Take out the largest \\(1\\) from the remaining options, leaving \\(1 - 1 = 0\\).
    5. Complete the change-making, with the solution being \\(20 + 10 + 1 = 31\\).

    Figure 1-3 \u00a0 Change making process

    In the above steps, we make the best choice at each step (using the largest denomination possible), ultimately resulting in a feasible change-making plan. From the perspective of data structures and algorithms, this method is essentially a \"Greedy\" algorithm.

    From cooking a meal to interstellar travel, almost all problem-solving involves algorithms. The advent of computers allows us to store data structures in memory and write code to call the CPU and GPU to execute algorithms. In this way, we can transfer real-life problems to computers, solving various complex issues more efficiently.

    Tip

    If concepts such as data structures, algorithms, arrays, and binary search still seem somewhat obsecure, I encourage you to continue reading. This book will gently guide you into the realm of understanding data structures and algorithms.

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 Summary","text":"
    • Algorithms are ubiquitous in daily life and are not as inaccessible and complex as they might seem. In fact, we have already unconsciously learned many algorithms to solve various problems in life.
    • The principle of looking up a word in a dictionary is consistent with the binary search algorithm. The binary search algorithm embodies the important algorithmic concept of divide and conquer.
    • The process of organizing playing cards is very similar to the insertion sort algorithm. The insertion sort algorithm is suitable for sorting small datasets.
    • The steps of making change in currency essentially follow the greedy algorithm, where each step involves making the best possible choice at the moment.
    • An algorithm is a set of instructions or steps used to solve a specific problem within a finite amount of time, while a data structure is the way data is organized and stored in a computer.
    • Data structures and algorithms are closely linked. Data structures are the foundation of algorithms, and algorithms are the stage to utilize the functions of data structures.
    • We can liken data structures and algorithms to building blocks. The blocks represent data, the shape and connection method of the blocks represent data structures, and the steps of assembling the blocks correspond to algorithms.
    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 What is an algorithm","text":""},{"location":"chapter_introduction/what_is_dsa/#121-definition-of-an-algorithm","title":"1.2.1 \u00a0 Definition of an algorithm","text":"

    An \"algorithm\" is a set of instructions or steps to solve a specific problem within a finite amount of time. It has the following characteristics:

    • The problem is clearly defined, including unambiguous definitions of input and output.
    • The algorithm is feasible, meaning it can be completed within a finite number of steps, time, and memory space.
    • Each step has a definitive meaning. The output is consistently the same under the same inputs and conditions.
    "},{"location":"chapter_introduction/what_is_dsa/#122-definition-of-a-data-structure","title":"1.2.2 \u00a0 Definition of a data structure","text":"

    A \"data structure\" is a way of organizing and storing data in a computer, with the following design goals:

    • Minimize space occupancy to save computer memory.
    • Make data operations as fast as possible, covering data access, addition, deletion, updating, etc.
    • Provide concise data representation and logical information to enable efficient algorithm execution.

    Designing data structures is a balancing act, often requiring trade-offs. If you want to improve in one aspect, you often need to compromise in another. Here are two examples:

    • Compared to arrays, linked lists offer more convenience in data addition and deletion but sacrifice data access speed.
    • Graphs, compared to linked lists, provide richer logical information but require more memory space.
    "},{"location":"chapter_introduction/what_is_dsa/#123-relationship-between-data-structures-and-algorithms","title":"1.2.3 \u00a0 Relationship between data structures and algorithms","text":"

    As shown in the Figure 1-4 , data structures and algorithms are highly related and closely integrated, specifically in the following three aspects:

    • Data structures are the foundation of algorithms. They provide structured data storage and methods for manipulating data for algorithms.
    • Algorithms are the stage where data structures come into play. The data structure alone only stores data information; it is through the application of algorithms that specific problems can be solved.
    • Algorithms can often be implemented based on different data structures, but their execution efficiency can vary greatly. Choosing the right data structure is key.

    Figure 1-4 \u00a0 Relationship between data structures and algorithms

    Data structures and algorithms can be likened to a set of building blocks, as illustrated in the Figure 1-5 . A building block set includes numerous pieces, accompanied by detailed assembly instructions. Following these instructions step by step allows us to construct an intricate block model.

    Figure 1-5 \u00a0 Assembling blocks

    The detailed correspondence between the two is shown in the Table 1-1 .

    Table 1-1 \u00a0 Comparing data structures and algorithms to building blocks

    Data Structures and Algorithms Building Blocks Input data Unassembled blocks Data structure Organization of blocks, including shape, size, connections, etc Algorithm A series of steps to assemble the blocks into the desired shape Output data Completed Block model

    It's worth noting that data structures and algorithms are independent of programming languages. For this reason, this book is able to provide implementations in multiple programming languages.

    Conventional Abbreviation

    In real-life discussions, we often refer to \"Data Structures and Algorithms\" simply as \"Algorithms\". For example, the well-known LeetCode algorithm problems actually test both data structure and algorithm knowledge.

    "},{"location":"chapter_preface/","title":"Chapter 0. \u00a0 Preface","text":"

    Abstract

    Algorithms are like a beautiful symphony, with each line of code flowing like a rhythm.

    May this book ring softly in your mind, leaving a unique and profound melody.

    "},{"location":"chapter_preface/#chapter-contents","title":"Chapter contents","text":"
    • 0.1 \u00a0 About this book
    • 0.2 \u00a0 How to read
    • 0.3 \u00a0 Summary
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 About this book","text":"

    This open-source project aims to create a free, and beginner-friendly crash course on data structures and algorithms.

    • Using animated illustrations, it delivers structured insights into data structures and algorithmic concepts, ensuring comprehensibility and a smooth learning curve.
    • Run code with just one click, supporting Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig and other languages.
    • Readers are encouraged to engage with each other in the discussion area for each section, questions and comments are usually answered within two days.
    "},{"location":"chapter_preface/about_the_book/#011-target-audience","title":"0.1.1 \u00a0 Target audience","text":"

    If you are new to algorithms with limited exposure, or you have accumulated some experience in algorithms, but you only have a vague understanding of data structures and algorithms, and you are constantly jumping between \"yep\" and \"hmm\", then this book is for you!

    If you have already accumulated a certain amount of problem-solving experience, and are familiar with most types of problems, then this book can help you review and organize your algorithm knowledge system. The repository's source code can be used as a \"problem-solving toolkit\" or an \"algorithm cheat sheet\".

    If you are an algorithm expert, we look forward to receiving your valuable suggestions, or join us and collaborate.

    Prerequisites

    You should know how to write and read simple code in at least one programming language.

    "},{"location":"chapter_preface/about_the_book/#012-content-structure","title":"0.1.2 \u00a0 Content structure","text":"

    The main content of the book is shown in the following figure.

    • Complexity analysis: explores aspects and methods for evaluating data structures and algorithms. Covers methods of deriving time complexity and space complexity, along with common types and examples.
    • Data structures: focuses on fundamental data types, classification methods, definitions, pros and cons, common operations, types, applications, and implementation methods of data structures such as array, linked list, stack, queue, hash table, tree, heap, graph, etc.
    • Algorithms: defines algorithms, discusses their pros and cons, efficiency, application scenarios, problem-solving steps, and includes sample questions for various algorithms such as search, sorting, divide and conquer, backtracking, dynamic programming, greedy algorithms, and more.

    Figure 0-1 \u00a0 Main content of the book

    "},{"location":"chapter_preface/about_the_book/#013-acknowledgements","title":"0.1.3 \u00a0 Acknowledgements","text":"

    This book is continuously improved with the joint efforts of many contributors from the open-source community. Thanks to each writer who invested their time and energy, listed in the order generated by GitHub: krahets, codingonion, nuomi1, Gonglja, Reanon, justin-tse, danielsss, hpstory, S-N-O-R-L-A-X, night-cruise, msk397, gvenusleo, RiverTwilight, gyt95, zhuoqinyue, Zuoxun, Xia-Sang, mingXta, FangYuan33, GN-Yu, IsChristina, xBLACKICEx, guowei-gong, Cathay-Chen, mgisr, JoseHung, qualifier1024, pengchzn, Guanngxu, longsizhuo, L-Super, what-is-me, yuan0221, lhxsm, Slone123c, WSL0809, longranger2, theNefelibatas, xiongsp, JeffersonHuang, hongyun-robot, K3v123, yuelinxin, a16su, gaofer, malone6, Wonderdch, xjr7670, DullSword, Horbin-Magician, NI-SW, reeswell, XC-Zero, XiaChuerwu, yd-j, iron-irax, huawuque404, MolDuM, Nigh, KorsChen, foursevenlove, 52coder, bubble9um, youshaoXG, curly210102, gltianwen, fanchenggang, Transmigration-zhou, FloranceYeh, FreddieLi, ShiMaRing, lipusheng, Javesun99, JackYang-hellobobo, shanghai-Jerry, 0130w, Keynman, psychelzh, logan-qiu, ZnYang2018, MwumLi, 1ch0, Phoenix0415, qingpeng9802, Richard-Zhang1019, QiLOL, Suremotoo, Turing-1024-Lee, Evilrabbit520, GaochaoZhu, ZJKung, linzeyan, hezhizhen, ZongYangL, beintentional, czruby, coderlef, dshlstarr, szu17dmy, fbigm, gledfish, hts0000, boloboloda, iStig, jiaxianhua, wenjianmin, keshida, kilikilikid, lclc6, lwbaptx, liuxjerry, lucaswangdev, lyl625760, chadyi, noobcodemaker, selear, siqyka, syd168, 4yDX3906, tao363, wangwang105, weibk, yabo083, yi427, yishangzhang, zhouLion, baagod, ElaBosak233, xb534, luluxia, yanedie, thomasq0, YangXuanyi and th1nk3r-ing.

    The code review work for this book was completed by codingonion, Gonglja, gvenusleo, hpstory, justin\u2010tse, krahets, night-cruise, nuomi1, and Reanon (listed in alphabetical order). Thanks to them for their time and effort, ensuring the standardization and uniformity of the code in various languages.

    Throughout the creation of this book, numerous individuals provided invaluable assistance, including but not limited to:

    • Thanks to my mentor at the company, Dr. Xi Li, who encouraged me in a conversation to \"get moving fast,\" which solidified my determination to write this book;
    • Thanks to my girlfriend Bubble, as the first reader of this book, for offering many valuable suggestions from the perspective of a beginner in algorithms, making this book more suitable for newbies;
    • Thanks to Tengbao, Qibao, and Feibao for coming up with a creative name for this book, evoking everyone's fond memories of writing their first line of code \"Hello World!\";
    • Thanks to Xiaoquan for providing professional help in intellectual property, which has played a significant role in the development of this open-source book;
    • Thanks to Sutong for designing a beautiful cover and logo for this book, and for patiently making multiple revisions under my insistence;
    • Thanks to @squidfunk for providing writing and typesetting suggestions, as well as his developed open-source documentation theme Material-for-MkDocs.

    Throughout the writing journey, I delved into numerous textbooks and articles on data structures and algorithms. These works served as exemplary models, ensuring the accuracy and quality of this book's content. I extend my gratitude to all who preceded me for their invaluable contributions!

    This book advocates a combination of hands-on and minds-on learning, inspired in this regard by \"Dive into Deep Learning\". I highly recommend this excellent book to all readers.

    Heartfelt thanks to my parents, whose ongoing support and encouragement have allowed me to do this interesting work.

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 How to read","text":"

    Tip

    For the best reading experience, it is recommended that you read through this section.

    "},{"location":"chapter_preface/suggestions/#021-writing-conventions","title":"0.2.1 \u00a0 Writing conventions","text":"
    • Chapters marked with '*' after the title are optional and contain relatively challenging content. If you are short on time, it is advisable to skip them.
    • Technical terms will be in boldface (in the print and PDF versions) or underlined (in the web version), for instance, array. It's advisable to familiarize yourself with these for better comprehension of technical texts.
    • Bolded text indicates key content or summary statements, which deserve special attention.
    • Words and phrases with specific meanings are indicated with \u201cquotation marks\u201d to avoid ambiguity.
    • When it comes to terms that are inconsistent between programming languages, this book follows Python, for example using None to mean null.
    • This book partially ignores the comment conventions for programming languages in exchange for a more compact layout of the content. The comments primarily consist of three types: title comments, content comments, and multi-line comments.
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig
    \"\"\"Header comments for labeling functions, classes, test samples, etc\"\"\"\n\n# Comments for explaining details\n\n\"\"\"\nMultiline\ncomments\n\"\"\"\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    /* Header comments for labeling functions, classes, test samples, etc */\n\n// Comments for explaining details.\n\n/**\n * Multiline\n * comments\n */\n
    // Header comments for labeling functions, classes, test samples, etc\n\n// Comments for explaining details.\n\n// Multiline\n// comments\n
    "},{"location":"chapter_preface/suggestions/#022-efficient-learning-via-animated-illustrations","title":"0.2.2 \u00a0 Efficient learning via animated illustrations","text":"

    Compared with text, videos and pictures have a higher density of information and are more structured, making them easier to understand. In this book, key and difficult concepts are mainly presented through animations and illustrations, with text serving as explanations and supplements.

    When encountering content with animations or illustrations as shown in the Figure 0-2 , prioritize understanding the figure, with text as supplementary, integrating both for a comprehensive understanding.

    Figure 0-2 \u00a0 Animated illustration example

    "},{"location":"chapter_preface/suggestions/#023-deepen-understanding-through-coding-practice","title":"0.2.3 \u00a0 Deepen understanding through coding practice","text":"

    The source code of this book is hosted on the GitHub Repository. As shown in the Figure 0-3 , the source code comes with test examples and can be executed with just a single click.

    If time permits, it's recommended to type out the code yourself. If pressed for time, at least read and run all the codes.

    Compared to just reading code, writing code often yields more learning. Learning by doing is the real way to learn.

    Figure 0-3 \u00a0 Running code example

    Setting up to run the code involves three main steps.

    Step 1: Install a local programming environment. Follow the tutorial in the appendix for installation, or skip this step if already installed.

    Step 2: Clone or download the code repository. Visit the GitHub Repository.

    If Git is installed, use the following command to clone the repository:

    git clone https://github.com/krahets/hello-algo.git\n

    Alternatively, you can also click the \"Download ZIP\" button at the location shown in the Figure 0-4 to directly download the code as a compressed ZIP file. Then, you can simply extract it locally.

    Figure 0-4 \u00a0 Cloning repository and downloading code

    Step 3: Run the source code. As shown in the Figure 0-5 , for the code block labeled with the file name at the top, we can find the corresponding source code file in the codes folder of the repository. These files can be executed with a single click, which will help you save unnecessary debugging time and allow you to focus on learning.

    Figure 0-5 \u00a0 Code block and corresponding source code file

    "},{"location":"chapter_preface/suggestions/#024-learning-together-in-discussion","title":"0.2.4 \u00a0 Learning together in discussion","text":"

    While reading this book, please don't skip over the points that you didn't learn. Feel free to post your questions in the comment section. We will be happy to answer them and can usually respond within two days.

    As illustrated in the Figure 0-6 , each chapter features a comment section at the bottom. I encourage you to pay attention to these comments. They not only expose you to others' encountered problems, aiding in identifying knowledge gaps and sparking deeper contemplation, but also invite you to generously contribute by answering fellow readers' inquiries, sharing insights, and fostering mutual improvement.

    Figure 0-6 \u00a0 Comment section example

    "},{"location":"chapter_preface/suggestions/#025-algorithm-learning-path","title":"0.2.5 \u00a0 Algorithm learning path","text":"

    Overall, the journey of mastering data structures and algorithms can be divided into three stages:

    1. Stage 1: Introduction to algorithms. We need to familiarize ourselves with the characteristics and usage of various data structures and learn about the principles, processes, uses, and efficiency of different algorithms.
    2. Stage 2: Practicing algorithm problems. It is recommended to start from popular problems, such as Sword for Offer and LeetCode Hot 100, and accumulate at least 100 questions to familiarize yourself with mainstream algorithmic problems. Forgetfulness can be a challenge when you start practicing, but rest assured that this is normal. We can follow the \"Ebbinghaus Forgetting Curve\" to review the questions, and usually after 3~5 rounds of repetitions, we will be able to memorize them.
    3. Stage 3: Building the knowledge system. In terms of learning, we can read algorithm column articles, solution frameworks, and algorithm textbooks to continuously enrich the knowledge system. In terms of practicing, we can try advanced strategies, such as categorizing by topic, multiple solutions for a single problem, and one solution for multiple problems, etc. Insights on these strategies can be found in various communities.

    As shown in the Figure 0-7 , this book mainly covers \u201cStage 1,\u201d aiming to help you more efficiently embark on Stages 2 and 3.

    Figure 0-7 \u00a0 Algorithm learning path

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 Summary","text":"
    • The main audience of this book is beginners in algorithm. If you already have some basic knowledge, this book can help you systematically review your algorithm knowledge, and the source code in this book can also be used as a \"Coding Toolkit\".
    • The book consists of three main sections, Complexity Analysis, Data Structures, and Algorithms, covering most of the topics in the field.
    • For newcomers to algorithms, it is crucial to read an introductory book in the beginning stages to avoid many detours or common pitfalls.
    • Animations and figures within the book are usually used to introduce key points and difficult knowledge. These should be given more attention when reading the book.
    • Practice is the best way to learn programming. It is highly recommended that you run the source code and type in the code yourself.
    • Each chapter in the web version of this book features a discussion section, and you are welcome to share your questions and insights at any time.
    "},{"location":"chapter_stack_and_queue/","title":"Chapter 5. \u00a0 Stack and queue","text":"

    Abstract

    A stack is like cats placed on top of each other, while a queue is like cats lined up one by one.

    They represent the logical relationships of Last-In-First-Out (LIFO) and First-In-First-Out (FIFO), respectively.

    "},{"location":"chapter_stack_and_queue/#chapter-contents","title":"Chapter contents","text":"
    • 5.1 \u00a0 Stack
    • 5.2 \u00a0 Queue
    • 5.3 \u00a0 Double-ended queue
    • 5.4 \u00a0 Summary
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 Double-ended queue","text":"

    In a queue, we can only delete elements from the head or add elements to the tail. As shown in the following diagram, a \"double-ended queue (deque)\" offers more flexibility, allowing the addition or removal of elements at both the head and the tail.

    Figure 5-7 \u00a0 Operations in double-ended queue

    "},{"location":"chapter_stack_and_queue/deque/#531-common-operations-in-double-ended-queue","title":"5.3.1 \u00a0 Common operations in double-ended queue","text":"

    The common operations in a double-ended queue are listed below, and the names of specific methods depend on the programming language used.

    Table 5-3 \u00a0 Efficiency of double-ended queue operations

    Method Name Description Time Complexity pushFirst() Add an element to the head \\(O(1)\\) pushLast() Add an element to the tail \\(O(1)\\) popFirst() Remove the first element \\(O(1)\\) popLast() Remove the last element \\(O(1)\\) peekFirst() Access the first element \\(O(1)\\) peekLast() Access the last element \\(O(1)\\)

    Similarly, we can directly use the double-ended queue classes implemented in programming languages:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig deque.py
    from collections import deque\n\n# Initialize the deque\ndeque: deque[int] = deque()\n\n# Enqueue elements\ndeque.append(2)      # Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # Add to the head\ndeque.appendleft(1)\n\n# Access elements\nfront: int = deque[0]  # The first element\nrear: int = deque[-1]  # The last element\n\n# Dequeue elements\npop_front: int = deque.popleft()  # The first element dequeued\npop_rear: int = deque.pop()       # The last element dequeued\n\n# Get the length of the deque\nsize: int = len(deque)\n\n# Check if the deque is empty\nis_empty: bool = len(deque) == 0\n
    deque.cpp
    /* Initialize the deque */\ndeque<int> deque;\n\n/* Enqueue elements */\ndeque.push_back(2);   // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nint front = deque.front(); // The first element\nint back = deque.back();   // The last element\n\n/* Dequeue elements */\ndeque.pop_front();  // The first element dequeued\ndeque.pop_back();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nbool empty = deque.empty();\n
    deque.java
    /* Initialize the deque */\nDeque<Integer> deque = new LinkedList<>();\n\n/* Enqueue elements */\ndeque.offerLast(2);   // Add to the tail\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // Add to the head\ndeque.offerFirst(1);\n\n/* Access elements */\nint peekFirst = deque.peekFirst();  // The first element\nint peekLast = deque.peekLast();    // The last element\n\n/* Dequeue elements */\nint popFirst = deque.pollFirst();  // The first element dequeued\nint popLast = deque.pollLast();    // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.size();\n\n/* Check if the deque is empty */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* Initialize the deque */\n// In C#, LinkedList is used as a deque\nLinkedList<int> deque = new();\n\n/* Enqueue elements */\ndeque.AddLast(2);   // Add to the tail\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // Add to the head\ndeque.AddFirst(1);\n\n/* Access elements */\nint peekFirst = deque.First.Value;  // The first element\nint peekLast = deque.Last.Value;    // The last element\n\n/* Dequeue elements */\ndeque.RemoveFirst();  // The first element dequeued\ndeque.RemoveLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.Count;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* Initialize the deque */\n// In Go, use list as a deque\ndeque := list.New()\n\n/* Enqueue elements */\ndeque.PushBack(2)      // Add to the tail\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // Add to the head\ndeque.PushFront(1)\n\n/* Access elements */\nfront := deque.Front() // The first element\nrear := deque.Back()   // The last element\n\n/* Dequeue elements */\ndeque.Remove(front)    // The first element dequeued\ndeque.Remove(rear)     // The last element dequeued\n\n/* Get the length of the deque */\nsize := deque.Len()\n\n/* Check if the deque is empty */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* Initialize the deque */\n// Swift does not have a built-in deque class, so Array can be used as a deque\nvar deque: [Int] = []\n\n/* Enqueue elements */\ndeque.append(2) // Add to the tail\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // Add to the head\ndeque.insert(1, at: 0)\n\n/* Access elements */\nlet peekFirst = deque.first! // The first element\nlet peekLast = deque.last!   // The last element\n\n/* Dequeue elements */\n// Using Array, popFirst has a complexity of O(n)\nlet popFirst = deque.removeFirst() // The first element dequeued\nlet popLast = deque.removeLast()   // The last element dequeued\n\n/* Get the length of the deque */\nlet size = deque.count\n\n/* Check if the deque is empty */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* Initialize the deque */\n// JavaScript does not have a built-in deque, so Array is used as a deque\nconst deque = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst = deque[0]; // The first element\nconst peekLast = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront = deque.shift(); // The first element dequeued\nconst popBack = deque.pop();    // The last element dequeued\n\n/* Get the length of the deque */\nconst size = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty = size === 0;\n
    deque.ts
    /* Initialize the deque */\n// TypeScript does not have a built-in deque, so Array is used as a deque\nconst deque: number[] = [];\n\n/* Enqueue elements */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// Note that unshift() has a time complexity of O(n) as it's an array\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* Access elements */\nconst peekFirst: number = deque[0]; // The first element\nconst peekLast: number = deque[deque.length - 1]; // The last element\n\n/* Dequeue elements */\n// Note that shift() has a time complexity of O(n) as it's an array\nconst popFront: number = deque.shift() as number; // The first element dequeued\nconst popBack: number = deque.pop() as number;    // The last element dequeued\n\n/* Get the length of the deque */\nconst size: number = deque.length;\n\n/* Check if the deque is empty */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* Initialize the deque */\n// In Dart, Queue is defined as a deque\nQueue<int> deque = Queue<int>();\n\n/* Enqueue elements */\ndeque.addLast(2);  // Add to the tail\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // Add to the head\ndeque.addFirst(1);\n\n/* Access elements */\nint peekFirst = deque.first; // The first element\nint peekLast = deque.last;   // The last element\n\n/* Dequeue elements */\nint popFirst = deque.removeFirst(); // The first element dequeued\nint popLast = deque.removeLast();   // The last element dequeued\n\n/* Get the length of the deque */\nint size = deque.length;\n\n/* Check if the deque is empty */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* Initialize the deque */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(2);  // Add to the tail\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // Add to the head\ndeque.push_front(1);\n\n/* Access elements */\nif let Some(front) = deque.front() { // The first element\n}\nif let Some(rear) = deque.back() {   // The last element\n}\n\n/* Dequeue elements */\nif let Some(pop_front) = deque.pop_front() { // The first element dequeued\n}\nif let Some(pop_rear) = deque.pop_back() {   // The last element dequeued\n}\n\n/* Get the length of the deque */\nlet size = deque.len();\n\n/* Check if the deque is empty */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C does not provide a built-in deque\n
    deque.kt
    \n
    deque.zig
    \n
    Visualizing Code

    https://pythontutor.com/render.html#code=from%20collections%20import%20deque%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%0A%20%20%20%20deq%20%3D%20deque%28%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%85%A5%E9%98%9F%0A%20%20%20%20deq.append%282%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E5%B0%BE%0A%20%20%20%20deq.append%285%29%0A%20%20%20%20deq.append%284%29%0A%20%20%20%20deq.appendleft%283%29%20%20%23%20%E6%B7%BB%E5%8A%A0%E8%87%B3%E9%98%9F%E9%A6%96%0A%20%20%20%20deq.appendleft%281%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%AE%BF%E9%97%AE%E5%85%83%E7%B4%A0%0A%20%20%20%20front%20%3D%20deq%5B0%5D%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%20front%20%3D%22,%20front%29%0A%20%20%20%20rear%20%3D%20deq%5B-1%5D%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%20rear%20%3D%22,%20rear%29%0A%0A%20%20%20%20%23%20%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20pop_front%20%3D%20deq.popleft%28%29%20%20%23%20%E9%98%9F%E9%A6%96%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_front%20%3D%22,%20pop_front%29%0A%20%20%20%20print%28%22%E9%98%9F%E9%A6%96%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%20%20%20%20pop_rear%20%3D%20deq.pop%28%29%20%20%23%20%E9%98%9F%E5%B0%BE%E5%85%83%E7%B4%A0%E5%87%BA%E9%98%9F%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%85%83%E7%B4%A0%20%20pop_rear%20%3D%22,%20pop_rear%29%0A%20%20%20%20print%28%22%E9%98%9F%E5%B0%BE%E5%87%BA%E9%98%9F%E5%90%8E%20deque%20%3D%22,%20deq%29%0A%0A%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E7%9A%84%E9%95%BF%E5%BA%A6%0A%20%20%20%20size%20%3D%20len%28deq%29%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E9%95%BF%E5%BA%A6%20size%20%3D%22,%20size%29%0A%0A%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%0A%20%20%20%20is_empty%20%3D%20len%28deq%29%20%3D%3D%200%0A%20%20%20%20print%28%22%E5%8F%8C%E5%90%91%E9%98%9F%E5%88%97%E6%98%AF%E5%90%A6%E4%B8%BA%E7%A9%BA%20%3D%22,%20is_empty%29&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_stack_and_queue/deque/#532-implementing-a-double-ended-queue","title":"5.3.2 \u00a0 Implementing a double-ended queue *","text":"

    The implementation of a double-ended queue is similar to that of a regular queue, it can be based on either a linked list or an array as the underlying data structure.

    "},{"location":"chapter_stack_and_queue/deque/#1-implementation-based-on-doubly-linked-list","title":"1. \u00a0 Implementation based on doubly linked list","text":"

    Recall from the previous section that we used a regular singly linked list to implement a queue, as it conveniently allows for deleting from the head (corresponding to the dequeue operation) and adding new elements after the tail (corresponding to the enqueue operation).

    For a double-ended queue, both the head and the tail can perform enqueue and dequeue operations. In other words, a double-ended queue needs to implement operations in the opposite direction as well. For this, we use a \"doubly linked list\" as the underlying data structure of the double-ended queue.

    As shown in the Figure 5-8 , we treat the head and tail nodes of the doubly linked list as the front and rear of the double-ended queue, respectively, and implement the functionality to add and remove nodes at both ends.

    LinkedListDequepushLast()pushFirst()popLast()popFirst()

    Figure 5-8 \u00a0 Implementing Double-Ended Queue with Doubly Linked List for Enqueue and Dequeue Operations

    The implementation code is as follows:

    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-implementation-based-on-array","title":"2. \u00a0 Implementation based on array","text":"

    As shown in the Figure 5-9 , similar to implementing a queue with an array, we can also use a circular array to implement a double-ended queue.

    ArrayDequepushLast()pushFirst()popLast()popFirst()

    Figure 5-9 \u00a0 Implementing Double-Ended Queue with Array for Enqueue and Dequeue Operations

    The implementation only needs to add methods for \"front enqueue\" and \"rear dequeue\":

    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-applications-of-double-ended-queue","title":"5.3.3 \u00a0 Applications of double-ended queue","text":"

    The double-ended queue combines the logic of both stacks and queues, thus, it can implement all their respective use cases while offering greater flexibility.

    We know that software's \"undo\" feature is typically implemented using a stack: the system pushes each change operation onto the stack and then pops to implement undoing. However, considering the limitations of system resources, software often restricts the number of undo steps (for example, only allowing the last 50 steps). When the stack length exceeds 50, the software needs to perform a deletion operation at the bottom of the stack (the front of the queue). But a regular stack cannot perform this function, where a double-ended queue becomes necessary. Note that the core logic of \"undo\" still follows the Last-In-First-Out principle of a stack, but a double-ended queue can more flexibly implement some additional logic.

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 Queue","text":"

    \"Queue\" is a linear data structure that follows the First-In-First-Out (FIFO) rule. As the name suggests, a queue simulates the phenomenon of lining up, where newcomers join the queue at the rear, and the person at the front leaves the queue first.

    As shown in the Figure 5-4 , we call the front of the queue the \"head\" and the back the \"tail.\" The operation of adding elements to the rear of the queue is termed \"enqueue,\" and the operation of removing elements from the front is termed \"dequeue.\"

    Figure 5-4 \u00a0 Queue's first-in-first-out rule

    "},{"location":"chapter_stack_and_queue/queue/#521-common-operations-on-queue","title":"5.2.1 \u00a0 Common operations on queue","text":"

    The common operations on a queue are shown in the Table 5-2 . Note that method names may vary across different programming languages. Here, we use the same naming convention as that used for stacks.

    Table 5-2 \u00a0 Efficiency of queue operations

    Method Name Description Time Complexity push() Enqueue an element, add it to the tail \\(O(1)\\) pop() Dequeue the head element \\(O(1)\\) peek() Access the head element \\(O(1)\\)

    We can directly use the ready-made queue classes in programming languages:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig queue.py
    from collections import deque\n\n# Initialize the queue\n# In Python, we generally use the deque class as a queue\n# Although queue.Queue() is a pure queue class, it's not very user-friendly, so it's not recommended\nque: deque[int] = deque()\n\n# Enqueue elements\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# Access the first element\nfront: int = que[0]\n\n# Dequeue an element\npop: int = que.popleft()\n\n# Get the length of the queue\nsize: int = len(que)\n\n# Check if the queue is empty\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* Initialize the queue */\nqueue<int> queue;\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element*/\nint front = queue.front();\n\n/* Dequeue an element */\nqueue.pop();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nbool empty = queue.empty();\n
    queue.java
    /* Initialize the queue */\nQueue<Integer> queue = new LinkedList<>();\n\n/* Enqueue elements */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* Access the first element */\nint peek = queue.peek();\n\n/* Dequeue an element */\nint pop = queue.poll();\n\n/* Get the length of the queue */\nint size = queue.size();\n\n/* Check if the queue is empty */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* Initialize the queue */\nQueue<int> queue = new();\n\n/* Enqueue elements */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* Access the first element */\nint peek = queue.Peek();\n\n/* Dequeue an element */\nint pop = queue.Dequeue();\n\n/* Get the length of the queue */\nint size = queue.Count;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* Initialize the queue */\n// In Go, use list as a queue\nqueue := list.New()\n\n/* Enqueue elements */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* Access the first element */\npeek := queue.Front()\n\n/* Dequeue an element */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* Get the length of the queue */\nsize := queue.Len()\n\n/* Check if the queue is empty */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* Initialize the queue */\n// Swift does not have a built-in queue class, so Array can be used as a queue\nvar queue: [Int] = []\n\n/* Enqueue elements */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* Access the first element */\nlet peek = queue.first!\n\n/* Dequeue an element */\n// Since it's an array, removeFirst has a complexity of O(n)\nlet pool = queue.removeFirst()\n\n/* Get the length of the queue */\nlet size = queue.count\n\n/* Check if the queue is empty */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* Initialize the queue */\n// JavaScript does not have a built-in queue, so Array can be used as a queue\nconst queue = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
    queue.ts
    /* Initialize the queue */\n// TypeScript does not have a built-in queue, so Array can be used as a queue \nconst queue: number[] = [];\n\n/* Enqueue elements */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* Access the first element */\nconst peek = queue[0];\n\n/* Dequeue an element */\n// Since the underlying structure is an array, shift() method has a time complexity of O(n)\nconst pop = queue.shift();\n\n/* Get the length of the queue */\nconst size = queue.length;\n\n/* Check if the queue is empty */\nconst empty = queue.length === 0;\n
    queue.dart
    /* Initialize the queue */\n// In Dart, the Queue class is a double-ended queue but can be used as a queue\nQueue<int> queue = Queue();\n\n/* Enqueue elements */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* Access the first element */\nint peek = queue.first;\n\n/* Dequeue an element */\nint pop = queue.removeFirst();\n\n/* Get the length of the queue */\nint size = queue.length;\n\n/* Check if the queue is empty */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* Initialize the double-ended queue */\n// In Rust, use a double-ended queue as a regular queue\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* Enqueue elements */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* Access the first element */\nif let Some(front) = deque.front() {\n}\n\n/* Dequeue an element */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* Get the length of the queue */\nlet size = deque.len();\n\n/* Check if the queue is empty */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C does not provide a built-in queue\n
    queue.kt
    \n
    queue.zig
    \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/queue/#522-implementing-a-queue","title":"5.2.2 \u00a0 Implementing a queue","text":"

    To implement a queue, we need a data structure that allows adding elements at one end and removing them at the other. Both linked lists and arrays meet this requirement.

    "},{"location":"chapter_stack_and_queue/queue/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

    As shown in the Figure 5-5 , we can consider the \"head node\" and \"tail node\" of a linked list as the \"front\" and \"rear\" of the queue, respectively. It is stipulated that nodes can only be added at the rear and removed at the front.

    LinkedListQueuepush()pop()

    Figure 5-5 \u00a0 Implementing Queue with Linked List for Enqueue and Dequeue Operations

    Below is the code for implementing a queue using a linked list:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/queue/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

    Deleting the first element in an array has a time complexity of \\(O(n)\\), which would make the dequeue operation inefficient. However, this problem can be cleverly avoided as follows.

    We use a variable front to indicate the index of the front element and maintain a variable size to record the queue's length. Define rear = front + size, which points to the position immediately following the tail element.

    With this design, the effective interval of elements in the array is [front, rear - 1]. The implementation methods for various operations are shown in the Figure 5-6 .

    • Enqueue operation: Assign the input element to the rear index and increase size by 1.
    • Dequeue operation: Simply increase front by 1 and decrease size by 1.

    Both enqueue and dequeue operations only require a single operation, each with a time complexity of \\(O(1)\\).

    ArrayQueuepush()pop()

    Figure 5-6 \u00a0 Implementing Queue with Array for Enqueue and Dequeue Operations

    You might notice a problem: as enqueue and dequeue operations are continuously performed, both front and rear move to the right and will eventually reach the end of the array and can't move further. To resolve this, we can treat the array as a \"circular array\" where connecting the end of the array back to its beginning.

    In a circular array, front or rear needs to loop back to the start of the array upon reaching the end. This cyclical pattern can be achieved with a \"modulo operation\" as shown in the code below:

    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
    Code Visualization

    Full Screen >

    The above implementation of the queue still has its limitations: its length is fixed. However, this issue is not difficult to resolve. We can replace the array with a dynamic array that can expand itself if needed. Interested readers can try to implement this themselves.

    The comparison of the two implementations is consistent with that of the stack and is not repeated here.

    "},{"location":"chapter_stack_and_queue/queue/#523-typical-applications-of-queue","title":"5.2.3 \u00a0 Typical applications of queue","text":"
    • Amazon orders: After shoppers place orders, these orders join a queue, and the system processes them in order. During events like Singles' Day, a massive number of orders are generated in a short time, making high concurrency a key challenge for engineers.
    • Various to-do lists: Any scenario requiring a \"first-come, first-served\" functionality, such as a printer's task queue or a restaurant's food delivery queue, can effectively maintain the order of processing with a queue.
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 Stack","text":"

    A \"Stack\" is a linear data structure that follows the principle of Last-In-First-Out (LIFO).

    We can compare a stack to a pile of plates on a table. To access the bottom plate, one must first remove the plates on top. By replacing the plates with various types of elements (such as integers, characters, objects, etc.), we obtain the data structure known as a stack.

    As shown in the Figure 5-1 , we refer to the top of the pile of elements as the \"top of the stack\" and the bottom as the \"bottom of the stack.\" The operation of adding elements to the top of the stack is called \"push,\" and the operation of removing the top element is called \"pop.\"

    Figure 5-1 \u00a0 Stack's last-in-first-out rule

    "},{"location":"chapter_stack_and_queue/stack/#511-common-operations-on-stack","title":"5.1.1 \u00a0 Common operations on stack","text":"

    The common operations on a stack are shown in the Table 5-1 . The specific method names depend on the programming language used. Here, we use push(), pop(), and peek() as examples.

    Table 5-1 \u00a0 Efficiency of stack operations

    Method Description Time Complexity push() Push an element onto the stack (add to the top) \\(O(1)\\) pop() Pop the top element from the stack \\(O(1)\\) peek() Access the top element of the stack \\(O(1)\\)

    Typically, we can directly use the stack class built into the programming language. However, some languages may not specifically provide a stack class. In these cases, we can use the language's \"array\" or \"linked list\" as a stack and ignore operations that are not related to stack logic in the program.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinZig stack.py
    # Initialize the stack\n# Python does not have a built-in stack class, so a list can be used as a stack\nstack: list[int] = []\n\n# Push elements onto the stack\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# Access the top element of the stack\npeek: int = stack[-1]\n\n# Pop an element from the stack\npop: int = stack.pop()\n\n# Get the length of the stack\nsize: int = len(stack)\n\n# Check if the stack is empty\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* Initialize the stack */\nstack<int> stack;\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint top = stack.top();\n\n/* Pop an element from the stack */\nstack.pop(); // No return value\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nbool empty = stack.empty();\n
    stack.java
    /* Initialize the stack */\nStack<Integer> stack = new Stack<>();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nint peek = stack.peek();\n\n/* Pop an element from the stack */\nint pop = stack.pop();\n\n/* Get the length of the stack */\nint size = stack.size();\n\n/* Check if the stack is empty */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* Initialize the stack */\nStack<int> stack = new();\n\n/* Push elements onto the stack */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* Access the top element of the stack */\nint peek = stack.Peek();\n\n/* Pop an element from the stack */\nint pop = stack.Pop();\n\n/* Get the length of the stack */\nint size = stack.Count;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* Initialize the stack */\n// In Go, it is recommended to use a Slice as a stack\nvar stack []int\n\n/* Push elements onto the stack */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* Access the top element of the stack */\npeek := stack[len(stack)-1]\n\n/* Pop an element from the stack */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* Get the length of the stack */\nsize := len(stack)\n\n/* Check if the stack is empty */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* Initialize the stack */\n// Swift does not have a built-in stack class, so Array can be used as a stack\nvar stack: [Int] = []\n\n/* Push elements onto the stack */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* Access the top element of the stack */\nlet peek = stack.last!\n\n/* Pop an element from the stack */\nlet pop = stack.removeLast()\n\n/* Get the length of the stack */\nlet size = stack.count\n\n/* Check if the stack is empty */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* Initialize the stack */\n// JavaScript does not have a built-in stack class, so Array can be used as a stack\nconst stack = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length-1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* Initialize the stack */\n// TypeScript does not have a built-in stack class, so Array can be used as a stack\nconst stack: number[] = [];\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nconst peek = stack[stack.length - 1];\n\n/* Pop an element from the stack */\nconst pop = stack.pop();\n\n/* Get the length of the stack */\nconst size = stack.length;\n\n/* Check if the stack is empty */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* Initialize the stack */\n// Dart does not have a built-in stack class, so List can be used as a stack\nList<int> stack = [];\n\n/* Push elements onto the stack */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* Access the top element of the stack */\nint peek = stack.last;\n\n/* Pop an element from the stack */\nint pop = stack.removeLast();\n\n/* Get the length of the stack */\nint size = stack.length;\n\n/* Check if the stack is empty */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* Initialize the stack */\n// Use Vec as a stack\nlet mut stack: Vec<i32> = Vec::new();\n\n/* Push elements onto the stack */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* Access the top element of the stack */\nlet top = stack.last().unwrap();\n\n/* Pop an element from the stack */\nlet pop = stack.pop().unwrap();\n\n/* Get the length of the stack */\nlet size = stack.len();\n\n/* Check if the stack is empty */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C does not provide a built-in stack\n
    stack.kt
    \n
    stack.zig
    \n
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#512-implementing-a-stack","title":"5.1.2 \u00a0 Implementing a stack","text":"

    To gain a deeper understanding of how a stack operates, let's try implementing a stack class ourselves.

    A stack follows the principle of Last-In-First-Out, which means we can only add or remove elements at the top of the stack. However, both arrays and linked lists allow adding and removing elements at any position, therefore a stack can be seen as a restricted array or linked list. In other words, we can \"shield\" certain irrelevant operations of an array or linked list, aligning their external behavior with the characteristics of a stack.

    "},{"location":"chapter_stack_and_queue/stack/#1-implementation-based-on-a-linked-list","title":"1. \u00a0 Implementation based on a linked list","text":"

    When implementing a stack using a linked list, we can consider the head node of the list as the top of the stack and the tail node as the bottom of the stack.

    As shown in the Figure 5-2 , for the push operation, we simply insert elements at the head of the linked list. This method of node insertion is known as \"head insertion.\" For the pop operation, we just need to remove the head node from the list.

    LinkedListStackpush()pop()

    Figure 5-2 \u00a0 Implementing Stack with Linked List for Push and Pop Operations

    Below is an example code for implementing a stack based on a linked list:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#2-implementation-based-on-an-array","title":"2. \u00a0 Implementation based on an array","text":"

    When implementing a stack using an array, we can consider the end of the array as the top of the stack. As shown in the Figure 5-3 , push and pop operations correspond to adding and removing elements at the end of the array, respectively, both with a time complexity of \\(O(1)\\).

    ArrayStackpush()pop()

    Figure 5-3 \u00a0 Implementing Stack with Array for Push and Pop Operations

    Since the elements to be pushed onto the stack may continuously increase, we can use a dynamic array, thus avoiding the need to handle array expansion ourselves. Here is an example code:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_stack_and_queue/stack/#513-comparison-of-the-two-implementations","title":"5.1.3 \u00a0 Comparison of the two implementations","text":"

    Supported Operations

    Both implementations support all the operations defined in a stack. The array implementation additionally supports random access, but this is beyond the scope of a stack definition and is generally not used.

    Time Efficiency

    In the array-based implementation, both push and pop operations occur in pre-allocated contiguous memory, which has good cache locality and therefore higher efficiency. However, if the push operation exceeds the array capacity, it triggers a resizing mechanism, making the time complexity of that push operation \\(O(n)\\).

    In the linked list implementation, list expansion is very flexible, and there is no efficiency decrease issue as in array expansion. However, the push operation requires initializing a node object and modifying pointers, so its efficiency is relatively lower. If the elements being pushed are already node objects, then the initialization step can be skipped, improving efficiency.

    Thus, when the elements for push and pop operations are basic data types like int or double, we can draw the following conclusions:

    • The array-based stack implementation's efficiency decreases during expansion, but since expansion is a low-frequency operation, its average efficiency is higher.
    • The linked list-based stack implementation provides more stable efficiency performance.

    Space Efficiency

    When initializing a list, the system allocates an \"initial capacity,\" which might exceed the actual need; moreover, the expansion mechanism usually increases capacity by a specific factor (like doubling), which may also exceed the actual need. Therefore, the array-based stack might waste some space.

    However, since linked list nodes require extra space for storing pointers, the space occupied by linked list nodes is relatively larger.

    In summary, we cannot simply determine which implementation is more memory-efficient. It requires analysis based on specific circumstances.

    "},{"location":"chapter_stack_and_queue/stack/#514-typical-applications-of-stack","title":"5.1.4 \u00a0 Typical applications of stack","text":"
    • Back and forward in browsers, undo and redo in software. Every time we open a new webpage, the browser pushes the previous page onto the stack, allowing us to go back to the previous page through the back operation, which is essentially a pop operation. To support both back and forward, two stacks are needed to work together.
    • Memory management in programs. Each time a function is called, the system adds a stack frame at the top of the stack to record the function's context information. In recursive functions, the downward recursion phase keeps pushing onto the stack, while the upward backtracking phase keeps popping from the stack.
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 Summary","text":""},{"location":"chapter_stack_and_queue/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • Stack is a data structure that follows the Last-In-First-Out (LIFO) principle and can be implemented using arrays or linked lists.
    • In terms of time efficiency, the array implementation of the stack has a higher average efficiency. However, during expansion, the time complexity for a single push operation can degrade to \\(O(n)\\). In contrast, the linked list implementation of a stack offers more stable efficiency.
    • Regarding space efficiency, the array implementation of the stack may lead to a certain degree of space wastage. However, it's important to note that the memory space occupied by nodes in a linked list is generally larger than that for elements in an array.
    • A queue is a data structure that follows the First-In-First-Out (FIFO) principle, and it can also be implemented using arrays or linked lists. The conclusions regarding time and space efficiency for queues are similar to those for stacks.
    • A double-ended queue (deque) is a more flexible type of queue that allows adding and removing elements at both ends.
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: Is the browser's forward and backward functionality implemented with a doubly linked list?

    A browser's forward and backward navigation is essentially a manifestation of the \"stack\" concept. When a user visits a new page, the page is added to the top of the stack; when they click the back button, the page is popped from the top of the stack. A double-ended queue (deque) can conveniently implement some additional operations, as mentioned in the \"Double-Ended Queue\" section.

    Q: After popping from a stack, is it necessary to free the memory of the popped node?

    If the popped node will still be used later, it's not necessary to free its memory. In languages like Java and Python that have automatic garbage collection, manual memory release is not necessary; in C and C++, manual memory release is required.

    Q: A double-ended queue seems like two stacks joined together. What are its uses?

    A double-ended queue, which is a combination of a stack and a queue or two stacks joined together, exhibits both stack and queue logic. Thus, it can implement all applications of stacks and queues while offering more flexibility.

    Q: How exactly are undo and redo implemented?

    Undo and redo operations are implemented using two stacks: Stack A for undo and Stack B for redo.

    1. Each time a user performs an operation, it is pushed onto Stack A, and Stack B is cleared.
    2. When the user executes an \"undo\", the most recent operation is popped from Stack A and pushed onto Stack B.
    3. When the user executes a \"redo\", the most recent operation is popped from Stack B and pushed back onto Stack A.
    "},{"location":"chapter_tree/","title":"Chapter 7. \u00a0 Tree","text":"

    Abstract

    The towering tree, full of vitality with its roots deep and leaves lush, branches spreading wide.

    It vividly demonstrates the form of data divide-and-conquer.

    "},{"location":"chapter_tree/#chapter-contents","title":"Chapter contents","text":"
    • 7.1 \u00a0 Binary tree
    • 7.2 \u00a0 Binary tree Traversal
    • 7.3 \u00a0 Array Representation of tree
    • 7.4 \u00a0 Binary Search tree
    • 7.5 \u00a0 AVL tree *
    • 7.6 \u00a0 Summary
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 Array representation of binary trees","text":"

    Under the linked list representation, the storage unit of a binary tree is a node TreeNode, with nodes connected by pointers. The basic operations of binary trees under the linked list representation were introduced in the previous section.

    So, can we use an array to represent a binary tree? The answer is yes.

    "},{"location":"chapter_tree/array_representation_of_tree/#731-representing-perfect-binary-trees","title":"7.3.1 \u00a0 Representing perfect binary trees","text":"

    Let's analyze a simple case first. Given a perfect binary tree, we store all nodes in an array according to the order of level-order traversal, where each node corresponds to a unique array index.

    Based on the characteristics of level-order traversal, we can deduce a \"mapping formula\" between the index of a parent node and its children: If a node's index is \\(i\\), then the index of its left child is \\(2i + 1\\) and the right child is \\(2i + 2\\). The Figure 7-12 shows the mapping relationship between the indices of various nodes.

    Figure 7-12 \u00a0 Array representation of a perfect binary tree

    The mapping formula plays a role similar to the node references (pointers) in linked lists. Given any node in the array, we can access its left (right) child node using the mapping formula.

    "},{"location":"chapter_tree/array_representation_of_tree/#732-representing-any-binary-tree","title":"7.3.2 \u00a0 Representing any binary tree","text":"

    Perfect binary trees are a special case; there are often many None values in the middle levels of a binary tree. Since the sequence of level-order traversal does not include these None values, we cannot solely rely on this sequence to deduce the number and distribution of None values. This means that multiple binary tree structures can match the same level-order traversal sequence.

    As shown in the Figure 7-13 , given a non-perfect binary tree, the above method of array representation fails.

    Figure 7-13 \u00a0 Level-order traversal sequence corresponds to multiple binary tree possibilities

    To solve this problem, we can consider explicitly writing out all None values in the level-order traversal sequence. As shown in the following figure, after this treatment, the level-order traversal sequence can uniquely represent a binary tree. Example code is as follows:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # Array representation of a binary tree\n# Using None to represent empty slots\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* Array representation of a binary tree */\n// Using the maximum integer value INT_MAX to mark empty slots\nvector<int> tree = {1, 2, 3, 4, INT_MAX, 6, 7, 8, 9, INT_MAX, INT_MAX, 12, INT_MAX, INT_MAX, 15};\n
    /* Array representation of a binary tree */\n// Using the Integer wrapper class allows for using null to mark empty slots\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using an any type slice, allowing for nil to mark empty slots\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* Array representation of a binary tree */\n// Using optional Int (Int?) allows for using nil to mark empty slots\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nlet tree: (number | null)[] = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using nullable int (int?) allows for using null to mark empty slots\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* Array representation of a binary tree */\n// Using None to mark empty slots\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
    /* Array representation of a binary tree */\n// Using the maximum int value to mark empty slots, therefore, node values must not be 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
    /* Array representation of a binary tree */\n// Using null to represent empty slots\nval tree = mutableListOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    \n
    \n

    Figure 7-14 \u00a0 Array representation of any type of binary tree

    It's worth noting that complete binary trees are very suitable for array representation. Recalling the definition of a complete binary tree, None appears only at the bottom level and towards the right, meaning all None values definitely appear at the end of the level-order traversal sequence.

    This means that when using an array to represent a complete binary tree, it's possible to omit storing all None values, which is very convenient. The Figure 7-15 gives an example.

    Figure 7-15 \u00a0 Array representation of a complete binary tree

    The following code implements a binary tree based on array representation, including the following operations:

    • Given a node, obtain its value, left (right) child node, and parent node.
    • Obtain the preorder, inorder, postorder, and level-order traversal sequences.
    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:\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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/array_representation_of_tree/#733-advantages-and-limitations","title":"7.3.3 \u00a0 Advantages and limitations","text":"

    The array representation of binary trees has the following advantages:

    • Arrays are stored in contiguous memory spaces, which is cache-friendly and allows for faster access and traversal.
    • It does not require storing pointers, which saves space.
    • It allows random access to nodes.

    However, the array representation also has some limitations:

    • Array storage requires contiguous memory space, so it is not suitable for storing trees with a large amount of data.
    • Adding or deleting nodes requires array insertion and deletion operations, which are less efficient.
    • When there are many None values in the binary tree, the proportion of node data contained in the array is low, leading to lower space utilization.
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL tree *","text":"

    In the \"Binary Search Tree\" section, we mentioned that after multiple insertions and removals, a binary search tree might degrade to a linked list. In such cases, the time complexity of all operations degrades from \\(O(\\log n)\\) to \\(O(n)\\).

    As shown in the Figure 7-24 , after two node removal operations, this binary search tree will degrade into a linked list.

    Figure 7-24 \u00a0 Degradation of an AVL tree after removing nodes

    For example, in the perfect binary tree shown in the Figure 7-25 , after inserting two nodes, the tree will lean heavily to the left, and the time complexity of search operations will also degrade.

    Figure 7-25 \u00a0 Degradation of an AVL tree after inserting nodes

    In 1962, G. M. Adelson-Velsky and E. M. Landis proposed the \"AVL Tree\" in their paper \"An algorithm for the organization of information\". The paper detailed a series of operations to ensure that after continuously adding and removing nodes, the AVL tree would not degrade, thus maintaining the time complexity of various operations at \\(O(\\log n)\\) level. In other words, in scenarios where frequent additions, removals, searches, and modifications are needed, the AVL tree can always maintain efficient data operation performance, which has great application value.

    "},{"location":"chapter_tree/avl_tree/#751-common-terminology-in-avl-trees","title":"7.5.1 \u00a0 Common terminology in AVL trees","text":"

    An AVL tree is both a binary search tree and a balanced binary tree, satisfying all properties of these two types of binary trees, hence it is a \"balanced binary search tree\".

    "},{"location":"chapter_tree/avl_tree/#1-node-height","title":"1. \u00a0 Node height","text":"

    Since the operations related to AVL trees require obtaining node heights, we need to add a height variable to the node class:

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # Node value\n        self.height: int = 0                # Node height\n        self.left: TreeNode | None = None   # Left child reference\n        self.right: TreeNode | None = None  # Right child reference\n
    /* AVL tree node */\nstruct TreeNode {\n    int val{};          // Node value\n    int height = 0;     // Node height\n    TreeNode *left{};   // Left child\n    TreeNode *right{};  // Right child\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL tree node */\nclass TreeNode {\n    public int val;        // Node value\n    public int height;     // Node height\n    public TreeNode left;  // Left child\n    public TreeNode right; // Right child\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public int height;      // Node height\n    public TreeNode? left;  // Left child reference\n    public TreeNode? right; // Right child reference\n}\n
    /* AVL tree node */\ntype TreeNode struct {\n    Val    int       // Node value\n    Height int       // Node height\n    Left   *TreeNode // Left child reference\n    Right  *TreeNode // Right child reference\n}\n
    /* AVL tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var height: Int // Node height\n    var left: TreeNode? // Left child\n    var right: TreeNode? // Right child\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL tree node */\nclass TreeNode {\n    val; // Node value\n    height; // Node height\n    left; // Left child pointer\n    right; // Right child pointer\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 tree node */\nclass TreeNode {\n    val: number;            // Node value\n    height: number;         // Node height\n    left: TreeNode | null;  // Left child pointer\n    right: TreeNode | null; // Right child pointer\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 tree node */\nclass TreeNode {\n  int val;         // Node value\n  int height;      // Node height\n  TreeNode? left;  // Left child\n  TreeNode? right; // Right child\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    height: i32,                            // Node height\n    left: Option<Rc<RefCell<TreeNode>>>,    // Left child\n    right: Option<Rc<RefCell<TreeNode>>>,   // Right child\n}\n\nimpl TreeNode {\n    /* Constructor */\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 tree node */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* Constructor */\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 tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val height: Int = 0          // Node height\n    val left: TreeNode? = null   // Left child\n    val right: TreeNode? = null  // Right child\n}\n
    \n
    \n

    The \"node height\" refers to the distance from that node to its farthest leaf node, i.e., the number of \"edges\" passed. It is important to note that the height of a leaf node is \\(0\\), and the height of a null node is \\(-1\\). We will create two utility functions for getting and updating the height of a node:

    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-node-balance-factor","title":"2. \u00a0 Node balance factor","text":"

    The \"balance factor\" of a node is defined as the height of the node's left subtree minus the height of its right subtree, with the balance factor of a null node defined as \\(0\\). We will also encapsulate the functionality of obtaining the node balance factor into a function for easy use later on:

    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

    Note

    Let the balance factor be \\(f\\), then the balance factor of any node in an AVL tree satisfies \\(-1 \\le f \\le 1\\).

    "},{"location":"chapter_tree/avl_tree/#752-rotations-in-avl-trees","title":"7.5.2 \u00a0 Rotations in AVL trees","text":"

    The characteristic feature of an AVL tree is the \"rotation\" operation, which can restore balance to an unbalanced node without affecting the in-order traversal sequence of the binary tree. In other words, the rotation operation can maintain the property of a \"binary search tree\" while also turning the tree back into a \"balanced binary tree\".

    We call nodes with an absolute balance factor \\(> 1\\) \"unbalanced nodes\". Depending on the type of imbalance, there are four kinds of rotations: right rotation, left rotation, right-left rotation, and left-right rotation. Below, we detail these rotation operations.

    "},{"location":"chapter_tree/avl_tree/#1-right-rotation","title":"1. \u00a0 Right rotation","text":"

    As shown in the Figure 7-26 , the first unbalanced node from the bottom up in the binary tree is \"node 3\". Focusing on the subtree with this unbalanced node as the root, denoted as node, and its left child as child, perform a \"right rotation\". After the right rotation, the subtree is balanced again while still maintaining the properties of a binary search tree.

    <1><2><3><4>

    Figure 7-26 \u00a0 Steps of right rotation

    As shown in the Figure 7-27 , when the child node has a right child (denoted as grand_child), a step needs to be added in the right rotation: set grand_child as the left child of node.

    Figure 7-27 \u00a0 Right rotation with grand_child

    \"Right rotation\" is a figurative term; in practice, it is achieved by modifying node pointers, as shown in the following code:

    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-left-rotation","title":"2. \u00a0 Left rotation","text":"

    Correspondingly, if considering the \"mirror\" of the above unbalanced binary tree, the \"left rotation\" operation shown in the Figure 7-28 needs to be performed.

    Figure 7-28 \u00a0 Left rotation operation

    Similarly, as shown in the Figure 7-29 , when the child node has a left child (denoted as grand_child), a step needs to be added in the left rotation: set grand_child as the right child of node.

    Figure 7-29 \u00a0 Left rotation with grand_child

    It can be observed that the right and left rotation operations are logically symmetrical, and they solve two symmetrical types of imbalance. Based on symmetry, by replacing all left with right, and all right with left in the implementation code of right rotation, we can get the implementation code for left rotation:

    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-right-left-rotation","title":"3. \u00a0 Right-left rotation","text":"

    For the unbalanced node 3 shown in the Figure 7-30 , using either left or right rotation alone cannot restore balance to the subtree. In this case, a \"left rotation\" needs to be performed on child first, followed by a \"right rotation\" on node.

    Figure 7-30 \u00a0 Right-left rotation

    "},{"location":"chapter_tree/avl_tree/#4-left-right-rotation","title":"4. \u00a0 Left-right rotation","text":"

    As shown in the Figure 7-31 , for the mirror case of the above unbalanced binary tree, a \"right rotation\" needs to be performed on child first, followed by a \"left rotation\" on node.

    Figure 7-31 \u00a0 Left-right rotation

    "},{"location":"chapter_tree/avl_tree/#5-choice-of-rotation","title":"5. \u00a0 Choice of rotation","text":"

    The four kinds of imbalances shown in the Figure 7-32 correspond to the cases described above, respectively requiring right rotation, left-right rotation, right-left rotation, and left rotation.

    Figure 7-32 \u00a0 The four rotation cases of AVL tree

    As shown in the Table 7-3 , we determine which of the above cases an unbalanced node belongs to by judging the sign of the balance factor of the unbalanced node and its higher-side child's balance factor.

    Table 7-3 \u00a0 Conditions for Choosing Among the Four Rotation Cases

    Balance factor of unbalanced node Balance factor of child node Rotation method to use \\(> 1\\) (Left-leaning tree) \\(\\geq 0\\) Right rotation \\(> 1\\) (Left-leaning tree) \\(<0\\) Left rotation then right rotation \\(< -1\\) (Right-leaning tree) \\(\\leq 0\\) Left rotation \\(< -1\\) (Right-leaning tree) \\(>0\\) Right rotation then left rotation

    For convenience, we encapsulate the rotation operations into a function. With this function, we can perform rotations on various kinds of imbalances, restoring balance to unbalanced nodes. The code is as follows:

    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-common-operations-in-avl-trees","title":"7.5.3 \u00a0 Common operations in AVL trees","text":""},{"location":"chapter_tree/avl_tree/#1-node-insertion","title":"1. \u00a0 Node insertion","text":"

    The node insertion operation in AVL trees is similar to that in binary search trees. The only difference is that after inserting a node in an AVL tree, a series of unbalanced nodes may appear along the path from that node to the root node. Therefore, we need to start from this node and perform rotation operations upwards to restore balance to all unbalanced nodes. The code is as follows:

    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-node-removal","title":"2. \u00a0 Node removal","text":"

    Similarly, based on the method of removing nodes in binary search trees, rotation operations need to be performed from the bottom up to restore balance to all unbalanced nodes. The code is as follows:

    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-node-search","title":"3. \u00a0 Node search","text":"

    The node search operation in AVL trees is consistent with that in binary search trees and will not be detailed here.

    "},{"location":"chapter_tree/avl_tree/#754-typical-applications-of-avl-trees","title":"7.5.4 \u00a0 Typical applications of AVL trees","text":"
    • Organizing and storing large amounts of data, suitable for scenarios with high-frequency searches and low-frequency intertions and removals.
    • Used to build index systems in databases.
    • Red-black trees are also a common type of balanced binary search tree. Compared to AVL trees, red-black trees have more relaxed balancing conditions, require fewer rotations for node insertion and removal, and have a higher average efficiency for node addition and removal operations.
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 Binary search tree","text":"

    As shown in the Figure 7-16 , a \"binary search tree\" satisfies the following conditions.

    1. For the root node, the value of all nodes in the left subtree < the value of the root node < the value of all nodes in the right subtree.
    2. The left and right subtrees of any node are also binary search trees, i.e., they satisfy condition 1. as well.

    Figure 7-16 \u00a0 Binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#741-operations-on-a-binary-search-tree","title":"7.4.1 \u00a0 Operations on a binary search tree","text":"

    We encapsulate the binary search tree as a class BinarySearchTree and declare a member variable root, pointing to the tree's root node.

    "},{"location":"chapter_tree/binary_search_tree/#1-searching-for-a-node","title":"1. \u00a0 Searching for a node","text":"

    Given a target node value num, one can search according to the properties of the binary search tree. As shown in the Figure 7-17 , we declare a node cur and start from the binary tree's root node root, looping to compare the size relationship between the node value cur.val and num.

    • If cur.val < num, it means the target node is in cur's right subtree, thus execute cur = cur.right.
    • If cur.val > num, it means the target node is in cur's left subtree, thus execute cur = cur.left.
    • If cur.val = num, it means the target node is found, exit the loop and return the node.
    <1><2><3><4>

    Figure 7-17 \u00a0 Example of searching for a node in a binary search tree

    The search operation in a binary search tree works on the same principle as the binary search algorithm, eliminating half of the possibilities in each round. The number of loops is at most the height of the binary tree. When the binary tree is balanced, it uses \\(O(\\log n)\\) time. Example code is as follows:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_search_tree/#2-inserting-a-node","title":"2. \u00a0 Inserting a node","text":"

    Given an element num to be inserted, to maintain the property of the binary search tree \"left subtree < root node < right subtree,\" the insertion operation proceeds as shown in the Figure 7-18 .

    1. Finding the insertion position: Similar to the search operation, start from the root node and loop downwards according to the size relationship between the current node value and num until passing through the leaf node (traversing to None) then exit the loop.
    2. Insert the node at that position: Initialize the node num and place it where None was.

    Figure 7-18 \u00a0 Inserting a node into a binary search tree

    In the code implementation, note the following two points.

    • The binary search tree does not allow duplicate nodes; otherwise, it will violate its definition. Therefore, if the node to be inserted already exists in the tree, the insertion is not performed, and it directly returns.
    • To perform the insertion operation, we need to use the node pre to save the node from the last loop. This way, when traversing to None, we can get its parent node, thus completing the node insertion operation.
    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
    Code Visualization

    Full Screen >

    Similar to searching for a node, inserting a node uses \\(O(\\log n)\\) time.

    "},{"location":"chapter_tree/binary_search_tree/#3-removing-a-node","title":"3. \u00a0 Removing a node","text":"

    First, find the target node in the binary tree, then remove it. Similar to inserting a node, we need to ensure that after the removal operation is completed, the property of the binary search tree \"left subtree < root node < right subtree\" is still satisfied. Therefore, based on the number of child nodes of the target node, we divide it into 0, 1, and 2 cases, performing the corresponding node removal operations.

    As shown in the Figure 7-19 , when the degree of the node to be removed is \\(0\\), it means the node is a leaf node, and it can be directly removed.

    Figure 7-19 \u00a0 Removing a node in a binary search tree (degree 0)

    As shown in the Figure 7-20 , when the degree of the node to be removed is \\(1\\), replacing the node to be removed with its child node is sufficient.

    Figure 7-20 \u00a0 Removing a node in a binary search tree (degree 1)

    When the degree of the node to be removed is \\(2\\), we cannot remove it directly, but need to use a node to replace it. To maintain the property of the binary search tree \"left subtree < root node < right subtree,\" this node can be either the smallest node of the right subtree or the largest node of the left subtree.

    Assuming we choose the smallest node of the right subtree (the next node in in-order traversal), then the removal operation proceeds as shown in the Figure 7-21 .

    1. Find the next node in the \"in-order traversal sequence\" of the node to be removed, denoted as tmp.
    2. Replace the value of the node to be removed with tmp's value, and recursively remove the node tmp in the tree.
    <1><2><3><4>

    Figure 7-21 \u00a0 Removing a node in a binary search tree (degree 2)

    The operation of removing a node also uses \\(O(\\log n)\\) time, where finding the node to be removed requires \\(O(\\log n)\\) time, and obtaining the in-order traversal successor node requires \\(O(\\log n)\\) time. Example code is as follows:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_search_tree/#4-in-order-traversal-is-ordered","title":"4. \u00a0 In-order traversal is ordered","text":"

    As shown in the Figure 7-22 , the in-order traversal of a binary tree follows the \"left \\(\\rightarrow\\) root \\(\\rightarrow\\) right\" traversal order, and a binary search tree satisfies the size relationship \"left child node < root node < right child node\".

    This means that in-order traversal in a binary search tree always traverses the next smallest node first, thus deriving an important property: The in-order traversal sequence of a binary search tree is ascending.

    Using the ascending property of in-order traversal, obtaining ordered data in a binary search tree requires only \\(O(n)\\) time, without the need for additional sorting operations, which is very efficient.

    Figure 7-22 \u00a0 In-order traversal sequence of a binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#742-efficiency-of-binary-search-trees","title":"7.4.2 \u00a0 Efficiency of binary search trees","text":"

    Given a set of data, we consider using an array or a binary search tree for storage. Observing the Table 7-2 , the operations on a binary search tree all have logarithmic time complexity, which is stable and efficient. Only in scenarios of high-frequency addition and low-frequency search and removal, arrays are more efficient than binary search trees.

    Table 7-2 \u00a0 Efficiency comparison between arrays and search trees

    Unsorted array Binary search tree Search element \\(O(n)\\) \\(O(\\log n)\\) Insert element \\(O(1)\\) \\(O(\\log n)\\) Remove element \\(O(n)\\) \\(O(\\log n)\\)

    In ideal conditions, the binary search tree is \"balanced,\" thus any node can be found within \\(\\log n\\) loops.

    However, continuously inserting and removing nodes in a binary search tree may lead to the binary tree degenerating into a chain list as shown in the Figure 7-23 , at which point the time complexity of various operations also degrades to \\(O(n)\\).

    Figure 7-23 \u00a0 Degradation of a binary search tree

    "},{"location":"chapter_tree/binary_search_tree/#743-common-applications-of-binary-search-trees","title":"7.4.3 \u00a0 Common applications of binary search trees","text":"
    • Used as multi-level indexes in systems to implement efficient search, insertion, and removal operations.
    • Serves as the underlying data structure for certain search algorithms.
    • Used to store data streams to maintain their ordered state.
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 Binary tree","text":"

    A \"binary tree\" is a non-linear data structure that represents the ancestral and descendent relationships, embodying the \"divide and conquer\" logic. Similar to a linked list, the basic unit of a binary tree is a node, each containing a value, a reference to the left child node, and a reference to the right child node.

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"Binary tree node\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # Node value\n        self.left: TreeNode | None = None  # Reference to left child node\n        self.right: TreeNode | None = None # Reference to right child node\n
    /* Binary tree node */\nstruct TreeNode {\n    int val;          // Node value\n    TreeNode *left;   // Pointer to left child node\n    TreeNode *right;  // Pointer to right child node\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* Binary tree node */\nclass TreeNode {\n    int val;         // Node value\n    TreeNode left;   // Reference to left child node\n    TreeNode right;  // Reference to right child node\n    TreeNode(int x) { val = x; }\n}\n
    /* Binary tree node */\nclass TreeNode(int? x) {\n    public int? val = x;    // Node value\n    public TreeNode? left;  // Reference to left child node\n    public TreeNode? right; // Reference to right child node\n}\n
    /* Binary tree node */\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, // Pointer to left child node\n        Right: nil, // Pointer to right child node\n        Val:   v,   // Node value\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n    var val: Int // Node value\n    var left: TreeNode? // Reference to left child node\n    var right: TreeNode? // Reference to right child node\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n    val; // Node value\n    left; // Pointer to left child node\n    right; // Pointer to right child node\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
    /* Binary tree node */\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; // Node value\n        this.left = left === undefined ? null : left; // Reference to left child node\n        this.right = right === undefined ? null : right; // Reference to right child node\n    }\n}\n
    /* Binary tree node */\nclass TreeNode {\n  int val;         // Node value\n  TreeNode? left;  // Reference to left child node\n  TreeNode? right; // Reference to right child node\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* Binary tree node */\nstruct TreeNode {\n    val: i32,                               // Node value\n    left: Option<Rc<RefCell<TreeNode>>>,    // Reference to left child node\n    right: Option<Rc<RefCell<TreeNode>>>,   // Reference to right child node\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
    /* Binary tree node */\ntypedef struct TreeNode {\n    int val;                // Node value\n    int height;             // \u8282\u70b9\u9ad8\u5ea6\n    struct TreeNode *left;  // Pointer to left child node\n    struct TreeNode *right; // Pointer to right child node\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
    /* Binary tree node */\nclass TreeNode(val _val: Int) {  // Node value\n    val left: TreeNode? = null   // Reference to left child node\n    val right: TreeNode? = null  // Reference to right child node\n}\n
    \n
    \n

    Each node has two references (pointers), pointing to the \"left-child node\" and \"right-child node,\" respectively. This node is called the \"parent node\" of these two child nodes. When given a node of a binary tree, we call the tree formed by this node's left child and all nodes under it the \"left subtree\" of this node. Similarly, the \"right subtree\" can be defined.

    In a binary tree, except for leaf nodes, all other nodes contain child nodes and non-empty subtrees. As shown in the Figure 7-1 , if \"Node 2\" is considered as the parent node, then its left and right child nodes are \"Node 4\" and \"Node 5,\" respectively. The left subtree is \"the tree formed by Node 4 and all nodes under it,\" and the right subtree is \"the tree formed by Node 5 and all nodes under it.\"

    Figure 7-1 \u00a0 Parent Node, child Node, subtree

    "},{"location":"chapter_tree/binary_tree/#711-common-terminology-of-binary-trees","title":"7.1.1 \u00a0 Common terminology of binary trees","text":"

    The commonly used terminology of binary trees is shown in the following figure.

    • \"Root node\": The node at the top level of the binary tree, which has no parent node.
    • \"Leaf node\": A node with no children, both of its pointers point to None.
    • \"Edge\": The line segment connecting two nodes, i.e., node reference (pointer).
    • The \"level\" of a node: Incrementing from top to bottom, with the root node's level being 1.
    • The \"degree\" of a node: The number of a node's children. In a binary tree, the degree can be 0, 1, or 2.
    • The \"height\" of a binary tree: The number of edges passed from the root node to the farthest leaf node.
    • The \"depth\" of a node: The number of edges passed from the root node to the node.
    • The \"height\" of a node: The number of edges from the farthest leaf node to the node.

    Figure 7-2 \u00a0 Common Terminology of Binary Trees

    Tip

    Please note that we usually define \"height\" and \"depth\" as \"the number of edges passed,\" but some problems or textbooks may define them as \"the number of nodes passed.\" In this case, both height and depth need to be incremented by 1.

    "},{"location":"chapter_tree/binary_tree/#712-basic-operations-of-binary-trees","title":"7.1.2 \u00a0 Basic operations of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-initializing-a-binary-tree","title":"1. \u00a0 Initializing a binary tree","text":"

    Similar to a linked list, initialize nodes first, then construct references (pointers).

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # Initializing a binary tree\n# Initializing nodes\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* Initializing a binary tree */\n// Initializing nodes\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* Initializing a binary tree */\n// Initializing nodes\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// Linking references (pointers) between nodes\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* Initializing a binary tree */\n// Initializing nodes\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// Linking references (pointers) between nodes\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // Initializing nodes\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// Linking references (pointers) between nodes\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
    /* Initializing a binary tree */\n// Initializing nodes\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// Linking references (pointers) between nodes\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // Initializing nodes\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// Linking references (pointers) between nodes\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    Code visualization

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5&cumulative=false&curInstr=3&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    "},{"location":"chapter_tree/binary_tree/#2-inserting-and-removing-nodes","title":"2. \u00a0 Inserting and removing nodes","text":"

    Similar to a linked list, inserting and removing nodes in a binary tree can be achieved by modifying pointers. The Figure 7-3 provides an example.

    Figure 7-3 \u00a0 Inserting and removing nodes in a binary tree

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # Inserting and removing nodes\np = TreeNode(0)\n# Inserting node P between n1 -> n2\nn1.left = p\np.left = n2\n# Removing node P\nn1.left = n2\n
    binary_tree.cpp
    /* Inserting and removing nodes */\nTreeNode* P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.cs
    /* Inserting and removing nodes */\nTreeNode P = new(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.go
    /* Inserting and removing nodes */\n// Inserting node P between n1 and n2\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// Removing node P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
    binary_tree.js
    /* Inserting and removing nodes */\nlet P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.ts
    /* Inserting and removing nodes */\nconst P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.dart
    /* Inserting and removing nodes */\nTreeNode P = new TreeNode(0);\n// Inserting node P between n1 and n2\nn1.left = P;\nP.left = n2;\n// Removing node P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// Inserting node P between n1 and n2\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// Removing node P\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* Inserting and removing nodes */\nTreeNode *P = newTreeNode(0);\n// Inserting node P between n1 and n2\nn1->left = P;\nP->left = n2;\n// Removing node P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// Inserting node P between n1 and n2\nn1.left = P\nP.left = n2\n// Removing node P\nn1.left = n2\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    Code visualization

    https://pythontutor.com/render.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%E4%BA%8C%E5%8F%89%E6%A0%91%E8%8A%82%E7%82%B9%E7%B1%BB%22%22%22%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%8A%82%E7%82%B9%E5%80%BC%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%E5%B7%A6%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%23%20%E5%8F%B3%E5%AD%90%E8%8A%82%E7%82%B9%E5%BC%95%E7%94%A8%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BA%8C%E5%8F%89%E6%A0%91%0A%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%8A%82%E7%82%B9%0A%20%20%20%20n1%20%3D%20TreeNode%28val%3D1%29%0A%20%20%20%20n2%20%3D%20TreeNode%28val%3D2%29%0A%20%20%20%20n3%20%3D%20TreeNode%28val%3D3%29%0A%20%20%20%20n4%20%3D%20TreeNode%28val%3D4%29%0A%20%20%20%20n5%20%3D%20TreeNode%28val%3D5%29%0A%20%20%20%20%23%20%E6%9E%84%E5%BB%BA%E8%8A%82%E7%82%B9%E4%B9%8B%E9%97%B4%E7%9A%84%E5%BC%95%E7%94%A8%EF%BC%88%E6%8C%87%E9%92%88%EF%BC%89%0A%20%20%20%20n1.left%20%3D%20n2%0A%20%20%20%20n1.right%20%3D%20n3%0A%20%20%20%20n2.left%20%3D%20n4%0A%20%20%20%20n2.right%20%3D%20n5%0A%0A%20%20%20%20%23%20%E6%8F%92%E5%85%A5%E4%B8%8E%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%0A%20%20%20%20p%20%3D%20TreeNode%280%29%0A%20%20%20%20%23%20%E5%9C%A8%20n1%20-%3E%20n2%20%E4%B8%AD%E9%97%B4%E6%8F%92%E5%85%A5%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20p%0A%20%20%20%20p.left%20%3D%20n2%0A%20%20%20%20%23%20%E5%88%A0%E9%99%A4%E8%8A%82%E7%82%B9%20P%0A%20%20%20%20n1.left%20%3D%20n2&cumulative=false&curInstr=37&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

    Note

    It's important to note that inserting nodes may change the original logical structure of the binary tree, while removing nodes usually means removing the node and all its subtrees. Therefore, in a binary tree, insertion and removal are usually performed through a set of operations to achieve meaningful actions.

    "},{"location":"chapter_tree/binary_tree/#713-common-types-of-binary-trees","title":"7.1.3 \u00a0 Common types of binary trees","text":""},{"location":"chapter_tree/binary_tree/#1-perfect-binary-tree","title":"1. \u00a0 Perfect binary tree","text":"

    As shown in the Figure 7-4 , in a \"perfect binary tree,\" all levels of nodes are fully filled. In a perfect binary tree, the degree of leaf nodes is \\(0\\), and the degree of all other nodes is \\(2\\); if the tree's height is \\(h\\), then the total number of nodes is \\(2^{h+1} - 1\\), showing a standard exponential relationship, reflecting the common phenomenon of cell division in nature.

    Tip

    Please note that in the Chinese community, a perfect binary tree is often referred to as a \"full binary tree.\"

    Figure 7-4 \u00a0 Perfect binary tree

    "},{"location":"chapter_tree/binary_tree/#2-complete-binary-tree","title":"2. \u00a0 Complete binary tree","text":"

    As shown in the Figure 7-5 , a \"complete binary tree\" has only the bottom level nodes not fully filled, and the bottom level nodes are filled as far left as possible.

    Figure 7-5 \u00a0 Complete binary tree

    "},{"location":"chapter_tree/binary_tree/#3-full-binary-tree","title":"3. \u00a0 Full binary tree","text":"

    As shown in the Figure 7-6 , a \"full binary tree\" has all nodes except leaf nodes having two children.

    Figure 7-6 \u00a0 Full binary tree

    "},{"location":"chapter_tree/binary_tree/#4-balanced-binary-tree","title":"4. \u00a0 Balanced binary tree","text":"

    As shown in the Figure 7-7 , in a \"balanced binary tree,\" the absolute difference in height between the left and right subtrees of any node does not exceed 1.

    Figure 7-7 \u00a0 Balanced binary tree

    "},{"location":"chapter_tree/binary_tree/#714-degeneration-of-binary-trees","title":"7.1.4 \u00a0 Degeneration of binary trees","text":"

    The Figure 7-8 shows the ideal and degenerate structures of binary trees. When every level of a binary tree is filled, it reaches the \"perfect binary tree\"; when all nodes are biased towards one side, the binary tree degenerates into a \"linked list\".

    • The perfect binary tree is the ideal situation, fully leveraging the \"divide and conquer\" advantage of binary trees.
    • A linked list is another extreme, where operations become linear, degrading the time complexity to \\(O(n)\\).

    Figure 7-8 \u00a0 The Best and Worst Structures of Binary Trees

    As shown in the Table 7-1 , in the best and worst structures, the number of leaf nodes, total number of nodes, and height of the binary tree reach their maximum or minimum values.

    Table 7-1 \u00a0 The Best and Worst Structures of Binary Trees

    Perfect binary tree Linked list Number of nodes at level \\(i\\) \\(2^{i-1}\\) \\(1\\) Number of leaf nodes in a tree with height \\(h\\) \\(2^h\\) \\(1\\) Total number of nodes in a tree with height \\(h\\) \\(2^{h+1} - 1\\) \\(h + 1\\) Height of a tree with \\(n\\) total nodes \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 Binary tree traversal","text":"

    From the perspective of physical structure, a tree is a data structure based on linked lists, hence its traversal method involves accessing nodes one by one through pointers. However, a tree is a non-linear data structure, which makes traversing a tree more complex than traversing a linked list, requiring the assistance of search algorithms to achieve.

    Common traversal methods for binary trees include level-order traversal, preorder traversal, inorder traversal, and postorder traversal, among others.

    "},{"location":"chapter_tree/binary_tree_traversal/#721-level-order-traversal","title":"7.2.1 \u00a0 Level-order traversal","text":"

    As shown in the Figure 7-9 , \"level-order traversal\" traverses the binary tree from top to bottom, layer by layer, and accesses nodes in each layer in a left-to-right order.

    Level-order traversal essentially belongs to \"breadth-first traversal\", also known as \"breadth-first search (BFS)\", which embodies a \"circumferentially outward expanding\" layer-by-layer traversal method.

    Figure 7-9 \u00a0 Level-order traversal of a binary tree

    "},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation","title":"1. \u00a0 Code implementation","text":"

    Breadth-first traversal is usually implemented with the help of a \"queue\". The queue follows the \"first in, first out\" rule, while breadth-first traversal follows the \"layer-by-layer progression\" rule, the underlying ideas of the two are consistent. The implementation code is as follows:

    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
    Code Visualization

    Full Screen >

    "},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis","title":"2. \u00a0 Complexity analysis","text":"
    • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time, where \\(n\\) is the number of nodes.
    • Space complexity is \\(O(n)\\): In the worst case, i.e., a full binary tree, before traversing to the lowest level, the queue can contain at most \\((n + 1) / 2\\) nodes at the same time, occupying \\(O(n)\\) space.
    "},{"location":"chapter_tree/binary_tree_traversal/#722-preorder-inorder-and-postorder-traversal","title":"7.2.2 \u00a0 Preorder, inorder, and postorder traversal","text":"

    Correspondingly, preorder, inorder, and postorder traversal all belong to \"depth-first traversal\", also known as \"depth-first search (DFS)\", which embodies a \"proceed to the end first, then backtrack and continue\" traversal method.

    The Figure 7-10 shows the working principle of performing a depth-first traversal on a binary tree. Depth-first traversal is like walking around the perimeter of the entire binary tree, encountering three positions at each node, corresponding to preorder traversal, inorder traversal, and postorder traversal.

    Figure 7-10 \u00a0 Preorder, inorder, and postorder traversal of a binary search tree

    "},{"location":"chapter_tree/binary_tree_traversal/#1-code-implementation_1","title":"1. \u00a0 Code implementation","text":"

    Depth-first search is usually implemented based on recursion:

    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
    [class]{}-[func]{pre_order}\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
    Code Visualization

    Full Screen >

    Tip

    Depth-first search can also be implemented based on iteration, interested readers can study this on their own.

    The Figure 7-11 shows the recursive process of preorder traversal of a binary tree, which can be divided into two opposite parts: \"recursion\" and \"return\".

    1. \"Recursion\" means starting a new method, the program accesses the next node in this process.
    2. \"Return\" means the function returns, indicating the current node has been fully accessed.
    <1><2><3><4><5><6><7><8><9><10><11>

    Figure 7-11 \u00a0 The recursive process of preorder traversal

    "},{"location":"chapter_tree/binary_tree_traversal/#2-complexity-analysis_1","title":"2. \u00a0 Complexity analysis","text":"
    • Time complexity is \\(O(n)\\): All nodes are visited once, using \\(O(n)\\) time.
    • Space complexity is \\(O(n)\\): In the worst case, i.e., the tree degrades into a linked list, the recursion depth reaches \\(n\\), the system occupies \\(O(n)\\) stack frame space.
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 Summary","text":""},{"location":"chapter_tree/summary/#1-key-review","title":"1. \u00a0 Key review","text":"
    • A binary tree is a non-linear data structure that reflects the \"divide and conquer\" logic of splitting one into two. Each binary tree node contains a value and two pointers, which point to its left and right child nodes, respectively.
    • For a node in a binary tree, the tree formed by its left (right) child node and all nodes under it is called the node's left (right) subtree.
    • Related terminology of binary trees includes root node, leaf node, level, degree, edge, height, and depth, among others.
    • The operations of initializing a binary tree, inserting nodes, and removing nodes are similar to those of linked list operations.
    • Common types of binary trees include perfect binary trees, complete binary trees, full binary trees, and balanced binary trees. The perfect binary tree represents the ideal state, while the linked list is the worst state after degradation.
    • A binary tree can be represented using an array by arranging the node values and empty slots in a level-order traversal sequence and implementing pointers based on the index mapping relationship between parent nodes and child nodes.
    • The level-order traversal of a binary tree is a breadth-first search method, which reflects a layer-by-layer traversal manner of \"expanding circle by circle.\" It is usually implemented using a queue.
    • Pre-order, in-order, and post-order traversals are all depth-first search methods, reflecting the traversal manner of \"going to the end first, then backtracking to continue.\" They are usually implemented using recursion.
    • A binary search tree is an efficient data structure for element searching, with the time complexity of search, insert, and remove operations all being \\(O(\\log n)\\). When a binary search tree degrades into a linked list, these time complexities deteriorate to \\(O(n)\\).
    • An AVL tree, also known as a balanced binary search tree, ensures that the tree remains balanced after continuous node insertions and removals through rotation operations.
    • Rotation operations in an AVL tree include right rotation, left rotation, right-then-left rotation, and left-then-right rotation. After inserting or removing nodes, an AVL tree performs rotation operations from bottom to top to rebalance the tree.
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q: For a binary tree with only one node, are both the height of the tree and the depth of the root node \\(0\\)?

    Yes, because height and depth are typically defined as \"the number of edges passed.\"

    Q: The insertion and removal in a binary tree are generally completed by a set of operations. What does \"a set of operations\" refer to here? Can it be understood as the release of resources of the child nodes?

    Taking the binary search tree as an example, the operation of removing a node needs to be handled in three different scenarios, each requiring multiple steps of node operations.

    Q: Why are there three sequences: pre-order, in-order, and post-order for DFS traversal of a binary tree, and what are their uses?

    Similar to sequential and reverse traversal of arrays, pre-order, in-order, and post-order traversals are three methods of traversing a binary tree, allowing us to obtain a traversal result in a specific order. For example, in a binary search tree, since the node sizes satisfy left child node value < root node value < right child node value, we can obtain an ordered node sequence by traversing the tree in the \"left \u2192 root \u2192 right\" priority.

    Q: In a right rotation operation that deals with the relationship between the imbalance nodes node, child, grand_child, isn't the connection between node and its parent node and the original link of node lost after the right rotation?

    We need to view this problem from a recursive perspective. The right_rotate(root) operation passes the root node of the subtree and eventually returns the root node of the rotated subtree with return child. The connection between the subtree's root node and its parent node is established after this function returns, which is outside the scope of the right rotation operation's maintenance.

    Q: In C++, functions are divided into private and public sections. What considerations are there for this? Why are the height() function and the updateHeight() function placed in public and private, respectively?

    It depends on the scope of the method's use. If a method is only used within the class, then it is designed to be private. For example, it makes no sense for users to call updateHeight() on their own, as it is just a step in the insertion or removal operations. However, height() is for accessing node height, similar to vector.size(), thus it is set to public for use.

    Q: How do you build a binary search tree from a set of input data? Is the choice of root node very important?

    Yes, the method for building the tree is provided in the build_tree() method in the binary search tree code. As for the choice of the root node, we usually sort the input data and then select the middle element as the root node, recursively building the left and right subtrees. This approach maximizes the balance of the tree.

    Q: In Java, do you always have to use the equals() method for string comparison?

    In Java, for primitive data types, == is used to compare whether the values of two variables are equal. For reference types, the working principles of the two symbols are different.

    • ==: Used to compare whether two variables point to the same object, i.e., whether their positions in memory are the same.
    • equals(): Used to compare whether the values of two objects are equal.

    Therefore, to compare values, we should use equals(). However, strings initialized with String a = \"hi\"; String b = \"hi\"; are stored in the string constant pool and point to the same object, so a == b can also be used to compare the contents of two strings.

    Q: Before reaching the bottom level, is the number of nodes in the queue \\(2^h\\) in breadth-first traversal?

    Yes, for example, a full binary tree with height \\(h = 2\\) has a total of \\(n = 7\\) nodes, then the bottom level has \\(4 = 2^h = (n + 1) / 2\\) nodes.

    "}]} \ No newline at end of file diff --git a/en/sitemap.xml b/en/sitemap.xml index 980cf6780..5ed9ad881 100644 --- a/en/sitemap.xml +++ b/en/sitemap.xml @@ -2,277 +2,277 @@ https://www.hello-algo.com/en/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/array/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/linked_list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/ram_and_cache/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_array_and_linkedlist/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/iteration_and_recursion/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/performance_evaluation/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/space_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_computational_complexity/time_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/basic_data_types/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/character_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/classification_of_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/number_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_data_structure/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_graph/graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_graph/graph_operations/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_graph/graph_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_graph/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hashing/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hashing/hash_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hashing/hash_collision/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hashing/hash_map/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hashing/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_heap/build_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_heap/heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_heap/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_heap/top_k/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_hello_algo/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_introduction/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_introduction/algorithms_are_everywhere/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_introduction/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_introduction/what_is_dsa/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_preface/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_preface/about_the_book/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_preface/suggestions/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_preface/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_stack_and_queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_stack_and_queue/deque/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_stack_and_queue/queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_stack_and_queue/stack/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_stack_and_queue/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/array_representation_of_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/avl_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/binary_search_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/binary_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/binary_tree_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/en/chapter_tree/summary/ - 2024-04-15 + 2024-04-19 daily \ No newline at end of file diff --git a/en/sitemap.xml.gz b/en/sitemap.xml.gz index 4478393faf5023147bbac7daba01503372bd6389..06d43cb109de125b6b021cfbadcad6e96dc6902d 100644 GIT binary patch delta 601 zcmV-f0;c`m1l|OHABzYG8CW7_0{?SqbY*Q}a4vXlYyjPvv2xom3_$mMg-^RJCzqk= zIm*^AXlEWw!4l6DDFdJ#|9vUSaqY27&!`rO5X5^R34nw)AD@F?9Ff??@LoNy*3|-o zjjapad-dz*kL9=Oqj}mS@{F>`%7NdjUS#}U*Qe8I#ZGX4fRR^`x|(gD8(d$6^?LPI zHBXCtO&!cn<=XgYo2eJRbkn2vaS6VQD;tLzL%pddo!d`;Vz_3uVk_eU2Zh@Vhg>oK|mEmVGft_A_?c22( zkV)9>oShRx-05CUAq`u-lc6MVb_8Ru15z8RiQ{EMkH(s)gJUaJCxC4t?Fku^$80pb$W87<@=G1k_ zDo$^IkX5)H3)p@6ZE;ALP#bQG2Yt{gN4m7tLF;frAw(67^IvDe9OM{-Tua+}3^;l{ nuv-`M;x&vwwpWL(kylT>wUGa_@K$aNjMDrDBU464StkGhbciNc literal 606 zcmV-k0-^mMiwFq2i5+GF|8r?{Wo=<_E_iKh0Nt6vZrd;nK=1vEAos*+(E;0#xVL@5 zb{1%vv4zNzLsCie_mkx`YmU1N;e4@0)54=9k`ldrdmsGbgv2g}-ST<8SuQZx*t*c| zmcM@fSbbf-)lb_*o>3NAIq+`Ti;Ul^>U=)0*$ECX@;XvivF&q%tE;futiLVmr$xS| z4(6wFZGE)$)C*s`>CyYR0^h~8jYEZ@+E$a!=TCrTh;99{d3jxJURTdwvdUHVNzL{U zI@}W;>lU29Y^zU_nWehH{5@9gY!oB|L~t<>TH{?fVCx-=O6DR|Nj^UswIi<rA_UiyJh}Lkj|ig_4y-sEoD&c6JuZWkgnnpTz`rdhxMu*JeN_VYhd7 zP7HCcdpU(PGmH3YQ47IT#Q?7ZT8W?az`cSX_JKLw&7?q1 z`au=7jXs}D6&xP!sHY;I5?(DHhYE&tVr-K0tsY!8pqkdH#L*lcpESQIS>e%1T@Z?G z-ia$n19z;ql*C7yT3eC|PvW79G`I`>Gp2a8%Tp@~V1^k|wG z4_c@>bse&b)7u|p6>i4@_E3IX91|wghTGy%AGFGmE^T$tI-F1lQ3d1t*O@Q}ImRHj s(zYH0PF@de<3e7%h7rj2>aaEP>Z!LD@_!cI%8gO#-x_7JnOP?Q0PC76l>h($ diff --git a/search/search_index.json b/search/search_index.json index 1dcb41335..158f1d421 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"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. \u5728 VS Code \u7684\u63d2\u4ef6\u5e02\u573a\u4e2d\u641c\u7d22 javascript \uff0c\u5b89\u88c5 JavaScript (ES6) code snippets \u3002
    3. \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-dart","title":"8. \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/#9-rust","title":"9. \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 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: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\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 Vec<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 Vec<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: Vec<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\u51fa\u5148\u8fdb\u540e\u51fa\u7684\u7279\u6027\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\u51fa\u5148\u8fdb\u5148\u51fa\u7684\u7279\u6027\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

    Note

    \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.clone());\n        pre_order(res, node.borrow().right.clone());\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
    [class]{}-[func]{pre_order}\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.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\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
    [class]{}-[func]{pre_order}\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.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\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
    [class]{}-[func]{pre_order}\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
    \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.get(state.len() - 1).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: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.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.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<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 {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\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.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
    [class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\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    }\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\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\u8868\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\u8868 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            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 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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\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\u8868\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\u901f\u5ea6\u7684\u5feb\u6162\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\u3002\u6bd4\u5982\u5728\u67d0\u53f0\u8ba1\u7b97\u673a\u4e2d\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u53f0\u914d\u7f6e\u4e0d\u540c\u7684\u8ba1\u7b97\u673a\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6d4b\u8bd5\u7ed3\u679c\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\u4e24\u4e2a\u65b9\u9762\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\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5f88\u96be\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    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\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":"

    Note

    \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

    A\uff1a\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 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\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) / 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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\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\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.remove(src.len() - 1);\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
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\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
    [class]{}-[func]{min_cost_climbing_stairs_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{min_cost_climbing_stairs_dp_comp}\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
    [class]{}-[func]{climbing_stairs_constraint_dp}\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
    [class]{}-[func]{min_path_sum_dfs}\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
    [class]{}-[func]{min_path_sum_dfs_mem}\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
    [class]{}-[func]{min_path_sum_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{min_path_sum_dp_comp}\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
    [class]{}-[func]{edit_distance_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{edit_distance_dp_comp}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\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
    [class]{}-[func]{climbing_stairs_dp}\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
    [class]{}-[func]{climbing_stairs_dp_comp}\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
    [class]{}-[func]{knapsack_dfs}\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
    [class]{}-[func]{knapsack_dfs_mem}\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
    [class]{}-[func]{knapsack_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{knapsack_dp_comp}\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
    [class]{}-[func]{unbounded_knapsack_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{unbounded_knapsack_dp_comp}\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
    [class]{}-[func]{coin_change_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{coin_change_dp_comp}\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
    [class]{}-[func]{coin_change_ii_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{coin_change_ii_dp_comp}\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
    [class]{GraphAdjMat}-[func]{}\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
    [class]{GraphAdjList}-[func]{}\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\u8868 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{graph_bfs}\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\u8868 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\u8868 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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\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\u8868 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
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\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
    [class]{}-[func]{coin_change_greedy}\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
    [class]{}-[func]{max_capacity}\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
    [class]{}-[func]{max_product_cutting}\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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
    [class]{MaxHeap}-[func]{__init__}\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
    \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\u53d6\u9006\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
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\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
    [class]{MaxHeap}-[func]{peek}\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
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\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.remove(self.size() - 1);\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
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\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\u961f\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
    [class]{}-[func]{top_k_heap}\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/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\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\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
    • \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\u6210\u672c\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\u4e5f\u8bb8\u53ef\u4ee5\u8d81\u6b64\u673a\u4f1a\u7ec3\u4e60 Python\uff09\u3002
    • \u5168\u5f69\u5370\u5237\u867d\u7136\u5927\u5e45\u63d0\u5347\u4e86\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; i < 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                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\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
    [class]{}-[func]{bubble_sort}\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                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 {\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
    [class]{}-[func]{bubble_sort_with_flag}\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 &mut num in &mut *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 = (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 &mut buckets {\n        for &mut num in bucket {\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
    [class]{}-[func]{bucket_sort}\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.into_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 {\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
    [class]{}-[func]{counting_sort_naive}\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.into_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 {\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 as usize {\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    for i in 0..n {\n        nums[i] = res[i];\n    }\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
    [class]{}-[func]{counting_sort}\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)\\) \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        let 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 */\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 - 1).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() - 1).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        let 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        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
    [class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\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) / 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) / 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) / 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) / 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) / 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) / 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) / 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) ~/ 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) / 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) / 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) / 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
    [class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\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) / 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
    [class]{QuickSort}-[func]{partition}\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
    [class]{QuickSort}-[func]{quick_sort}\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) / 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
    [class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\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
    [class]{QuickSortTailCall}-[func]{quick_sort}\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    for i in 0..n {\n        nums[i] = res[i];\n    }\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
    [class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\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)\\)\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
    [class]{}-[func]{selection_sort}\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\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeque.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deque[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deque.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deque.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deque) == 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
    \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:\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
    [class]{ArrayBinaryTree}-[func]{}\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
    \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
    [class]{AVLTree}-[func]{height}\n\n[class]{AVLTree}-[func]{update_height}\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
    [class]{AVLTree}-[func]{balance_factor}\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

    Note

    \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
    [class]{AVLTree}-[func]{right_rotate}\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
    [class]{AVLTree}-[func]{left_rotate}\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
    [class]{AVLTree}-[func]{rotate}\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
    [class]{AVLTree}-[func]{insert}\n\n[class]{AVLTree}-[func]{insert_helper}\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
    [class]{AVLTree}-[func]{remove}\n\n[class]{AVLTree}-[func]{remove_helper}\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
    [class]{BinarySearchTree}-[func]{search}\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
    [class]{BinarySearchTree}-[func]{insert}\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
    [class]{BinarySearchTree}-[func]{remove}\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
    \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
    \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
    \n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Note

    \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
    [class]{}-[func]{level_order}\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
    [class]{}-[func]{pre_order}\n\n[class]{}-[func]{in_order}\n\n[class]{}-[func]{post_order}\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 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: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\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 Vec<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 Vec<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: Vec<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\u51fa\u5148\u8fdb\u540e\u51fa\u7684\u7279\u6027\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\u51fa\u5148\u8fdb\u5148\u51fa\u7684\u7279\u6027\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

    Note

    \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.clone());\n        pre_order(res, node.borrow().right.clone());\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
    [class]{}-[func]{pre_order}\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.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\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
    [class]{}-[func]{pre_order}\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.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\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
    [class]{}-[func]{pre_order}\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
    \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.get(state.len() - 1).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: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.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.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u7b97\u6cd5\uff1a\u4f8b\u9898\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<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 {\n        // \u526a\u679d\uff1a\u68c0\u67e5\u9009\u62e9\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5c1d\u8bd5\uff1a\u505a\u51fa\u9009\u62e9\uff0c\u66f4\u65b0\u72b6\u6001\n            make_choice(state, choice.clone());\n            // \u8fdb\u884c\u4e0b\u4e00\u8f6e\u9009\u62e9\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\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.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
    [class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\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    }\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\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\u8868\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\u8868 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            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 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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\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\u8868\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\u901f\u5ea6\u7684\u5feb\u6162\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\u3002\u6bd4\u5982\u5728\u67d0\u53f0\u8ba1\u7b97\u673a\u4e2d\uff0c\u7b97\u6cd5 A \u7684\u8fd0\u884c\u65f6\u95f4\u6bd4\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u53f0\u914d\u7f6e\u4e0d\u540c\u7684\u8ba1\u7b97\u673a\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6d4b\u8bd5\u7ed3\u679c\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\u4e24\u4e2a\u65b9\u9762\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\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u6211\u4eec\u5f88\u96be\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    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\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":"

    Note

    \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

    A\uff1a\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 \\(n = 4\\) \u4e3a\u4f8b\uff0c\u5176\u53ef\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) / 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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\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\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.remove(src.len() - 1);\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
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\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
    [class]{}-[func]{min_cost_climbing_stairs_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{min_cost_climbing_stairs_dp_comp}\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
    [class]{}-[func]{climbing_stairs_constraint_dp}\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
    [class]{}-[func]{min_path_sum_dfs}\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
    [class]{}-[func]{min_path_sum_dfs_mem}\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
    [class]{}-[func]{min_path_sum_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{min_path_sum_dp_comp}\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
    [class]{}-[func]{edit_distance_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{edit_distance_dp_comp}\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\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
    [class]{}-[func]{climbing_stairs_dp}\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
    [class]{}-[func]{climbing_stairs_dp_comp}\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
    [class]{}-[func]{knapsack_dfs}\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
    [class]{}-[func]{knapsack_dfs_mem}\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
    [class]{}-[func]{knapsack_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{knapsack_dp_comp}\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
    [class]{}-[func]{unbounded_knapsack_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{unbounded_knapsack_dp_comp}\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
    [class]{}-[func]{coin_change_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{coin_change_dp_comp}\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
    [class]{}-[func]{coin_change_ii_dp}\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\u72b6\u6001\u538b\u7f29\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\u72b6\u6001\u538b\u7f29\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
    [class]{}-[func]{coin_change_ii_dp_comp}\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
    [class]{GraphAdjMat}-[func]{}\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
    [class]{GraphAdjList}-[func]{}\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\u8868 visited \u6765\u8bb0\u5f55\u54ea\u4e9b\u8282\u70b9\u5df2\u88ab\u8bbf\u95ee\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{graph_bfs}\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\u8868 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\u8868 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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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\u8868\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\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\u8868 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
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\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
    [class]{}-[func]{coin_change_greedy}\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
    [class]{}-[func]{max_capacity}\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
    [class]{}-[func]{max_product_cutting}\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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
    [class]{MaxHeap}-[func]{__init__}\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
    \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\u53d6\u9006\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
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\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
    [class]{MaxHeap}-[func]{peek}\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
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\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.remove(self.size() - 1);\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
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\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\u961f\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
    [class]{}-[func]{top_k_heap}\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/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\u8ba1\u7b97\u673a\u4e2d\u7ec4\u7ec7\u548c\u5b58\u50a8\u6570\u636e\u7684\u65b9\u5f0f\uff0c\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; i < 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                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\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
    [class]{}-[func]{bubble_sort}\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                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 {\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
    [class]{}-[func]{bubble_sort_with_flag}\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 &mut num in &mut *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 = (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 &mut buckets {\n        for &mut num in bucket {\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
    [class]{}-[func]{bucket_sort}\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.into_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 {\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
    [class]{}-[func]{counting_sort_naive}\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.into_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 {\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 as usize {\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    for i in 0..n {\n        nums[i] = res[i];\n    }\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
    [class]{}-[func]{counting_sort}\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)\\) \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        let 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 */\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 - 1).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() - 1).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        let 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        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
    [class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\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) / 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) / 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) / 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) / 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) / 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) / 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) / 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) ~/ 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) / 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) / 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) / 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
    [class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\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) / 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
    [class]{QuickSort}-[func]{partition}\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
    [class]{QuickSort}-[func]{quick_sort}\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) / 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
    [class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\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
    [class]{QuickSortTailCall}-[func]{quick_sort}\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    for i in 0..n {\n        nums[i] = res[i];\n    }\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
    [class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\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)\\)\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
    [class]{}-[func]{selection_sort}\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\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u961f\ndeque.append(2)      # \u6dfb\u52a0\u81f3\u961f\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u6dfb\u52a0\u81f3\u961f\u9996\ndeque.appendleft(1)\n\n# \u8bbf\u95ee\u5143\u7d20\nfront: int = deque[0]  # \u961f\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u961f\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u961f\npop_front: int = deque.popleft()  # \u961f\u9996\u5143\u7d20\u51fa\u961f\npop_rear: int = deque.pop()       # \u961f\u5c3e\u5143\u7d20\u51fa\u961f\n\n# \u83b7\u53d6\u53cc\u5411\u961f\u5217\u7684\u957f\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65ad\u53cc\u5411\u961f\u5217\u662f\u5426\u4e3a\u7a7a\nis_empty: bool = len(deque) == 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
    \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:\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
    \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

    Note

    \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
    \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
    \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
    \n
    binary_tree.zig
    \n
    \u53ef\u89c6\u5316\u8fd0\u884c

    \u5168\u5c4f\u89c2\u770b >

    Note

    \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
    [class]{}-[func]{pre_order}\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 b/sitemap.xml index f83ac6f6b..16417ee1a 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,532 +2,532 @@ https://www.hello-algo.com/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_appendix/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_appendix/contribution/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_appendix/installation/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_appendix/terminology/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/array/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/linked_list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/ram_and_cache/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_array_and_linkedlist/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/backtracking_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/n_queens_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/permutations_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/subset_sum_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_backtracking/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/iteration_and_recursion/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/performance_evaluation/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/space_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_computational_complexity/time_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/basic_data_types/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/character_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/classification_of_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/number_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_data_structure/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/binary_search_recur/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/build_binary_tree_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/divide_and_conquer/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/hanota_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_divide_and_conquer/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/dp_problem_features/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/dp_solution_pipeline/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/edit_distance_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/intro_to_dynamic_programming/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_dynamic_programming/unbounded_knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_graph/graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_graph/graph_operations/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_graph/graph_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_graph/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/fractional_knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/greedy_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/max_capacity_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/max_product_cutting_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_greedy/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hashing/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hashing/hash_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hashing/hash_collision/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hashing/hash_map/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hashing/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_heap/build_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_heap/heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_heap/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_heap/top_k/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_hello_algo/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_introduction/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_introduction/algorithms_are_everywhere/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_introduction/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_introduction/what_is_dsa/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_paperbook/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_preface/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_preface/about_the_book/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_preface/suggestions/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_preface/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_reference/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/binary_search/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/binary_search_edge/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/binary_search_insertion/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/replace_linear_by_hashing/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/searching_algorithm_revisited/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_searching/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/bubble_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/bucket_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/counting_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/heap_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/insertion_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/merge_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/quick_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/radix_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/selection_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/sorting_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_sorting/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_stack_and_queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_stack_and_queue/deque/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_stack_and_queue/queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_stack_and_queue/stack/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_stack_and_queue/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/array_representation_of_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/avl_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/binary_search_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/binary_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/binary_tree_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/chapter_tree/summary/ - 2024-04-15 + 2024-04-19 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 96dec3d903a67d645b0e68ded2ef743bcf7baf19..0f8803bebe24e1cffa6432efada852d06f965cab 100644 GIT binary patch delta 156 zcmV;N0Av632lEGiABzYG2UsFz0{?SqbY*Q}a4vXlYyjPx%aYqF5Qg`8iYf2Mo}{u! zQXXfQCrH**3)&K81el92Zy%5}_PA=!;%rXwA1^F{Dfw&YZkh&de_lrObm9=Tv#+bq z>zCCNTj`Xx{p;$_?_bZ~RzG*2wmF!{>8Uif@pUz%5XbL%ijnVQPohLh zRvzcJPmr8ZHI%!NX~2B=N_7`1-|RYg(I+n<-wJe@d1?d
  4. - + - 8.   Dart 環境 + 8.   TypeScript 環境
  5. - + - 9.   Rust 環境 + 9.   Dart 環境 + + + +
  6. + +
  7. + + + 10.   Rust 環境 @@ -3714,18 +3723,27 @@
  8. - + - 8.   Dart 環境 + 8.   TypeScript 環境
  9. - + - 9.   Rust 環境 + 9.   Dart 環境 + + + +
  10. + +
  11. + + + 10.   Rust 環境 @@ -3819,16 +3837,21 @@

7.   JavaScript 環境

    -
  1. 下載並安裝 node.js
  2. -
  3. 在 VS Code 的擴充功能市場中搜索 javascript ,安裝 JavaScript (ES6) code snippets 。
  4. +
  5. 下載並安裝 Node.js
  6. (可選)在 VS Code 的擴充功能市場中搜索 Prettier ,安裝程式碼格式化工具。
-

8.   Dart 環境

+

8.   TypeScript 環境

+
    +
  1. 同 JavaScript 環境安裝步驟。
  2. +
  3. 安裝 TypeScript Execute (tsx)
  4. +
  5. 在 VS Code 的擴充功能市場中搜索 typescript ,安裝 Pretty TypeScript Errors
  6. +
+

9.   Dart 環境

  1. 下載並安裝 Dart
  2. 在 VS Code 的擴充功能市場中搜索 dart ,安裝 Dart
-

9.   Rust 環境

+

10.   Rust 環境

  1. 下載並安裝 Rust
  2. 在 VS Code 的擴充功能市場中搜索 rust ,安裝 rust-analyzer
  3. diff --git a/zh-hant/search/search_index.json b/zh-hant/search/search_index.json index 6871f2a73..853a11b88 100644 --- a/zh-hant/search/search_index.json +++ b/zh-hant/search/search_index.json @@ -1 +1 @@ -{"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\u9304","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd
    • 16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c
    • 16.3 \u00a0 \u8853\u8a9e\u8868
    "},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c","text":"

    \u7531\u65bc\u7b46\u8005\u80fd\u529b\u6709\u9650\uff0c\u66f8\u4e2d\u96e3\u514d\u5b58\u5728\u4e00\u4e9b\u907a\u6f0f\u548c\u932f\u8aa4\uff0c\u8acb\u60a8\u8ad2\u89e3\u3002\u5982\u679c\u60a8\u767c\u73fe\u4e86\u7b46\u8aa4\u3001\u9023\u7d50\u5931\u6548\u3001\u5167\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u7fa9\u3001\u89e3\u91cb\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7d50\u69cb\u4e0d\u5408\u7406\u7b49\u554f\u984c\uff0c\u8acb\u5354\u52a9\u6211\u5011\u9032\u884c\u4fee\u6b63\uff0c\u4ee5\u7d66\u8b80\u8005\u63d0\u4f9b\u66f4\u512a\u8cea\u7684\u5b78\u7fd2\u8cc7\u6e90\u3002

    \u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c07\u5728\u672c\u66f8\u5009\u5eab\u3001\u7db2\u9801\u7248\u548c PDF \u7248\u7684\u4e3b\u9801\u4e0a\u9032\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8b1d\u4ed6\u5011\u5c0d\u958b\u6e90\u793e\u7fa4\u7684\u7121\u79c1\u5949\u737b\u3002

    \u958b\u6e90\u7684\u9b45\u529b

    \u7d19\u8cea\u5716\u66f8\u7684\u5169\u6b21\u5370\u5237\u7684\u9593\u9694\u6642\u9593\u5f80\u5f80\u8f03\u4e45\uff0c\u5167\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

    \u800c\u5728\u672c\u958b\u6e90\u66f8\u4e2d\uff0c\u5167\u5bb9\u66f4\u8fed\u7684\u6642\u9593\u88ab\u7e2e\u77ed\u81f3\u6578\u65e5\u751a\u81f3\u5e7e\u500b\u5c0f\u6642\u3002

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

    \u5982\u5716 16-3 \u6240\u793a\uff0c\u6bcf\u500b\u9801\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7de8\u8f2f\u5716\u793a\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9a5f\u4fee\u6539\u6587\u5b57\u6216\u7a0b\u5f0f\u78bc\u3002

    1. \u9ede\u9078\u201c\u7de8\u8f2f\u5716\u793a\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u5009\u5eab\u201d\u7684\u63d0\u793a\uff0c\u8acb\u540c\u610f\u8a72\u64cd\u4f5c\u3002
    2. \u4fee\u6539 Markdown \u6e90\u6a94\u6848\u5167\u5bb9\uff0c\u6aa2\u67e5\u5167\u5bb9\u7684\u6b63\u78ba\u6027\uff0c\u4e26\u5118\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7d71\u4e00\u3002
    3. \u5728\u9801\u9762\u5e95\u90e8\u586b\u5beb\u4fee\u6539\u8aaa\u660e\uff0c\u7136\u5f8c\u9ede\u9078\u201cPropose file change\u201d\u6309\u9215\u3002\u9801\u9762\u8df3\u8f49\u5f8c\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002

    \u5716 16-3 \u00a0 \u9801\u9762\u7de8\u8f2f\u6309\u9375

    \u5716\u7247\u7121\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u900f\u904e\u65b0\u5efa Issue \u6216\u8a55\u8ad6\u7559\u8a00\u4f86\u63cf\u8ff0\u554f\u984c\uff0c\u6211\u5011\u6703\u76e1\u5feb\u91cd\u65b0\u7e6a\u88fd\u4e26\u66ff\u63db\u5716\u7247\u3002

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

    \u5982\u679c\u60a8\u6709\u8208\u8da3\u53c3\u8207\u6b64\u958b\u6e90\u5c08\u6848\uff0c\u5305\u62ec\u5c07\u7a0b\u5f0f\u78bc\u7ffb\u8b6f\u6210\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u3001\u64f4\u5c55\u6587\u7ae0\u5167\u5bb9\u7b49\uff0c\u90a3\u9ebc\u9700\u8981\u5be6\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

    1. \u767b\u5165 GitHub \uff0c\u5c07\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5009\u5eab Fork \u5230\u500b\u4eba\u5e33\u865f\u4e0b\u3002
    2. \u9032\u5165\u60a8\u7684 Fork \u5009\u5eab\u7db2\u9801\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c07\u5009\u5eab\u514b\u9686\u81f3\u672c\u5730\u3002
    3. \u5728\u672c\u5730\u9032\u884c\u5167\u5bb9\u5275\u4f5c\uff0c\u4e26\u9032\u884c\u5b8c\u6574\u6e2c\u8a66\uff0c\u9a57\u8b49\u7a0b\u5f0f\u78bc\u7684\u6b63\u78ba\u6027\u3002
    4. \u5c07\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u5f8c Push \u81f3\u9060\u7aef\u5009\u5eab\u3002
    5. \u91cd\u65b0\u6574\u7406\u5009\u5eab\u7db2\u9801\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002
    "},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

    \u5728 hello-algo \u6839\u76ee\u9304\u4e0b\uff0c\u57f7\u884c\u4ee5\u4e0b Docker \u6307\u4ee4\u78bc\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8a2a\u554f\u672c\u5c08\u6848\uff1a

    docker-compose up -d\n

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

    docker-compose down\n
    "},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88dd IDE","text":"

    \u63a8\u85a6\u4f7f\u7528\u958b\u6e90\u3001\u8f15\u91cf\u7684 VS Code \u4f5c\u70ba\u672c\u5730\u6574\u5408\u958b\u767c\u74b0\u5883\uff08IDE\uff09\u3002\u8a2a\u554f VS Code \u5b98\u7db2\uff0c\u6839\u64da\u4f5c\u696d\u7cfb\u7d71\u9078\u64c7\u76f8\u61c9\u7248\u672c\u7684 VS Code \u9032\u884c\u4e0b\u8f09\u548c\u5b89\u88dd\u3002

    \u5716 16-1 \u00a0 \u5f9e\u5b98\u7db2\u4e0b\u8f09 VS Code

    VS Code \u64c1\u6709\u5f37\u5927\u7684\u64f4\u5c55\u5305\u751f\u614b\u7cfb\u7d71\uff0c\u652f\u6301\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u7684\u57f7\u884c\u548c\u9664\u932f\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5b89\u88dd\u201cPython Extension Pack\u201d\u64f4\u5c55\u5305\u4e4b\u5f8c\uff0c\u5373\u53ef\u9032\u884c Python \u7a0b\u5f0f\u78bc\u9664\u932f\u3002\u5b89\u88dd\u6b65\u9a5f\u5982\u5716 16-2 \u6240\u793a\u3002

    \u5716 16-2 \u00a0 \u5b89\u88dd VS Code \u64f4\u5c55\u5305

    "},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88dd\u8a9e\u8a00\u74b0\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88dd Python Extension Pack \u3002
    3. \uff08\u53ef\u9078\uff09\u5728\u547d\u4ee4\u5217\u8f38\u5165 pip install black \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u74b0\u5883","text":"
    1. Windows \u7cfb\u7d71\u9700\u8981\u5b89\u88dd MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e36 Clang \uff0c\u7121\u9808\u5b89\u88dd\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88dd C/C++ Extension Pack \u3002
    3. \uff08\u53ef\u9078\uff09\u958b\u555f Settings \u9801\u9762\uff0c\u641c\u5c0b Clang_format_fallback Style \u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u9078\u9805\uff0c\u8a2d\u5b9a\u70ba { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
    "},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd OpenJDK\uff08\u7248\u672c\u9700\u6eff\u8db3 > JDK 9\uff09\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88dd Extension Pack for Java \u3002
    "},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd .Net 8.0 \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88dd C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
    3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88dd\u6559\u7a0b\uff09\u3002
    "},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd go \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88dd Go \u3002
    3. \u6309\u5feb\u6377\u9375 Ctrl + Shift + P \u64a5\u51fa\u547d\u4ee4\u6b04\uff0c\u8f38\u5165 go \uff0c\u9078\u64c7 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9078\u4e26\u5b89\u88dd\u5373\u53ef\u3002
    "},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Swift \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88dd Swift for Visual Studio Code \u3002
    "},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd node.js \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 javascript \uff0c\u5b89\u88dd JavaScript (ES6) code snippets \u3002
    3. \uff08\u53ef\u9078\uff09\u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#8-dart","title":"8. \u00a0 Dart \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Dart \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88dd Dart \u3002
    "},{"location":"chapter_appendix/installation/#9-rust","title":"9. \u00a0 Rust \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Rust \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88dd rust-analyzer \u3002
    "},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u8853\u8a9e\u8868","text":"

    \u8868 16-1 \u5217\u51fa\u4e86\u66f8\u4e2d\u51fa\u73fe\u7684\u91cd\u8981\u8853\u8a9e\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u5e7e\u9ede\u3002

    • \u5efa\u8b70\u8a18\u4f4f\u540d\u8a5e\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u95b1\u8b80\u82f1\u6587\u6587\u737b\u3002
    • \u90e8\u5206\u540d\u8a5e\u5728\u7c21\u9ad4\u4e2d\u6587\u548c\u7e41\u9ad4\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

    \u8868 16-1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8a5e

    English \u7c21\u9ad4\u4e2d\u6587 \u7e41\u9ad4\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 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 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217","text":"

    Abstract

    \u8cc7\u6599\u7d50\u69cb\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5be6\u7684\u78da\u7246\u3002

    \u9663\u5217\u7684\u78da\u584a\u6574\u9f4a\u6392\u5217\uff0c\u9010\u500b\u7dca\u8cbc\u3002\u93c8\u7d50\u4e32\u5217\u7684\u78da\u584a\u5206\u6563\u5404\u8655\uff0c\u9023\u7dda\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u65bc\u78da\u7e2b\u4e4b\u9593\u3002

    "},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 4.1 \u00a0 \u9663\u5217
    • 4.2 \u00a0 \u93c8\u7d50\u4e32\u5217
    • 4.3 \u00a0 \u4e32\u5217
    • 4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *
    • 4.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u9663\u5217","text":"

    \u9663\u5217\uff08array\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5c07\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\u3002\u6211\u5011\u5c07\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u4f4d\u7f6e\u7a31\u70ba\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u5716 4-1 \u5c55\u793a\u4e86\u9663\u5217\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5132\u5b58\u65b9\u5f0f\u3002

    \u5716 4-1 \u00a0 \u9663\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

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

    \u6211\u5011\u53ef\u4ee5\u6839\u64da\u9700\u6c42\u9078\u7528\u9663\u5217\u7684\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u7121\u521d\u59cb\u503c\u3001\u7d66\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u6cc1\u4e0b\uff0c\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u6703\u5c07\u9663\u5217\u5143\u7d20\u521d\u59cb\u5316\u70ba \\(0\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    # \u521d\u59cb\u5316\u9663\u5217\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
    array.cpp
    /* \u521d\u59cb\u5316\u9663\u5217 */\n// \u5132\u5b58\u5728\u5806\u758a\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff08\u9700\u8981\u624b\u52d5\u91cb\u653e\u7a7a\u9593\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[5]int\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08[]int\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Go \u7684\u9663\u5217\u88ab\u8a2d\u8a08\u70ba\u5728\u7de8\u8b6f\u671f\u78ba\u5b9a\u9577\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u6578\u4f86\u6307\u5b9a\u9577\u5ea6\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u9663\u5217\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* \u521d\u59cb\u5316\u9663\u5217 */\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\u9663\u5217 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* \u521d\u59cb\u5316\u9663\u5217 */\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\u9663\u5217 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    /* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
    array.rb
    # \u521d\u59cb\u5316\u9663\u5217\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
    array.zig
    // \u521d\u59cb\u5316\u9663\u5217\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u9663\u5217\u5143\u7d20\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u9019\u610f\u5473\u8457\u8a08\u7b97\u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7d66\u5b9a\u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09\u548c\u67d0\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5716 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8a08\u7b97\u5f97\u5230\u8a72\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u76f4\u63a5\u8a2a\u554f\u8a72\u5143\u7d20\u3002

    \u5716 4-2 \u00a0 \u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a08\u7b97

    \u89c0\u5bdf\u5716 4-2 \uff0c\u6211\u5011\u767c\u73fe\u9663\u5217\u9996\u500b\u5143\u7d20\u7684\u7d22\u5f15\u70ba \\(0\\) \uff0c\u9019\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\u6703\u66f4\u81ea\u7136\u3002\u4f46\u5f9e\u4f4d\u5740\u8a08\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8cea\u4e0a\u662f\u8a18\u61b6\u9ad4\u4f4d\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u500b\u5143\u7d20\u7684\u4f4d\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u70ba \\(0\\) \u662f\u5408\u7406\u7684\u3002

    \u5728\u9663\u5217\u4e2d\u8a2a\u554f\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u96a8\u6a5f\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u5143\u7d20\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u9663\u5217\u5143\u7d20\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u201c\u7dca\u6328\u8457\u7684\u201d\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u7a7a\u9593\u518d\u5b58\u653e\u4efb\u4f55\u8cc7\u6599\u3002\u5982\u5716 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u9663\u5217\u4e2d\u9593\u63d2\u5165\u4e00\u500b\u5143\u7d20\uff0c\u5247\u9700\u8981\u5c07\u8a72\u5143\u7d20\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u4e4b\u5f8c\u518d\u628a\u5143\u7d20\u8ce6\u503c\u7d66\u8a72\u7d22\u5f15\u3002

    \u5716 4-3 \u00a0 \u9663\u5217\u63d2\u5165\u5143\u7d20\u793a\u4f8b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u6703\u5c0e\u81f4\u9663\u5217\u5c3e\u90e8\u5143\u7d20\u201c\u4e1f\u5931\u201d\u3002\u6211\u5011\u5c07\u9019\u500b\u554f\u984c\u7684\u89e3\u6c7a\u65b9\u6848\u7559\u5728\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u4e2d\u8a0e\u8ad6\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u540c\u7406\uff0c\u5982\u5716 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u522a\u9664\u7d22\u5f15 \\(i\\) \u8655\u7684\u5143\u7d20\uff0c\u5247\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\u3002

    \u5716 4-4 \u00a0 \u9663\u5217\u522a\u9664\u5143\u7d20\u793a\u4f8b

    \u8acb\u6ce8\u610f\uff0c\u522a\u9664\u5143\u7d20\u5b8c\u6210\u5f8c\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u8b8a\u5f97\u201c\u7121\u610f\u7fa9\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u5011\u7121\u9808\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u7684\u4f86\u770b\uff0c\u9663\u5217\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u9ede\u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u9ad8\uff1a\u9663\u5217\u7684\u63d2\u5165\u548c\u522a\u9664\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u9577\u5ea6\u3002
    • \u4e1f\u5931\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u5f8c\uff0c\u8d85\u51fa\u9663\u5217\u9577\u5ea6\u7bc4\u570d\u7684\u5143\u7d20\u6703\u4e1f\u5931\u3002
    • \u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff1a\u6211\u5011\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u500b\u6bd4\u8f03\u9577\u7684\u9663\u5217\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u9019\u6a23\u5728\u63d2\u5165\u8cc7\u6599\u6642\uff0c\u4e1f\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u7121\u610f\u7fa9\u201d\u7684\uff0c\u4f46\u9019\u6a23\u505a\u6703\u9020\u6210\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u8d70\u8a2a\u9663\u5217","text":"

    \u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u65e2\u53ef\u4ee5\u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u7372\u53d6\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\u9700\u8981\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u5224\u65b7\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5247\u8f38\u51fa\u5c0d\u61c9\u7d22\u5f15\u3002

    \u56e0\u70ba\u9663\u5217\u662f\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u8a62\u64cd\u4f5c\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u67e5\u8a62\u201d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u64f4\u5bb9\u9663\u5217","text":"

    \u5728\u8907\u96dc\u7684\u7cfb\u7d71\u74b0\u5883\u4e2d\uff0c\u7a0b\u5f0f\u96e3\u4ee5\u4fdd\u8b49\u9663\u5217\u4e4b\u5f8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u53ef\u7528\u7684\uff0c\u5f9e\u800c\u7121\u6cd5\u5b89\u5168\u5730\u64f4\u5c55\u9663\u5217\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u9663\u5217\u7684\u9577\u5ea6\u662f\u4e0d\u53ef\u8b8a\u7684\u3002

    \u5982\u679c\u6211\u5011\u5e0c\u671b\u64f4\u5bb9\u9663\u5217\uff0c\u5247\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u7136\u5f8c\u628a\u539f\u9663\u5217\u5143\u7d20\u4f9d\u6b21\u8907\u88fd\u5230\u65b0\u9663\u5217\u3002\u9019\u662f\u4e00\u500b \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u9663\u5217\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\u975e\u5e38\u8017\u6642\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u64f4\u5c55\u9663\u5217\u9577\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res = [0] * (len(nums) + enlarge)\n    # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n
    array.cpp
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = new int[size + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete[] nums;\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.java
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.cs
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.go
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res := make([]int, len(nums)+enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.swift
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.js
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.ts
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.dart
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  return res;\n}\n
    array.rs
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    res\n}\n
    array.c
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u64f4\u5c55\u5f8c\u7684\u7a7a\u9593\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.kt
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    val res = IntArray(nums.size + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.rb
    ### \u64f4\u5c55\u9663\u5217\u9577\u5ea6 ###\n# \u8acb\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n# \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  res\nend\n
    array.zig
    // \u64f4\u5c55\u9663\u5217\u9577\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u9663\u5217\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u4e14\u5143\u7d20\u578b\u5225\u76f8\u540c\u3002\u9019\u7a2e\u505a\u6cd5\u5305\u542b\u8c50\u5bcc\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u7cfb\u7d71\u53ef\u4ee5\u5229\u7528\u9019\u4e9b\u8cc7\u8a0a\u4f86\u6700\u4f73\u5316\u8cc7\u6599\u7d50\u69cb\u7684\u64cd\u4f5c\u6548\u7387\u3002

    • \u7a7a\u9593\u6548\u7387\u9ad8\uff1a\u9663\u5217\u70ba\u8cc7\u6599\u5206\u914d\u4e86\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u584a\uff0c\u7121\u9808\u984d\u5916\u7684\u7d50\u69cb\u958b\u92b7\u3002
    • \u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff1a\u9663\u5217\u5141\u8a31\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u4efb\u4f55\u5143\u7d20\u3002
    • \u5feb\u53d6\u5340\u57df\u6027\uff1a\u7576\u8a2a\u554f\u9663\u5217\u5143\u7d20\u6642\uff0c\u8a08\u7b97\u6a5f\u4e0d\u50c5\u6703\u8f09\u5165\u5b83\uff0c\u9084\u6703\u5feb\u53d6\u5176\u5468\u570d\u7684\u5176\u4ed6\u8cc7\u6599\uff0c\u5f9e\u800c\u85c9\u52a9\u9ad8\u901f\u5feb\u53d6\u4f86\u63d0\u5347\u5f8c\u7e8c\u64cd\u4f5c\u7684\u57f7\u884c\u901f\u5ea6\u3002

    \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u662f\u4e00\u628a\u96d9\u5203\u528d\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

    • \u63d2\u5165\u8207\u522a\u9664\u6548\u7387\u4f4e\uff1a\u7576\u9663\u5217\u4e2d\u5143\u7d20\u8f03\u591a\u6642\uff0c\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52d5\u5927\u91cf\u7684\u5143\u7d20\u3002
    • \u9577\u5ea6\u4e0d\u53ef\u8b8a\uff1a\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u64f4\u5bb9\u9663\u5217\u9700\u8981\u5c07\u6240\u6709\u8cc7\u6599\u8907\u88fd\u5230\u65b0\u9663\u5217\uff0c\u958b\u92b7\u5f88\u5927\u3002
    • \u7a7a\u9593\u6d6a\u8cbb\uff1a\u5982\u679c\u9663\u5217\u5206\u914d\u7684\u5927\u5c0f\u8d85\u904e\u5be6\u969b\u6240\u9700\uff0c\u90a3\u9ebc\u591a\u9918\u7684\u7a7a\u9593\u5c31\u88ab\u6d6a\u8cbb\u4e86\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u9663\u5217\u5178\u578b\u61c9\u7528","text":"

    \u9663\u5217\u662f\u4e00\u7a2e\u57fa\u790e\u4e14\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u65e2\u983b\u7e41\u61c9\u7528\u5728\u5404\u985e\u6f14\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u65bc\u5be6\u73fe\u5404\u7a2e\u8907\u96dc\u8cc7\u6599\u7d50\u69cb\u3002

    • \u96a8\u6a5f\u8a2a\u554f\uff1a\u5982\u679c\u6211\u5011\u60f3\u96a8\u6a5f\u62bd\u53d6\u4e00\u4e9b\u6a23\u672c\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7528\u9663\u5217\u5132\u5b58\uff0c\u4e26\u751f\u6210\u4e00\u500b\u96a8\u6a5f\u5e8f\u5217\uff0c\u6839\u64da\u7d22\u5f15\u5be6\u73fe\u96a8\u6a5f\u62bd\u6a23\u3002
    • \u6392\u5e8f\u548c\u641c\u5c0b\uff1a\u9663\u5217\u662f\u6392\u5e8f\u548c\u641c\u5c0b\u6f14\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u4e8c\u5206\u641c\u5c0b\u7b49\u90fd\u4e3b\u8981\u5728\u9663\u5217\u4e0a\u9032\u884c\u3002
    • \u67e5\u8a62\u8868\uff1a\u7576\u9700\u8981\u5feb\u901f\u67e5\u8a62\u4e00\u500b\u5143\u7d20\u6216\u5176\u5c0d\u61c9\u95dc\u4fc2\u6642\uff0c\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u4f5c\u70ba\u67e5\u8a62\u8868\u3002\u5047\u5982\u6211\u5011\u60f3\u5be6\u73fe\u5b57\u5143\u5230 ASCII \u78bc\u7684\u5c0d\u6620\uff0c\u5247\u53ef\u4ee5\u5c07\u5b57\u5143\u7684 ASCII \u78bc\u503c\u4f5c\u70ba\u7d22\u5f15\uff0c\u5c0d\u61c9\u7684\u5143\u7d20\u5b58\u653e\u5728\u9663\u5217\u4e2d\u7684\u5c0d\u61c9\u4f4d\u7f6e\u3002
    • \u6a5f\u5668\u5b78\u7fd2\uff1a\u795e\u7d93\u7db2\u8def\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9663\u3001\u5f35\u91cf\u4e4b\u9593\u7684\u7dda\u6027\u4ee3\u6578\u904b\u7b97\uff0c\u9019\u4e9b\u8cc7\u6599\u90fd\u662f\u4ee5\u9663\u5217\u7684\u5f62\u5f0f\u69cb\u5efa\u7684\u3002\u9663\u5217\u662f\u795e\u7d93\u7db2\u8def\u7a0b\u5f0f\u8a2d\u8a08\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff1a\u9663\u5217\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002\u4f8b\u5982\uff0c\u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a\u5be6\u969b\u4e0a\u662f\u4e00\u500b\u4e8c\u7dad\u9663\u5217\u3002
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u93c8\u7d50\u4e32\u5217","text":"

    \u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u516c\u5171\u8cc7\u6e90\uff0c\u5728\u4e00\u500b\u8907\u96dc\u7684\u7cfb\u7d71\u57f7\u884c\u74b0\u5883\u4e0b\uff0c\u7a7a\u9592\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u80fd\u6563\u843d\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u6211\u5011\u77e5\u9053\uff0c\u5132\u5b58\u9663\u5217\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5fc5\u9808\u662f\u9023\u7e8c\u7684\uff0c\u800c\u7576\u9663\u5217\u975e\u5e38\u5927\u6642\uff0c\u8a18\u61b6\u9ad4\u53ef\u80fd\u7121\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u9023\u7e8c\u7a7a\u9593\u3002\u6b64\u6642\u93c8\u7d50\u4e32\u5217\u7684\u9748\u6d3b\u6027\u512a\u52e2\u5c31\u9ad4\u73fe\u51fa\u4f86\u4e86\u3002

    \u93c8\u7d50\u4e32\u5217\uff08linked list\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u662f\u4e00\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u5404\u500b\u7bc0\u9ede\u900f\u904e\u201c\u5f15\u7528\u201d\u76f8\u9023\u7dda\u3002\u5f15\u7528\u8a18\u9304\u4e86\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u900f\u904e\u5b83\u53ef\u4ee5\u5f9e\u7576\u524d\u7bc0\u9ede\u8a2a\u554f\u5230\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002

    \u93c8\u7d50\u4e32\u5217\u7684\u8a2d\u8a08\u4f7f\u5f97\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u5b83\u5011\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

    \u5716 4-5 \u00a0 \u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

    \u89c0\u5bdf\u5716 4-5 \uff0c\u93c8\u7d50\u4e32\u5217\u7684\u7d44\u6210\u55ae\u4f4d\u662f\u7bc0\u9ede\uff08node\uff09\u7269\u4ef6\u3002\u6bcf\u500b\u7bc0\u9ede\u90fd\u5305\u542b\u5169\u9805\u8cc7\u6599\uff1a\u7bc0\u9ede\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u201c\u5f15\u7528\u201d\u3002

    • \u93c8\u7d50\u4e32\u5217\u7684\u9996\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u982d\u7bc0\u9ede\u201d\uff0c\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u5c3e\u7bc0\u9ede\u201d\u3002
    • \u5c3e\u7bc0\u9ede\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u5225\u88ab\u8a18\u70ba null\u3001nullptr \u548c None \u3002
    • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u6a19\u7684\u8a9e\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u61c9\u88ab\u66ff\u63db\u70ba\u201c\u6307\u6a19\u201d\u3002

    \u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u9084\u9700\u984d\u5916\u5132\u5b58\u4e00\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u8cc7\u6599\u91cf\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u6bd4\u9663\u5217\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  //\u5efa\u69cb\u5b50\n    int val = x;         // \u7bc0\u9ede\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype ListNode struct {\n    Val  int       // \u7bc0\u9ede\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewListNode \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u93c8\u7d50\u4e32\u5217\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u7bc0\u9ede\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u5efa\u69cb\u5b50\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\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
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u7bc0\u9ede\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    # \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val  # \u7bc0\u9ede\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
    // \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\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 \u93c8\u7d50\u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217","text":"

    \u5efa\u7acb\u93c8\u7d50\u4e32\u5217\u5206\u70ba\u5169\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u7b2c\u4e8c\u6b65\u662f\u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\u95dc\u4fc2\u3002\u521d\u59cb\u5316\u5b8c\u6210\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f9e\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u900f\u904e\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8a2a\u554f\u6240\u6709\u7bc0\u9ede\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    # \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\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\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rb
    # \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.zig
    // \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9663\u5217\u6574\u9ad4\u662f\u4e00\u500b\u8b8a\u6578\uff0c\u6bd4\u5982\u9663\u5217 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u7531\u591a\u500b\u7368\u7acb\u7684\u7bc0\u9ede\u7269\u4ef6\u7d44\u6210\u7684\u3002\u6211\u5011\u901a\u5e38\u5c07\u982d\u7bc0\u9ede\u7576\u4f5c\u93c8\u7d50\u4e32\u5217\u7684\u4ee3\u7a31\uff0c\u6bd4\u5982\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u53ef\u8a18\u4f5c\u93c8\u7d50\u4e32\u5217 n0 \u3002

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

    \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u7bc0\u9ede\u975e\u5e38\u5bb9\u6613\u3002\u5982\u5716 4-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u60f3\u5728\u76f8\u9130\u7684\u5169\u500b\u7bc0\u9ede n0 \u548c n1 \u4e4b\u9593\u63d2\u5165\u4e00\u500b\u65b0\u7bc0\u9ede P \uff0c\u5247\u53ea\u9700\u6539\u8b8a\u5169\u500b\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    \u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u9663\u5217\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6548\u7387\u8f03\u4f4e\u3002

    \u5716 4-6 \u00a0 \u93c8\u7d50\u4e32\u5217\u63d2\u5165\u7bc0\u9ede\u793a\u4f8b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
    linked_list.cpp
    /* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.ts
    /* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u500b\u5167\u5efa\u51fd\u5f0f\uff0c `P` \u662f\u4e00\u500b\u5e38\u6578\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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u5982\u5716 4-7 \u6240\u793a\uff0c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u7bc0\u9ede\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u8b8a\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u3002

    \u8acb\u6ce8\u610f\uff0c\u5118\u7ba1\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\u7bc0\u9ede P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5be6\u969b\u4e0a\u8d70\u8a2a\u6b64\u93c8\u7d50\u4e32\u5217\u5df2\u7d93\u7121\u6cd5\u8a2a\u554f\u5230 P \uff0c\u9019\u610f\u5473\u8457 P \u5df2\u7d93\u4e0d\u518d\u5c6c\u65bc\u8a72\u93c8\u7d50\u4e32\u5217\u4e86\u3002

    \u5716 4-7 \u00a0 \u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def remove(n0: ListNode):\n    \"\"\"\u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\"\"\"\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete P;\n}\n
    linked_list.java
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(P);\n}\n
    linked_list.kt
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    ### \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede ###\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
    // \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8a2a\u554f\u7bc0\u9ede","text":"

    \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u8a2a\u554f\u7bc0\u9ede\u7684\u6548\u7387\u8f03\u4f4e\u3002\u5982\u4e0a\u4e00\u7bc0\u6240\u8ff0\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u4e0b\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u93c8\u7d50\u4e32\u5217\u5247\u4e0d\u7136\uff0c\u7a0b\u5f0f\u9700\u8981\u5f9e\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u9010\u500b\u5411\u5f8c\u8d70\u8a2a\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u7684\u7b2c \\(i\\) \u500b\u7bc0\u9ede\u9700\u8981\u8ff4\u5708 \\(i - 1\\) \u8f2a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
    linked_list.cpp
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    ### \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede ###\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
    // \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u67e5\u8a62\u5176\u4e2d\u503c\u70ba target \u7684\u7bc0\u9ede\uff0c\u8f38\u51fa\u8a72\u7bc0\u9ede\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u904e\u7a0b\u4e5f\u5c6c\u65bc\u7dda\u6027\u67e5\u8a62\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\"\"\"\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede ###\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u9663\u5217 vs. \u93c8\u7d50\u4e32\u5217","text":"

    \u8868 4-1 \u7e3d\u7d50\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7684\u5404\u9805\u7279\u9ede\u4e26\u5c0d\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u65bc\u5b83\u5011\u63a1\u7528\u5169\u7a2e\u76f8\u53cd\u7684\u5132\u5b58\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u7a2e\u6027\u8cea\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73fe\u5c0d\u7acb\u7684\u7279\u9ede\u3002

    \u8868 4-1 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217\u7684\u6548\u7387\u5c0d\u6bd4

    \u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u5132\u5b58\u65b9\u5f0f \u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5206\u6563\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5bb9\u91cf\u64f4\u5c55 \u9577\u5ea6\u4e0d\u53ef\u8b8a \u53ef\u9748\u6d3b\u64f4\u5c55 \u8a18\u61b6\u9ad4\u6548\u7387 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8cbb\u7a7a\u9593 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u591a \u8a2a\u554f\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u65b0\u589e\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u578b\u5225","text":"

    \u5982\u5716 4-8 \u6240\u793a\uff0c\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u4e09\u7a2e\u3002

    • \u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u5373\u524d\u9762\u4ecb\u7d39\u7684\u666e\u901a\u93c8\u7d50\u4e32\u5217\u3002\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\u5169\u9805\u8cc7\u6599\u3002\u6211\u5011\u5c07\u9996\u500b\u7bc0\u9ede\u7a31\u70ba\u982d\u7bc0\u9ede\uff0c\u5c07\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7a31\u70ba\u5c3e\u7bc0\u9ede\uff0c\u5c3e\u7bc0\u9ede\u6307\u5411\u7a7a None \u3002
    • \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff1a\u5982\u679c\u6211\u5011\u4ee4\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5c3e\u7bc0\u9ede\u6307\u5411\u982d\u7bc0\u9ede\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5247\u5f97\u5230\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u5728\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u4efb\u610f\u7bc0\u9ede\u90fd\u53ef\u4ee5\u8996\u4f5c\u982d\u7bc0\u9ede\u3002
    • \u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u8207\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u76f8\u6bd4\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u8a18\u9304\u4e86\u5169\u500b\u65b9\u5411\u7684\u5f15\u7528\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5b9a\u7fa9\u540c\u6642\u5305\u542b\u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\uff08\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\u548c\u524d\u9a45\u7bc0\u9ede\uff08\u4e0a\u4e00\u500b\u7bc0\u9ede\uff09\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u76f8\u8f03\u65bc\u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u66f4\u5177\u9748\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u5169\u500b\u65b9\u5411\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u76f8\u61c9\u5730\u4e5f\u9700\u8981\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode *prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  // \u5efa\u69cb\u5b50\n    int val = x;    // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype DoublyListNode struct {\n    Val  int             // \u7bc0\u9ede\u503c\n    Next *DoublyListNode // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\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;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u5efa\u69cb\u5b50\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u578b\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n/* \u5efa\u69cb\u5b50 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u7bc0\u9ede\u503c\n    val next: ListNode? = null  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    # \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :next   # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\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
    // \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\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

    \u5716 4-8 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u7a2e\u985e

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u93c8\u7d50\u4e32\u5217\u5178\u578b\u61c9\u7528","text":"

    \u55ae\u5411\u93c8\u7d50\u4e32\u5217\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u548c\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002

    • \u5806\u758a\u8207\u4f47\u5217\uff1a\u7576\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u90fd\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\u6642\uff0c\u5b83\u8868\u73fe\u51fa\u5148\u9032\u5f8c\u51fa\u7684\u7279\u6027\uff0c\u5c0d\u61c9\u5806\u758a\uff1b\u7576\u63d2\u5165\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\uff0c\u522a\u9664\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u53e6\u4e00\u7aef\u9032\u884c\uff0c\u5b83\u8868\u73fe\u51fa\u5148\u9032\u5148\u51fa\u7684\u7279\u6027\uff0c\u5c0d\u61c9\u4f47\u5217\u3002
    • \u96dc\u6e4a\u8868\uff1a\u93c8\u5f0f\u4f4d\u5740\u662f\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8a72\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u885d\u7a81\u7684\u5143\u7d20\u90fd\u6703\u88ab\u653e\u5230\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
    • \u5716\uff1a\u9130\u63a5\u8868\u662f\u8868\u793a\u5716\u7684\u4e00\u7a2e\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u5716\u7684\u6bcf\u500b\u9802\u9ede\u90fd\u8207\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u76f8\u95dc\u806f\uff0c\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u4ee3\u8868\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u5176\u4ed6\u9802\u9ede\u3002

    \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u5feb\u901f\u67e5\u8a62\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u5143\u7d20\u7684\u5834\u666f\u3002

    • \u9ad8\u968e\u8cc7\u6599\u7d50\u69cb\uff1a\u6bd4\u5982\u5728\u7d05\u9ed1\u6a39\u3001B \u6a39\u4e2d\uff0c\u6211\u5011\u9700\u8981\u8a2a\u554f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5728\u7bc0\u9ede\u4e2d\u5132\u5b58\u4e00\u500b\u6307\u5411\u7236\u7bc0\u9ede\u7684\u5f15\u7528\u4f86\u5be6\u73fe\uff0c\u985e\u4f3c\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
    • \u700f\u89bd\u5668\u6b77\u53f2\uff1a\u5728\u7db2\u9801\u700f\u89bd\u5668\u4e2d\uff0c\u7576\u7528\u6236\u9ede\u9078\u524d\u9032\u6216\u5f8c\u9000\u6309\u9215\u6642\uff0c\u700f\u89bd\u5668\u9700\u8981\u77e5\u9053\u4f7f\u7528\u8005\u8a2a\u554f\u904e\u7684\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u7db2\u9801\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7279\u6027\u4f7f\u5f97\u9019\u7a2e\u64cd\u4f5c\u8b8a\u5f97\u7c21\u55ae\u3002
    • LRU \u6f14\u7b97\u6cd5\uff1a\u5728\u5feb\u53d6\u6dd8\u6c70\uff08LRU\uff09\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u3002\u9019\u6642\u5019\u4f7f\u7528\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5c31\u975e\u5e38\u5408\u9069\u3002

    \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u9031\u671f\u6027\u64cd\u4f5c\u7684\u5834\u666f\uff0c\u6bd4\u5982\u4f5c\u696d\u7cfb\u7d71\u7684\u8cc7\u6e90\u6392\u7a0b\u3002

    • \u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\uff1a\u5728\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\u662f\u4e00\u7a2e\u5e38\u898b\u7684 CPU \u6392\u7a0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5c0d\u4e00\u7d44\u7a0b\u5e8f\u9032\u884c\u8ff4\u5708\u3002\u6bcf\u500b\u7a0b\u5e8f\u88ab\u8ce6\u4e88\u4e00\u500b\u6642\u9593\u7247\uff0c\u7576\u6642\u9593\u7247\u7528\u5b8c\u6642\uff0cCPU \u5c07\u5207\u63db\u5230\u4e0b\u4e00\u500b\u7a0b\u5e8f\u3002\u9019\u7a2e\u8ff4\u5708\u64cd\u4f5c\u53ef\u4ee5\u900f\u904e\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
    • \u8cc7\u6599\u7de9\u885d\u5340\uff1a\u5728\u67d0\u4e9b\u8cc7\u6599\u7de9\u885d\u5340\u7684\u5be6\u73fe\u4e2d\uff0c\u4e5f\u53ef\u80fd\u6703\u4f7f\u7528\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u6bd4\u5982\u5728\u97f3\u8a0a\u3001\u5f71\u7247\u64ad\u653e\u5668\u4e2d\uff0c\u8cc7\u6599\u6d41\u53ef\u80fd\u6703\u88ab\u5206\u6210\u591a\u500b\u7de9\u885d\u584a\u4e26\u653e\u5165\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff0c\u4ee5\u4fbf\u5be6\u73fe\u7121\u7e2b\u64ad\u653e\u3002
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u4e32\u5217","text":"

    \u4e32\u5217\uff08list\uff09\u662f\u4e00\u500b\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8a2a\u554f\u3001\u4fee\u6539\u3001\u65b0\u589e\u3001\u522a\u9664\u548c\u8d70\u8a2a\u7b49\u64cd\u4f5c\uff0c\u7121\u9808\u4f7f\u7528\u8005\u8003\u616e\u5bb9\u91cf\u9650\u5236\u7684\u554f\u984c\u3002\u4e32\u5217\u53ef\u4ee5\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u5be6\u73fe\u3002

    • \u93c8\u7d50\u4e32\u5217\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u4e32\u5217\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\u64cd\u4f5c\uff0c\u4e26\u4e14\u53ef\u4ee5\u9748\u6d3b\u52d5\u614b\u64f4\u5bb9\u3002
    • \u9663\u5217\u4e5f\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\uff0c\u4f46\u7531\u65bc\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u500b\u5177\u6709\u9577\u5ea6\u9650\u5236\u7684\u4e32\u5217\u3002

    \u7576\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u4e32\u5217\u6642\uff0c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u6027\u8cea\u6703\u5c0e\u81f4\u4e32\u5217\u7684\u5be6\u7528\u6027\u964d\u4f4e\u3002\u9019\u662f\u56e0\u70ba\u6211\u5011\u901a\u5e38\u7121\u6cd5\u4e8b\u5148\u78ba\u5b9a\u9700\u8981\u5132\u5b58\u591a\u5c11\u8cc7\u6599\uff0c\u5f9e\u800c\u96e3\u4ee5\u9078\u64c7\u5408\u9069\u7684\u4e32\u5217\u9577\u5ea6\u3002\u82e5\u9577\u5ea6\u904e\u5c0f\uff0c\u5247\u5f88\u53ef\u80fd\u7121\u6cd5\u6eff\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u9577\u5ea6\u904e\u5927\uff0c\u5247\u6703\u9020\u6210\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002

    \u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff08dynamic array\uff09\u4f86\u5be6\u73fe\u4e32\u5217\u3002\u5b83\u7e7c\u627f\u4e86\u9663\u5217\u7684\u5404\u9805\u512a\u9ede\uff0c\u4e26\u4e14\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u9032\u884c\u52d5\u614b\u64f4\u5bb9\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u6a19\u6e96\u5eab\u63d0\u4f9b\u7684\u4e32\u5217\u662f\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\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\u4f86\u7684\u8a0e\u8ad6\u4e2d\uff0c\u6211\u5011\u5c07\u628a\u201c\u4e32\u5217\u201d\u548c\u201c\u52d5\u614b\u9663\u5217\u201d\u8996\u70ba\u7b49\u540c\u7684\u6982\u5ff5\u3002

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

    \u6211\u5011\u901a\u5e38\u4f7f\u7528\u201c\u7121\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u9019\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\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\u4e32\u5217 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u7121\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\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u9663\u5217\u7684\u5143\u7d20\u578b\u5225\u9700\u70ba int[] \u7684\u5305\u88dd\u985e\u5225 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\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\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\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\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\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
    list.zig
    // \u521d\u59cb\u5316\u4e32\u5217\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u4e32\u5217\u672c\u8cea\u4e0a\u662f\u9663\u5217\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u8a2a\u554f\u5143\u7d20\nnum: int = nums[1]  # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.cpp
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.java
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums.get(1);  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.cs
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list_test.go
    /* \u8a2a\u554f\u5143\u7d20 */\nnum := nums[1]  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.swift
    /* \u8a2a\u554f\u5143\u7d20 */\nlet num = nums[1] // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.js
    /* \u8a2a\u554f\u5143\u7d20 */\nconst num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.ts
    /* \u8a2a\u554f\u5143\u7d20 */\nconst num: number = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.dart
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.rs
    /* \u8a2a\u554f\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u8a2a\u554f\u5143\u7d20 */\nval num = nums[1]       // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.rb
    # \u8a2a\u554f\u5143\u7d20\nnum = nums[1] # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.zig
    // \u8a2a\u554f\u5143\u7d20\nvar num = nums.items[1]; // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u76f8\u8f03\u65bc\u9663\u5217\uff0c\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5730\u65b0\u589e\u8207\u522a\u9664\u5143\u7d20\u3002\u5728\u4e32\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u8207\u9663\u5217\u76f8\u540c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6e05\u7a7a\u4e32\u5217\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.pop(3)        # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.cpp
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.java
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.cs
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list_test.go
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.swift
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.js
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.ts
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.dart
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.rs
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);    // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.rb
    # \u6e05\u7a7a\u4e32\u5217\nnums.clear\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.delete_at(3) # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.zig
    // \u6e05\u7a7a\u4e32\u5217\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n// \u522a\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u8d70\u8a2a\u4e32\u5217","text":"

    \u8207\u9663\u5217\u4e00\u6a23\uff0c\u4e32\u5217\u53ef\u4ee5\u6839\u64da\u7d22\u5f15\u8d70\u8a2a\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u5404\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\nfor num in nums:\n    count += num\n
    list.cpp
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
    list.rb
    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
    list.zig
    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7d66\u5b9a\u4e00\u500b\u65b0\u4e32\u5217 nums1 \uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u62fc\u63a5\u5230\u539f\u4e32\u5217\u7684\u5c3e\u90e8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.cpp
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.cs
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list_test.go
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.swift
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.js
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.ts
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.dart
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.rs
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.rb
    # \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
    list.zig
    // \u62fc\u63a5\u5169\u500b\u4e32\u5217\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); // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u5b8c\u6210\u4e32\u5217\u6392\u5e8f\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u9663\u5217\u985e\u5225\u6f14\u7b97\u6cd5\u984c\u4e2d\u7d93\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u548c\u201c\u96d9\u6307\u6a19\u201d\u6f14\u7b97\u6cd5\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6392\u5e8f\u4e32\u5217\nnums.sort()  # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.cpp
    /* \u6392\u5e8f\u4e32\u5217 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.java
    /* \u6392\u5e8f\u4e32\u5217 */\nCollections.sort(nums);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.cs
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.Sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list_test.go
    /* \u6392\u5e8f\u4e32\u5217 */\nsort.Ints(nums)  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.swift
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.js
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.ts
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.dart
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.rs
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.rb
    # \u6392\u5e8f\u4e32\u5217\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.zig
    // \u6392\u5e8f\u4e32\u5217\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u4e32\u5217\u5be6\u73fe","text":"

    \u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u4e86\u4e32\u5217\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u5011\u7684\u5be6\u73fe\u6bd4\u8f03\u8907\u96dc\uff0c\u5404\u500b\u53c3\u6578\u7684\u8a2d\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u64f4\u5bb9\u500d\u6578\u7b49\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u539f\u59cb\u78bc\u9032\u884c\u5b78\u7fd2\u3002

    \u70ba\u4e86\u52a0\u6df1\u5c0d\u4e32\u5217\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u5011\u5617\u8a66\u5be6\u73fe\u4e00\u500b\u7c21\u6613\u7248\u4e32\u5217\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u500b\u91cd\u9ede\u8a2d\u8a08\u3002

    • \u521d\u59cb\u5bb9\u91cf\uff1a\u9078\u53d6\u4e00\u500b\u5408\u7406\u7684\u9663\u5217\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u9078\u64c7 10 \u4f5c\u70ba\u521d\u59cb\u5bb9\u91cf\u3002
    • \u6578\u91cf\u8a18\u9304\uff1a\u5ba3\u544a\u4e00\u500b\u8b8a\u6578 size \uff0c\u7528\u65bc\u8a18\u9304\u4e32\u5217\u7576\u524d\u5143\u7d20\u6578\u91cf\uff0c\u4e26\u96a8\u8457\u5143\u7d20\u63d2\u5165\u548c\u522a\u9664\u5be6\u6642\u66f4\u65b0\u3002\u6839\u64da\u6b64\u8b8a\u6578\uff0c\u6211\u5011\u53ef\u4ee5\u5b9a\u4f4d\u4e32\u5217\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65b7\u662f\u5426\u9700\u8981\u64f4\u5bb9\u3002
    • \u64f4\u5bb9\u6a5f\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u6642\u4e32\u5217\u5bb9\u91cf\u5df2\u6eff\uff0c\u5247\u9700\u8981\u9032\u884c\u64f4\u5bb9\u3002\u5148\u6839\u64da\u64f4\u5bb9\u500d\u6578\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u518d\u5c07\u7576\u524d\u9663\u5217\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52d5\u81f3\u65b0\u9663\u5217\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u898f\u5b9a\u6bcf\u6b21\u5c07\u9663\u5217\u64f4\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
    class MyList:\n    \"\"\"\u4e32\u5217\u985e\u5225\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._capacity: int = 10  # \u4e32\u5217\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        self._size: int = 0  # \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8a2a\u554f\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\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\u9593\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u522a\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u4e32\u5217\u64f4\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217\"\"\"\n        return self._arr[: self._size]\n
    my_list.cpp
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  private:\n    int *arr;             // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    int arrSize = 0;      // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\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        // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Vector \u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    private int size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] toArray() {\n        int size = size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr;           // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u4e32\u5217\u5bb9\u91cf\n    private int arrSize = 0;         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba arrCapacity * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u4e32\u5217\u5bb9\u91cf\n        arr:         make([]int, 10), // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrSize:     0,               // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n    }\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u522a\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    // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217 */\nfunc (l *myList) toArray() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
    my_list.swift
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: [Int] // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var _capacity: Int // \u4e32\u5217\u5bb9\u91cf\n    private var _size: Int // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5247\u4e1f\u64f2\u932f\u8aa4\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\u65b0\u589e\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
    my_list.js
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    #arr = new Array(); // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    #capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    #size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    toArray() {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private arr: Array<number>; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u4e32\u5217\u5bb9\u91cf\n    private _size: number = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  late List<int> _arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n  int _capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n  int _size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  /* \u5efa\u69cb\u5b50 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    _size++;\n  }\n\n  /* \u522a\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u4e32\u5217\u64f4\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extendRatio \u500d\u7684\u65b0\u9663\u5217\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\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
    /* \u4e32\u5217\u985e\u5225 */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    capacity: usize,     // \u4e32\u5217\u5bb9\u91cf\n    size: usize,         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\ntypedef struct {\n    int *arr;        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int capacity;    // \u4e32\u5217\u5bb9\u91cf\n    int size;        // \u4e32\u5217\u5927\u5c0f\n    int extendRatio; // \u4e32\u5217\u6bcf\u6b21\u64f4\u5bb9\u7684\u500d\u6578\n} MyList;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\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/* \u522a\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\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/* \u4e32\u5217\u64f4\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u9593\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u8907\u88fd\u820a\u8cc7\u6599\u5230\u65b0\u8cc7\u6599\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91cb\u653e\u820a\u8cc7\u6599\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u8cc7\u6599\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Array \u7528\u65bc\u5217\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
    my_list.kt
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u4e32\u5217\u5bb9\u91cf\n    private var size: Int = 0 // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        size++\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    ### \u4e32\u5217\u985e\u5225 ###\nclass MyList\n  attr_reader :size       # \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  attr_reader :capacity   # \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n\n    # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u522a\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    # \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u4e32\u5217\u64f4\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 ###\n  def to_array\n    sz = size\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    // \u4e32\u5217\u985e\u5225\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u4e32\u5217\u5bb9\u91cf\n        numSize: usize = 0,                           // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4e32\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.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8a2a\u554f\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n            self.numSize += 1;\n        }\n\n        // \u522a\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            // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u4e32\u5217\u64f4\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *","text":"

    \u5728\u672c\u7ae0\u7684\u524d\u5169\u7bc0\u4e2d\uff0c\u6211\u5011\u63a2\u8a0e\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u9019\u5169\u7a2e\u57fa\u790e\u4e14\u91cd\u8981\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b83\u5011\u5206\u5225\u4ee3\u8868\u4e86\u201c\u9023\u7e8c\u5132\u5b58\u201d\u548c\u201c\u5206\u6563\u5132\u5b58\u201d\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u3002

    \u5be6\u969b\u4e0a\uff0c\u7269\u7406\u7d50\u69cb\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u6c7a\u5b9a\u4e86\u7a0b\u5f0f\u5c0d\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u7684\u4f7f\u7528\u6548\u7387\uff0c\u9032\u800c\u5f71\u97ff\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u7684\u6574\u9ad4\u6548\u80fd\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u88dd\u7f6e","text":"

    \u8a08\u7b97\u6a5f\u4e2d\u5305\u62ec\u4e09\u7a2e\u985e\u578b\u7684\u5132\u5b58\u88dd\u7f6e\uff1a\u786c\u789f\uff08hard disk\uff09\u3001\u8a18\u61b6\u9ad4\uff08random-access memory, RAM\uff09\u3001\u5feb\u53d6\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u5011\u5728\u8a08\u7b97\u6a5f\u7cfb\u7d71\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6548\u80fd\u7279\u9ede\u3002

    \u8868 4-2 \u00a0 \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u88dd\u7f6e

    \u786c\u789f \u8a18\u61b6\u9ad4 \u5feb\u53d6 \u7528\u9014 \u9577\u671f\u5132\u5b58\u8cc7\u6599\uff0c\u5305\u62ec\u4f5c\u696d\u7cfb\u7d71\u3001\u7a0b\u5f0f\u3001\u6a94\u6848\u7b49 \u81e8\u6642\u5132\u5b58\u7576\u524d\u57f7\u884c\u7684\u7a0b\u5f0f\u548c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599 \u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u6e1b\u5c11 CPU \u8a2a\u554f\u8a18\u61b6\u9ad4\u7684\u6b21\u6578 \u6613\u5931\u6027 \u65b7\u96fb\u5f8c\u8cc7\u6599\u4e0d\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u5bb9\u91cf \u8f03\u5927\uff0cTB \u7d1a\u5225 \u8f03\u5c0f\uff0cGB \u7d1a\u5225 \u975e\u5e38\u5c0f\uff0cMB \u7d1a\u5225 \u901f\u5ea6 \u8f03\u6162\uff0c\u5e7e\u767e\u5230\u5e7e\u5343 MB/s \u8f03\u5feb\uff0c\u5e7e\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u5e7e\u5341\u5230\u5e7e\u767e GB/s \u50f9\u683c \u8f03\u4fbf\u5b9c\uff0c\u5e7e\u6bdb\u5230\u5e7e\u5143 / GB \u8f03\u8cb4\uff0c\u5e7e\u5341\u5230\u5e7e\u767e\u5143 / GB \u975e\u5e38\u8cb4\uff0c\u96a8 CPU \u6253\u5305\u8a08\u50f9

    \u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71\u60f3\u8c61\u70ba\u5716 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7d50\u69cb\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9802\u7aef\u7684\u5132\u5b58\u88dd\u7f6e\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u9019\u7a2e\u591a\u5c64\u7d1a\u7684\u8a2d\u8a08\u4e26\u975e\u5076\u7136\uff0c\u800c\u662f\u8a08\u7b97\u6a5f\u79d1\u5b78\u5bb6\u548c\u5de5\u7a0b\u5e2b\u5011\u7d93\u904e\u6df1\u601d\u719f\u616e\u7684\u7d50\u679c\u3002

    • \u786c\u789f\u96e3\u4ee5\u88ab\u8a18\u61b6\u9ad4\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u5728\u65b7\u96fb\u5f8c\u6703\u4e1f\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9069\u5408\u9577\u671f\u5132\u5b58\u8cc7\u6599\uff1b\u5176\u6b21\uff0c\u8a18\u61b6\u9ad4\u7684\u6210\u672c\u662f\u786c\u789f\u7684\u5e7e\u5341\u500d\uff0c\u9019\u4f7f\u5f97\u5b83\u96e3\u4ee5\u5728\u6d88\u8cbb\u8005\u5e02\u5834\u666e\u53ca\u3002
    • \u5feb\u53d6\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96e3\u4ee5\u517c\u5f97\u3002\u96a8\u8457 L1\u3001L2\u3001L3 \u5feb\u53d6\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u6703\u8b8a\u5927\uff0c\u8207 CPU \u6838\u5fc3\u4e4b\u9593\u7684\u7269\u7406\u8ddd\u96e2\u6703\u8b8a\u9060\uff0c\u5f9e\u800c\u5c0e\u81f4\u8cc7\u6599\u50b3\u8f38\u6642\u9593\u589e\u52a0\uff0c\u5143\u7d20\u8a2a\u554f\u5ef6\u9072\u8b8a\u9ad8\u3002\u5728\u7576\u524d\u6280\u8853\u4e0b\uff0c\u591a\u5c64\u7d1a\u7684\u5feb\u53d6\u7d50\u69cb\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u9593\u7684\u6700\u4f73\u5e73\u8861\u9ede\u3002

    \u5716 4-9 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71

    Note

    \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u5c64\u6b21\u7d50\u69cb\u9ad4\u73fe\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u9593\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5be6\u969b\u4e0a\uff0c\u9019\u7a2e\u6b0a\u8861\u666e\u904d\u5b58\u5728\u65bc\u6240\u6709\u5de5\u696d\u9818\u57df\uff0c\u5b83\u8981\u6c42\u6211\u5011\u5728\u4e0d\u540c\u7684\u512a\u52e2\u548c\u9650\u5236\u4e4b\u9593\u627e\u5230\u6700\u4f73\u5e73\u8861\u9ede\u3002

    \u7e3d\u7684\u4f86\u8aaa\uff0c\u786c\u789f\u7528\u65bc\u9577\u671f\u5132\u5b58\u5927\u91cf\u8cc7\u6599\uff0c\u8a18\u61b6\u9ad4\u7528\u65bc\u81e8\u6642\u5132\u5b58\u7a0b\u5f0f\u57f7\u884c\u4e2d\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\uff0c\u800c\u5feb\u53d6\u5247\u7528\u65bc\u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5f0f\u57f7\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u5354\u4f5c\uff0c\u78ba\u4fdd\u8a08\u7b97\u6a5f\u7cfb\u7d71\u9ad8\u6548\u57f7\u884c\u3002

    \u5982\u5716 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u6703\u5f9e\u786c\u789f\u4e2d\u88ab\u8b80\u53d6\u5230\u8a18\u61b6\u9ad4\u4e2d\uff0c\u4f9b CPU \u8a08\u7b97\u4f7f\u7528\u3002\u5feb\u53d6\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u900f\u904e\u667a\u6167\u5730\u5f9e\u8a18\u61b6\u9ad4\u8f09\u5165\u8cc7\u6599\uff0c\u7d66 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u8cc7\u6599\u8b80\u53d6\uff0c\u5f9e\u800c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\uff0c\u6e1b\u5c11\u5c0d\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u7684\u4f9d\u8cf4\u3002

    \u5716 4-10 \u00a0 \u786c\u789f\u3001\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u4e4b\u9593\u7684\u8cc7\u6599\u6d41\u901a

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u8a18\u61b6\u9ad4\u6548\u7387","text":"

    \u5728\u8a18\u61b6\u9ad4\u7a7a\u9593\u5229\u7528\u65b9\u9762\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5404\u81ea\u5177\u6709\u512a\u52e2\u548c\u4fb7\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u8a18\u61b6\u9ad4\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u584a\u8a18\u61b6\u9ad4\u4e0d\u80fd\u88ab\u591a\u500b\u7a0b\u5f0f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u5011\u5e0c\u671b\u8cc7\u6599\u7d50\u69cb\u80fd\u5920\u5118\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u9593\u3002\u9663\u5217\u7684\u5143\u7d20\u7dca\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u984d\u5916\u7684\u7a7a\u9593\u4f86\u5132\u5b58\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u56e0\u6b64\u7a7a\u9593\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u9663\u5217\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u5920\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u9019\u53ef\u80fd\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff0c\u9663\u5217\u64f4\u5bb9\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u4ee5\u201c\u7bc0\u9ede\u201d\u70ba\u55ae\u4f4d\u9032\u884c\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u96a8\u8457\u53cd\u8986\u7533\u8acb\u8207\u91cb\u653e\u8a18\u61b6\u9ad4\uff0c\u7a7a\u9592\u8a18\u61b6\u9ad4\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u6703\u8d8a\u4f86\u8d8a\u9ad8\uff0c\u5f9e\u800c\u5c0e\u81f4\u8a18\u61b6\u9ad4\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u9663\u5217\u7531\u65bc\u5176\u9023\u7e8c\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u76f8\u5c0d\u4e0d\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u5143\u7d20\u662f\u5206\u6563\u5132\u5b58\u7684\uff0c\u5728\u983b\u7e41\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u5feb\u53d6\u6548\u7387","text":"

    \u5feb\u53d6\u96d6\u7136\u5728\u7a7a\u9593\u5bb9\u91cf\u4e0a\u9060\u5c0f\u65bc\u8a18\u61b6\u9ad4\uff0c\u4f46\u5b83\u6bd4\u8a18\u61b6\u9ad4\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u901f\u5ea6\u4e0a\u8d77\u8457\u81f3\u95dc\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u65bc\u5feb\u53d6\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5132\u5b58\u4e00\u5c0f\u90e8\u5206\u983b\u7e41\u8a2a\u554f\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u7576 CPU \u5617\u8a66\u8a2a\u554f\u7684\u8cc7\u6599\u4e0d\u5728\u5feb\u53d6\u4e2d\u6642\uff0c\u5c31\u6703\u767c\u751f\u5feb\u53d6\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u6642 CPU \u4e0d\u5f97\u4e0d\u5f9e\u901f\u5ea6\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u4e2d\u8f09\u5165\u6240\u9700\u8cc7\u6599\u3002

    \u986f\u7136\uff0c\u201c\u5feb\u53d6\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8b80\u5beb\u8cc7\u6599\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5f0f\u6548\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u5011\u5c07 CPU \u5f9e\u5feb\u53d6\u4e2d\u6210\u529f\u7372\u53d6\u8cc7\u6599\u7684\u6bd4\u4f8b\u7a31\u70ba\u5feb\u53d6\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u9019\u500b\u6307\u6a19\u901a\u5e38\u7528\u4f86\u8861\u91cf\u5feb\u53d6\u6548\u7387\u3002

    \u70ba\u4e86\u5118\u53ef\u80fd\u9054\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u5feb\u53d6\u6703\u63a1\u53d6\u4ee5\u4e0b\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\u3002

    • \u5feb\u53d6\u884c\uff1a\u5feb\u53d6\u4e0d\u662f\u55ae\u500b\u4f4d\u5143\u7d44\u5730\u5132\u5b58\u8207\u8f09\u5165\u8cc7\u6599\uff0c\u800c\u662f\u4ee5\u5feb\u53d6\u884c\u70ba\u55ae\u4f4d\u3002\u76f8\u6bd4\u65bc\u55ae\u500b\u4f4d\u5143\u7d44\u7684\u50b3\u8f38\uff0c\u5feb\u53d6\u884c\u7684\u50b3\u8f38\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
    • \u9810\u53d6\u6a5f\u5236\uff1a\u8655\u7406\u5668\u6703\u5617\u8a66\u9810\u6e2c\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\uff08\u4f8b\u5982\u9806\u5e8f\u8a2a\u554f\u3001\u56fa\u5b9a\u6b65\u9577\u8df3\u8e8d\u8a2a\u554f\u7b49\uff09\uff0c\u4e26\u6839\u64da\u7279\u5b9a\u6a21\u5f0f\u5c07\u8cc7\u6599\u8f09\u5165\u81f3\u5feb\u53d6\u4e4b\u4e2d\uff0c\u5f9e\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
    • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u9644\u8fd1\u7684\u8cc7\u6599\u53ef\u80fd\u8fd1\u671f\u4e5f\u6703\u88ab\u8a2a\u554f\u3002\u56e0\u6b64\uff0c\u5feb\u53d6\u5728\u8f09\u5165\u67d0\u4e00\u8cc7\u6599\u6642\uff0c\u4e5f\u6703\u8f09\u5165\u5176\u9644\u8fd1\u7684\u8cc7\u6599\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
    • \u6642\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u5728\u4e0d\u4e45\u7684\u5c07\u4f86\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8a2a\u554f\u3002\u5feb\u53d6\u5229\u7528\u9019\u4e00\u539f\u7406\uff0c\u900f\u904e\u4fdd\u7559\u6700\u8fd1\u8a2a\u554f\u904e\u7684\u8cc7\u6599\u4f86\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

    \u5be6\u969b\u4e0a\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5c0d\u5feb\u53d6\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5e7e\u500b\u65b9\u9762\u3002

    • \u4f54\u7528\u7a7a\u9593\uff1a\u93c8\u7d50\u4e32\u5217\u5143\u7d20\u6bd4\u9663\u5217\u5143\u7d20\u4f54\u7528\u7a7a\u9593\u66f4\u591a\uff0c\u5c0e\u81f4\u5feb\u53d6\u4e2d\u5bb9\u7d0d\u7684\u6709\u6548\u8cc7\u6599\u91cf\u66f4\u5c11\u3002
    • \u5feb\u53d6\u884c\uff1a\u93c8\u7d50\u4e32\u5217\u8cc7\u6599\u5206\u6563\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u800c\u5feb\u53d6\u662f\u201c\u6309\u884c\u8f09\u5165\u201d\u7684\uff0c\u56e0\u6b64\u8f09\u5165\u5230\u7121\u6548\u8cc7\u6599\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
    • \u9810\u53d6\u6a5f\u5236\uff1a\u9663\u5217\u6bd4\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9810\u6e2c\u6027\u201d\uff0c\u5373\u7cfb\u7d71\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c07\u88ab\u8f09\u5165\u7684\u8cc7\u6599\u3002
    • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u9663\u5217\u88ab\u5132\u5b58\u5728\u96c6\u4e2d\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u56e0\u6b64\u88ab\u8f09\u5165\u8cc7\u6599\u9644\u8fd1\u7684\u8cc7\u6599\u66f4\u6709\u53ef\u80fd\u5373\u5c07\u88ab\u8a2a\u554f\u3002

    \u7e3d\u9ad4\u800c\u8a00\uff0c\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u9019\u4f7f\u5f97\u5728\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u5f80\u5f80\u66f4\u53d7\u6b61\u8fce\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u5feb\u53d6\u6548\u7387\u4e26\u4e0d\u610f\u5473\u8457\u9663\u5217\u5728\u6240\u6709\u60c5\u6cc1\u4e0b\u90fd\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u5be6\u969b\u61c9\u7528\u4e2d\u9078\u64c7\u54ea\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5be6\u73fe\u201c\u5806\u758a\u201d\u8cc7\u6599\u7d50\u69cb\uff08\u4e0b\u4e00\u7ae0\u6703\u8a73\u7d30\u4ecb\u7d39\uff09\uff0c\u4f46\u5b83\u5011\u9069\u7528\u65bc\u4e0d\u540c\u5834\u666f\u3002

    • \u5728\u505a\u6f14\u7b97\u6cd5\u984c\u6642\uff0c\u6211\u5011\u6703\u50be\u5411\u65bc\u9078\u64c7\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\uff0c\u56e0\u70ba\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u96a8\u6a5f\u8a2a\u554f\u7684\u80fd\u529b\uff0c\u4ee3\u50f9\u50c5\u662f\u9700\u8981\u9810\u5148\u70ba\u9663\u5217\u5206\u914d\u4e00\u5b9a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u5982\u679c\u8cc7\u6599\u91cf\u975e\u5e38\u5927\u3001\u52d5\u614b\u6027\u5f88\u9ad8\u3001\u5806\u758a\u7684\u9810\u671f\u5927\u5c0f\u96e3\u4ee5\u4f30\u8a08\uff0c\u90a3\u9ebc\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u66f4\u52a0\u5408\u9069\u3002\u93c8\u7d50\u4e32\u5217\u80fd\u5920\u5c07\u5927\u91cf\u8cc7\u6599\u5206\u6563\u5132\u5b58\u65bc\u8a18\u61b6\u9ad4\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u4e26\u4e14\u907f\u514d\u4e86\u9663\u5217\u64f4\u5bb9\u7522\u751f\u7684\u984d\u5916\u958b\u92b7\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u662f\u5169\u7a2e\u57fa\u672c\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5206\u5225\u4ee3\u8868\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5169\u7a2e\u5132\u5b58\u65b9\u5f0f\uff1a\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\u3002\u5169\u8005\u7684\u7279\u9ede\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u6027\u3002
    • \u9663\u5217\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002
    • \u93c8\u7d50\u4e32\u5217\u900f\u904e\u66f4\u6539\u5f15\u7528\uff08\u6307\u6a19\uff09\u5be6\u73fe\u9ad8\u6548\u7684\u7bc0\u9ede\u63d2\u5165\u8207\u522a\u9664\uff0c\u4e14\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\uff1b\u4f46\u7bc0\u9ede\u8a2a\u554f\u6548\u7387\u4f4e\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u591a\u3002\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u3001\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3001\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
    • \u4e32\u5217\u662f\u4e00\u7a2e\u652f\u6301\u589e\u522a\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u3002\u5b83\u4fdd\u7559\u4e86\u9663\u5217\u7684\u512a\u52e2\uff0c\u540c\u6642\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\u3002
    • \u4e32\u5217\u7684\u51fa\u73fe\u5927\u5e45\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
    • \u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u9663\u5217\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6548\u7387\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u5247\u5728\u8a18\u61b6\u9ad4\u4f7f\u7528\u4e0a\u66f4\u52a0\u9748\u6d3b\u3002
    • \u5feb\u53d6\u900f\u904e\u5feb\u53d6\u884c\u3001\u9810\u53d6\u6a5f\u5236\u4ee5\u53ca\u7a7a\u9593\u5340\u57df\u6027\u548c\u6642\u9593\u5340\u57df\u6027\u7b49\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\uff0c\u70ba CPU \u63d0\u4f9b\u5feb\u901f\u8cc7\u6599\u8a2a\u554f\uff0c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\u3002
    • \u7531\u65bc\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u93c8\u7d50\u4e32\u5217\u66f4\u9ad8\u6548\u3002\u5728\u9078\u64c7\u8cc7\u6599\u7d50\u69cb\u6642\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u548c\u5834\u666f\u505a\u51fa\u6070\u7576\u9078\u64c7\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u9663\u5217\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff0c\u5c0d\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u5426\u6709\u5f71\u97ff\uff1f

    \u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u90fd\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u8cc7\u6599\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u5806\u758a\u548c\u5806\u7a4d\u5177\u6709\u5404\u81ea\u7684\u7279\u9ede\uff0c\u5f9e\u800c\u5c0e\u81f4\u4ee5\u4e0b\u4e0d\u540c\u9ede\u3002

    1. \u5206\u914d\u548c\u91cb\u653e\u6548\u7387\uff1a\u5806\u758a\u662f\u4e00\u584a\u8f03\u5c0f\u7684\u8a18\u61b6\u9ad4\uff0c\u5206\u914d\u7531\u7de8\u8b6f\u5668\u81ea\u52d5\u5b8c\u6210\uff1b\u800c\u5806\u7a4d\u8a18\u61b6\u9ad4\u76f8\u5c0d\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u7a0b\u5f0f\u78bc\u4e2d\u52d5\u614b\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u7a4d\u4e0a\u7684\u5206\u914d\u548c\u91cb\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u5806\u758a\u4e0a\u7684\u6162\u3002
    2. \u5927\u5c0f\u9650\u5236\uff1a\u5806\u758a\u8a18\u61b6\u9ad4\u76f8\u5c0d\u8f03\u5c0f\uff0c\u5806\u7a4d\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\u3002\u56e0\u6b64\u5806\u7a4d\u66f4\u52a0\u9069\u5408\u5132\u5b58\u5927\u578b\u9663\u5217\u3002
    3. \u9748\u6d3b\u6027\uff1a\u5806\u758a\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u9700\u8981\u5728\u7de8\u8b6f\u6642\u78ba\u5b9a\uff0c\u800c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u57f7\u884c\u6642\u52d5\u614b\u78ba\u5b9a\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u9663\u5217\u8981\u6c42\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u537b\u6c92\u6709\u5f37\u8abf\u76f8\u540c\u578b\u5225\u5462\uff1f

    \u93c8\u7d50\u4e32\u5217\u7531\u7bc0\u9ede\u7d44\u6210\uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u5f15\u7528\uff08\u6307\u6a19\uff09\u9023\u7dda\uff0c\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5132\u5b58\u4e0d\u540c\u578b\u5225\u7684\u8cc7\u6599\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

    \u76f8\u5c0d\u5730\uff0c\u9663\u5217\u5143\u7d20\u5247\u5fc5\u9808\u662f\u76f8\u540c\u578b\u5225\u7684\uff0c\u9019\u6a23\u624d\u80fd\u900f\u904e\u8a08\u7b97\u504f\u79fb\u91cf\u4f86\u7372\u53d6\u5c0d\u61c9\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u9663\u5217\u540c\u6642\u5305\u542b int \u548c long \u5169\u7a2e\u578b\u5225\uff0c\u55ae\u500b\u5143\u7d20\u5206\u5225\u4f54\u7528 4 \u4f4d\u5143\u7d44 \u548c 8 \u4f4d\u5143\u7d44 \uff0c\u6b64\u6642\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8a08\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u70ba\u9663\u5217\u4e2d\u5305\u542b\u4e86\u5169\u7a2e\u201c\u5143\u7d20\u9577\u5ea6\u201d\u3002

    # \u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740 = \u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09 + \u5143\u7d20\u9577\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

    Q\uff1a\u522a\u9664\u7bc0\u9ede P \u5f8c\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8a2d\u70ba None \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u5f9e\u8a72\u93c8\u7d50\u4e32\u5217\u7684\u89d2\u5ea6\u770b\uff0c\u5f9e\u982d\u7bc0\u9ede\u8d70\u8a2a\u5230\u5c3e\u7bc0\u9ede\u5df2\u7d93\u4e0d\u6703\u9047\u5230 P \u4e86\u3002\u9019\u610f\u5473\u8457\u7bc0\u9ede P \u5df2\u7d93\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u4e86\uff0c\u6b64\u6642\u7bc0\u9ede P \u6307\u5411\u54ea\u88e1\u90fd\u4e0d\u6703\u5c0d\u8a72\u93c8\u7d50\u4e32\u5217\u7522\u751f\u5f71\u97ff\u3002

    \u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff08\u505a\u984c\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65b7\u958b\u6c92\u6709\u95dc\u4fc2\uff0c\u53ea\u8981\u4fdd\u8b49\u7a0b\u5f0f\u7684\u908f\u8f2f\u662f\u6b63\u78ba\u7684\u5c31\u884c\u3002\u5f9e\u6a19\u6e96\u5eab\u7684\u89d2\u5ea6\u770b\uff0c\u65b7\u958b\u66f4\u52a0\u5b89\u5168\u3001\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65b7\u958b\uff0c\u5047\u8a2d\u88ab\u522a\u9664\u7bc0\u9ede\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u9ebc\u5b83\u6703\u5f71\u97ff\u5f8c\u7e7c\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u56de\u6536\u3002

    Q\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u522a\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u67e5\u8a62\u5143\u7d20\uff0c\u90a3\u70ba\u4ec0\u9ebc\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u8a62\u5143\u7d20\u3001\u518d\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u78ba\u5be6\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u7684 \\(O(1)\\) \u589e\u522a\u7684\u512a\u52e2\u53ef\u4ee5\u5728\u5176\u4ed6\u61c9\u7528\u4e0a\u5f97\u5230\u9ad4\u73fe\u3002\u4f8b\u5982\uff0c\u96d9\u5411\u4f47\u5217\u9069\u5408\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u6211\u5011\u7dad\u8b77\u4e00\u500b\u6307\u6a19\u8b8a\u6578\u59cb\u7d42\u6307\u5411\u982d\u7bc0\u9ede\u3001\u5c3e\u7bc0\u9ede\uff0c\u6bcf\u6b21\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    Q\uff1a\u5716\u201c\u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f\u201d\u4e2d\uff0c\u6dfa\u85cd\u8272\u7684\u5132\u5b58\u7bc0\u9ede\u6307\u6a19\u662f\u4f54\u7528\u4e00\u584a\u8a18\u61b6\u9ad4\u4f4d\u5740\u55ce\uff1f\u9084\u662f\u548c\u7bc0\u9ede\u503c\u5404\u4f54\u4e00\u534a\u5462\uff1f

    \u8a72\u793a\u610f\u5716\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

    • \u4e0d\u540c\u578b\u5225\u7684\u7bc0\u9ede\u503c\u4f54\u7528\u7684\u7a7a\u9593\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u4f8b\u9805\u7269\u4ef6\u7b49\u3002
    • \u6307\u6a19\u8b8a\u6578\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5927\u5c0f\u6839\u64da\u6240\u4f7f\u7528\u7684\u4f5c\u696d\u7cfb\u7d71\u53ca\u7de8\u8b6f\u74b0\u5883\u800c\u5b9a\uff0c\u5927\u591a\u70ba 8 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\u3002

    Q\uff1a\u5728\u4e32\u5217\u672b\u5c3e\u65b0\u589e\u5143\u7d20\u662f\u5426\u6642\u6642\u523b\u523b\u90fd\u70ba \\(O(1)\\) \uff1f

    \u5982\u679c\u65b0\u589e\u5143\u7d20\u6642\u8d85\u51fa\u4e32\u5217\u9577\u5ea6\uff0c\u5247\u9700\u8981\u5148\u64f4\u5bb9\u4e32\u5217\u518d\u65b0\u589e\u3002\u7cfb\u7d71\u6703\u7533\u8acb\u4e00\u584a\u65b0\u7684\u8a18\u61b6\u9ad4\uff0c\u4e26\u5c07\u539f\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u642c\u904b\u904e\u53bb\uff0c\u9019\u6642\u5019\u6642\u9593\u8907\u96dc\u5ea6\u5c31\u6703\u662f \\(O(n)\\) \u3002

    Q\uff1a\u201c\u4e32\u5217\u7684\u51fa\u73fe\u6975\u5927\u5730\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u201d\uff0c\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u662f\u6307\u984d\u5916\u589e\u52a0\u7684\u8b8a\u6578\u5982\u5bb9\u91cf\u3001\u9577\u5ea6\u3001\u64f4\u5bb9\u500d\u6578\u6240\u4f54\u7684\u8a18\u61b6\u9ad4\u55ce\uff1f

    \u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u4e3b\u8981\u6709\u5169\u65b9\u9762\u542b\u7fa9\uff1a\u4e00\u65b9\u9762\uff0c\u4e32\u5217\u90fd\u6703\u8a2d\u5b9a\u4e00\u500b\u521d\u59cb\u9577\u5ea6\uff0c\u6211\u5011\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u9019\u9ebc\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u70ba\u4e86\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\uff0c\u64f4\u5bb9\u4e00\u822c\u6703\u4e58\u4ee5\u4e00\u500b\u4fc2\u6578\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u9019\u6a23\u4e00\u4f86\uff0c\u4e5f\u6703\u51fa\u73fe\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u5011\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6eff\u5b83\u5011\u3002

    Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u5f8c\uff0c\u9019 3 \u500b\u5143\u7d20\u7684\u4f4d\u5740\u662f\u76f8\u9023\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u6703\u767c\u73fe\u5b83\u5011\u6bcf\u500b\u5143\u7d20\u7684 id \u4e26\u4e0d\u662f\u9023\u7e8c\u7684\uff0c\u800c\u662f\u5206\u5225\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u9019\u4e9b\u5143\u7d20\u7684\u4f4d\u5740\u4e0d\u9023\u7e8c\uff0c\u90a3\u9ebc m \u9084\u662f\u9663\u5217\u55ce\uff1f

    \u5047\u5982\u628a\u4e32\u5217\u5143\u7d20\u63db\u6210\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u9019 5 \u500b\u7bc0\u9ede\u7269\u4ef6\u4e5f\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u7136\u800c\uff0c\u7d66\u5b9a\u4e00\u500b\u4e32\u5217\u7d22\u5f15\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u7bc0\u9ede\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u8a2a\u554f\u5230\u5c0d\u61c9\u7684\u7bc0\u9ede\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u4e2d\u5132\u5b58\u7684\u662f\u7bc0\u9ede\u7684\u5f15\u7528\uff0c\u800c\u975e\u7bc0\u9ede\u672c\u8eab\u3002

    \u8207\u8a31\u591a\u8a9e\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6578\u5b57\u4e5f\u88ab\u5305\u88dd\u70ba\u7269\u4ef6\uff0c\u4e32\u5217\u4e2d\u5132\u5b58\u7684\u4e0d\u662f\u6578\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5c0d\u6578\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6703\u767c\u73fe\u5169\u500b\u9663\u5217\u4e2d\u7684\u76f8\u540c\u6578\u5b57\u64c1\u6709\u540c\u4e00\u500b id \uff0c\u4e26\u4e14\u9019\u4e9b\u6578\u5b57\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

    Q\uff1aC++ STL \u88e1\u9762\u7684 std::list \u5df2\u7d93\u5be6\u73fe\u4e86\u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u6f14\u7b97\u6cd5\u66f8\u4e0a\u4e0d\u600e\u9ebc\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u70ba\u6709\u4ec0\u9ebc\u4fb7\u9650\u6027\u5462\uff1f

    \u4e00\u65b9\u9762\uff0c\u6211\u5011\u5f80\u5f80\u66f4\u9752\u775e\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u6f14\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u6642\u624d\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\uff0c\u4e3b\u8981\u6709\u5169\u500b\u539f\u56e0\u3002

    • \u7a7a\u9593\u958b\u92b7\uff1a\u7531\u65bc\u6bcf\u500b\u5143\u7d20\u9700\u8981\u5169\u500b\u984d\u5916\u7684\u6307\u6a19\uff08\u4e00\u500b\u7528\u65bc\u524d\u4e00\u500b\u5143\u7d20\uff0c\u4e00\u500b\u7528\u65bc\u5f8c\u4e00\u500b\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u4f54\u7528\u7a7a\u9593\u3002
    • \u5feb\u53d6\u4e0d\u53cb\u597d\uff1a\u7531\u65bc\u8cc7\u6599\u4e0d\u662f\u9023\u7e8c\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5c0d\u5feb\u53d6\u7684\u5229\u7528\u7387\u8f03\u4f4e\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0cstd::vector \u7684\u6548\u80fd\u6703\u66f4\u597d\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u7684\u60c5\u6cc1\u4e3b\u8981\u662f\u4e8c\u5143\u6a39\u548c\u5716\u3002\u5806\u758a\u548c\u4f47\u5217\u5f80\u5f80\u6703\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u93c8\u7d50\u4e32\u5217\u3002

    Q\uff1a\u521d\u59cb\u5316\u4e32\u5217 res = [0] * self.size() \u64cd\u4f5c\uff0c\u6703\u5c0e\u81f4 res \u7684\u6bcf\u500b\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u4f4d\u5740\u55ce\uff1f

    \u4e0d\u6703\u3002\u4f46\u4e8c\u7dad\u9663\u5217\u6703\u6709\u9019\u500b\u554f\u984c\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7dad\u4e32\u5217 res = [[0] * self.size()] \uff0c\u5247\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u500b\u4e32\u5217 [0] \u3002

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

    Abstract

    \u6211\u5011\u5982\u540c\u8ff7\u5bae\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u9032\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u6703\u9047\u5230\u56f0\u96e3\u3002

    \u56de\u6eaf\u7684\u529b\u91cf\u8b93\u6211\u5011\u80fd\u5920\u91cd\u65b0\u958b\u59cb\uff0c\u4e0d\u65b7\u5617\u8a66\uff0c\u6700\u7d42\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

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

    \u56de\u6eaf\u6f14\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u7a2e\u900f\u904e\u7aae\u8209\u4f86\u89e3\u6c7a\u554f\u984c\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u5f9e\u4e00\u500b\u521d\u59cb\u72c0\u614b\u51fa\u767c\uff0c\u66b4\u529b\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u7576\u9047\u5230\u6b63\u78ba\u7684\u89e3\u5247\u5c07\u5176\u8a18\u9304\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5617\u8a66\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u90fd\u7121\u6cd5\u627e\u5230\u89e3\u70ba\u6b62\u3002

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u4f86\u8d70\u8a2a\u89e3\u7a7a\u9593\u3002\u5728\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u4e2d\uff0c\u6211\u5011\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5229\u7528\u524d\u5e8f\u8d70\u8a2a\u69cb\u9020\u4e00\u500b\u56de\u6eaf\u554f\u984c\uff0c\u9010\u6b65\u77ad\u89e3\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u4f8b\u984c\u4e00

    \u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\uff0c\u641c\u5c0b\u4e26\u8a18\u9304\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u7bc0\u9ede\u4e32\u5217\u3002

    \u5c0d\u65bc\u6b64\u984c\uff0c\u6211\u5011\u524d\u5e8f\u8d70\u8a2a\u9019\u68f5\u6a39\uff0c\u4e26\u5224\u65b7\u7576\u524d\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \uff0c\u82e5\u662f\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u7684\u503c\u52a0\u5165\u7d50\u679c\u4e32\u5217 res \u4e4b\u4e2d\u3002\u76f8\u95dc\u904e\u7a0b\u5be6\u73fe\u5982\u5716 13-1 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
    preorder_traversal_i_compact.cpp
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.java
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
    preorder_traversal_i_compact.go
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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            // \u8a18\u9304\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
    preorder_traversal_i_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.kt
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
    preorder_traversal_i_compact.rb
    [class]{}-[func]{pre_order}\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-1 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u4e2d\u641c\u7d22\u7bc0\u9ede

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5617\u8a66\u8207\u56de\u9000","text":"

    \u4e4b\u6240\u4ee5\u7a31\u4e4b\u70ba\u56de\u6eaf\u6f14\u7b97\u6cd5\uff0c\u662f\u56e0\u70ba\u8a72\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u89e3\u7a7a\u9593\u6642\u6703\u63a1\u7528\u201c\u5617\u8a66\u201d\u8207\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u7576\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u9047\u5230\u67d0\u500b\u72c0\u614b\u7121\u6cd5\u7e7c\u7e8c\u524d\u9032\u6216\u7121\u6cd5\u5f97\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u6642\uff0c\u5b83\u6703\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u5617\u8a66\u5176\u4ed6\u53ef\u80fd\u7684\u9078\u64c7\u3002

    \u5c0d\u65bc\u4f8b\u984c\u4e00\uff0c\u8a2a\u554f\u6bcf\u500b\u7bc0\u9ede\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5617\u8a66\u201d\uff0c\u800c\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u8fd4\u56de\u7236\u7bc0\u9ede\u7684 return \u5247\u8868\u793a\u201c\u56de\u9000\u201d\u3002

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u56de\u9000\u4e26\u4e0d\u50c5\u50c5\u5305\u62ec\u51fd\u5f0f\u8fd4\u56de\u3002\u70ba\u89e3\u91cb\u9019\u4e00\u9ede\uff0c\u6211\u5011\u5c0d\u4f8b\u984c\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

    \u4f8b\u984c\u4e8c

    \u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\u3002

    \u5728\u4f8b\u984c\u4e00\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u4e32\u5217 path \u8a18\u9304\u8a2a\u554f\u904e\u7684\u7bc0\u9ede\u8def\u5f91\u3002\u7576\u8a2a\u554f\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u8907\u88fd path \u4e26\u65b0\u589e\u9032\u7d50\u679c\u4e32\u5217 res \u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0cres \u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\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
    [class]{}-[func]{pre_order}\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u6bcf\u6b21\u201c\u5617\u8a66\u201d\u4e2d\uff0c\u6211\u5011\u900f\u904e\u5c07\u7576\u524d\u7bc0\u9ede\u65b0\u589e\u9032 path \u4f86\u8a18\u9304\u8def\u5f91\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u5011\u9700\u8981\u5c07\u8a72\u7bc0\u9ede\u5f9e path \u4e2d\u5f48\u51fa\uff0c\u4ee5\u6062\u5fa9\u672c\u6b21\u5617\u8a66\u4e4b\u524d\u7684\u72c0\u614b\u3002

    \u89c0\u5bdf\u5716 13-2 \u6240\u793a\u7684\u904e\u7a0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5617\u8a66\u548c\u56de\u9000\u7406\u89e3\u70ba\u201c\u524d\u9032\u201d\u8207\u201c\u64a4\u92b7\u201d\uff0c\u5169\u500b\u64cd\u4f5c\u4e92\u70ba\u9006\u5411\u3002

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

    \u5716 13-2 \u00a0 \u5617\u8a66\u8207\u56de\u9000

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

    \u8907\u96dc\u7684\u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u4e00\u500b\u6216\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u7d04\u675f\u689d\u4ef6\u901a\u5e38\u53ef\u7528\u65bc\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u984c\u4e09

    \u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\uff0c\u4e26\u8981\u6c42\u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u3002

    \u70ba\u4e86\u6eff\u8db3\u4ee5\u4e0a\u7d04\u675f\u689d\u4ef6\uff0c\u6211\u5011\u9700\u8981\u65b0\u589e\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\uff0c\u5247\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\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
    [class]{}-[func]{pre_order}\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u201c\u526a\u679d\u201d\u662f\u4e00\u500b\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8a5e\u3002\u5982\u5716 13-3 \u6240\u793a\uff0c\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u641c\u5c0b\u5206\u652f\uff0c\u907f\u514d\u8a31\u591a\u7121\u610f\u7fa9\u7684\u5617\u8a66\uff0c\u5f9e\u800c\u63d0\u9ad8\u4e86\u641c\u5c0b\u6548\u7387\u3002

    \u5716 13-3 \u00a0 \u6839\u64da\u7d04\u675f\u689d\u4ef6\u526a\u679d

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u7a0b\u5f0f\u78bc","text":"

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5617\u8a66\u5c07\u56de\u6eaf\u7684\u201c\u5617\u8a66\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u9ad4\u6846\u67b6\u63d0\u7149\u51fa\u4f86\uff0c\u63d0\u5347\u7a0b\u5f0f\u78bc\u7684\u901a\u7528\u6027\u3002

    \u5728\u4ee5\u4e0b\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\uff0cstate \u8868\u793a\u554f\u984c\u7684\u7576\u524d\u72c0\u614b\uff0cchoices \u8868\u793a\u7576\u524d\u72c0\u614b\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9078\u64c7\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    \n
    \n

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u57fa\u65bc\u6846\u67b6\u7a0b\u5f0f\u78bc\u4f86\u89e3\u6c7a\u4f8b\u984c\u4e09\u3002\u72c0\u614b state \u70ba\u7bc0\u9ede\u8d70\u8a2a\u8def\u5f91\uff0c\u9078\u64c7 choices \u70ba\u7576\u524d\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\uff0c\u7d50\u679c res \u662f\u8def\u5f91\u4e32\u5217\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8a18\u9304\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\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\u72c0\u614b\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u5fa9\u72c0\u614b\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
    preorder_traversal_iii_template.cpp
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.java
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.cs
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.go
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.swift
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.js
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.dart
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
    preorder_traversal_iii_template.rs
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8a18\u9304\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\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice.clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
    preorder_traversal_iii_template.c
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8a18\u9304\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\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution()) {\n        // \u8a18\u9304\u89e3\n        recordSolution();\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice();\n        }\n    }\n}\n
    preorder_traversal_iii_template.kt
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.rb
    [class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6839\u64da\u984c\u610f\uff0c\u6211\u5011\u5728\u627e\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u5f8c\u61c9\u8a72\u7e7c\u7e8c\u641c\u5c0b\uff0c\u56e0\u6b64\u9700\u8981\u5c07\u8a18\u9304\u89e3\u4e4b\u5f8c\u7684 return \u8a9e\u53e5\u522a\u9664\u3002\u5716 13-4 \u5c0d\u6bd4\u4e86\u4fdd\u7559\u6216\u522a\u9664 return \u8a9e\u53e5\u7684\u641c\u5c0b\u904e\u7a0b\u3002

    \u5716 13-4 \u00a0 \u4fdd\u7559\u8207\u522a\u9664 return \u7684\u641c\u5c0b\u904e\u7a0b\u5c0d\u6bd4

    \u76f8\u6bd4\u57fa\u65bc\u524d\u5e8f\u8d70\u8a2a\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\uff0c\u57fa\u65bc\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u96d6\u7136\u986f\u5f97\u56c9\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u56de\u6eaf\u554f\u984c\u53ef\u4ee5\u5728\u8a72\u6846\u67b6\u4e0b\u89e3\u6c7a\u3002\u6211\u5011\u53ea\u9700\u6839\u64da\u5177\u9ad4\u554f\u984c\u4f86\u5b9a\u7fa9 state \u548c choices \uff0c\u4e26\u5be6\u73fe\u6846\u67b6\u4e2d\u7684\u5404\u500b\u65b9\u6cd5\u5373\u53ef\u3002

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

    \u70ba\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u6211\u5011\u7e3d\u7d50\u4e00\u4e0b\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e2d\u5e38\u7528\u8853\u8a9e\u7684\u542b\u7fa9\uff0c\u4e26\u5c0d\u7167\u4f8b\u984c\u4e09\u7d66\u51fa\u5c0d\u61c9\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

    \u8868 13-1 \u00a0 \u5e38\u898b\u7684\u56de\u6eaf\u6f14\u7b97\u6cd5\u8853\u8a9e

    \u540d\u8a5e \u5b9a\u7fa9 \u4f8b\u984c\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6eff\u8db3\u554f\u984c\u7279\u5b9a\u689d\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u500b\u6216\u591a\u500b \u6839\u7bc0\u9ede\u5230\u7bc0\u9ede \\(7\\) \u7684\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u6240\u6709\u8def\u5f91 \u7d04\u675f\u689d\u4ef6\uff08constraint\uff09 \u7d04\u675f\u689d\u4ef6\u662f\u554f\u984c\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u689d\u4ef6\uff0c\u901a\u5e38\u7528\u65bc\u526a\u679d \u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u7bc0\u9ede \\(3\\) \u72c0\u614b\uff08state\uff09 \u72c0\u614b\u8868\u793a\u554f\u984c\u5728\u67d0\u4e00\u6642\u523b\u7684\u60c5\u6cc1\uff0c\u5305\u62ec\u5df2\u7d93\u505a\u51fa\u7684\u9078\u64c7 \u7576\u524d\u5df2\u8a2a\u554f\u7684\u7bc0\u9ede\u8def\u5f91\uff0c\u5373 path \u7bc0\u9ede\u4e32\u5217 \u5617\u8a66\uff08attempt\uff09 \u5617\u8a66\u662f\u6839\u64da\u53ef\u7528\u9078\u64c7\u4f86\u63a2\u7d22\u89e3\u7a7a\u9593\u7684\u904e\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\uff0c\u6aa2\u67e5\u662f\u5426\u70ba\u89e3 \u905e\u8ff4\u8a2a\u554f\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\uff0c\u5c07\u7bc0\u9ede\u65b0\u589e\u9032 path \uff0c\u5224\u65b7\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u72c0\u614b\u6642\uff0c\u64a4\u92b7\u524d\u9762\u505a\u51fa\u7684\u9078\u64c7\uff0c\u56de\u5230\u4e0a\u4e00\u500b\u72c0\u614b \u7576\u8d8a\u904e\u8449\u7bc0\u9ede\u3001\u7d50\u675f\u7bc0\u9ede\u8a2a\u554f\u3001\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\u7d42\u6b62\u641c\u5c0b\uff0c\u51fd\u5f0f\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u64da\u554f\u984c\u7279\u6027\u548c\u7d04\u675f\u689d\u4ef6\u907f\u514d\u7121\u610f\u7fa9\u7684\u641c\u5c0b\u8def\u5f91\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u5c0b\u6548\u7387 \u7576\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b

    Tip

    \u554f\u984c\u3001\u89e3\u3001\u72c0\u614b\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u4e0a\u662f\u4e00\u7a2e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u5617\u8a66\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\u76f4\u5230\u627e\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u3002\u9019\u7a2e\u65b9\u6cd5\u7684\u512a\u9ede\u5728\u65bc\u80fd\u5920\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\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\u8655\u7406\u5927\u898f\u6a21\u6216\u8005\u8907\u96dc\u554f\u984c\u6642\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6548\u7387\u53ef\u80fd\u96e3\u4ee5\u63a5\u53d7\u3002

    • \u6642\u9593\uff1a\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u8d70\u8a2a\u72c0\u614b\u7a7a\u9593\u7684\u6240\u6709\u53ef\u80fd\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u6307\u6578\u968e\u6216\u968e\u4e58\u968e\u3002
    • \u7a7a\u9593\uff1a\u5728\u905e\u8ff4\u547c\u53eb\u4e2d\u9700\u8981\u5132\u5b58\u7576\u524d\u7684\u72c0\u614b\uff08\u4f8b\u5982\u8def\u5f91\u3001\u7528\u65bc\u526a\u679d\u7684\u8f14\u52a9\u8b8a\u6578\u7b49\uff09\uff0c\u7576\u6df1\u5ea6\u5f88\u5927\u6642\uff0c\u7a7a\u9593\u9700\u6c42\u53ef\u80fd\u6703\u8b8a\u5f97\u5f88\u5927\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u7684\u6700\u4f73\u89e3\u6c7a\u65b9\u6848\u3002\u5c0d\u65bc\u9019\u4e9b\u554f\u984c\uff0c\u7531\u65bc\u7121\u6cd5\u9810\u6e2c\u54ea\u4e9b\u9078\u64c7\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u5011\u5fc5\u9808\u5c0d\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u9032\u884c\u8d70\u8a2a\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u95dc\u9375\u662f\u5982\u4f55\u6700\u4f73\u5316\u6548\u7387\uff0c\u5e38\u898b\u7684\u6548\u7387\u6700\u4f73\u5316\u65b9\u6cd5\u6709\u5169\u7a2e\u3002

    • \u526a\u679d\uff1a\u907f\u514d\u641c\u5c0b\u90a3\u4e9b\u80af\u5b9a\u4e0d\u6703\u7522\u751f\u89e3\u7684\u8def\u5f91\uff0c\u5f9e\u800c\u7bc0\u7701\u6642\u9593\u548c\u7a7a\u9593\u3002
    • \u555f\u767c\u5f0f\u641c\u5c0b\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8a08\u503c\uff0c\u5f9e\u800c\u512a\u5148\u641c\u5c0b\u6700\u6709\u53ef\u80fd\u7522\u751f\u6709\u6548\u89e3\u7684\u8def\u5f91\u3002
    "},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u984c","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u641c\u5c0b\u554f\u984c\u3001\u7d04\u675f\u6eff\u8db3\u554f\u984c\u548c\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u3002

    \u641c\u5c0b\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u89e3\u6c7a\u65b9\u6848\u3002

    • \u5168\u6392\u5217\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7d44\u5408\u3002
    • \u5b50\u96c6\u548c\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\u548c\u4e00\u500b\u76ee\u6a19\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u70ba\u76ee\u6a19\u548c\u7684\u5b50\u96c6\u3002
    • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5713\u76e4\uff0c\u8981\u6c42\u5c07\u6240\u6709\u5713\u76e4\u5f9e\u4e00\u6839\u67f1\u5b50\u79fb\u52d5\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\uff0c\u4e14\u4e0d\u80fd\u5c07\u5927\u5713\u76e4\u653e\u5728\u5c0f\u5713\u76e4\u4e0a\u3002

    \u7d04\u675f\u6eff\u8db3\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u6240\u6709\u7d04\u675f\u689d\u4ef6\u7684\u89e3\u3002

    • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76e4\u4e0a\u653e\u7f6e \\(n\\) \u500b\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u5011\u4e92\u4e0d\u653b\u64ca\u3002
    • \u6578\u7368\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7db2\u683c\u4e2d\u586b\u5165\u6578\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u500b \\(3 \\times 3\\) \u5b50\u7db2\u683c\u4e2d\u7684\u6578\u5b57\u4e0d\u91cd\u8907\u3002
    • \u5716\u8457\u8272\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u7528\u6700\u5c11\u7684\u984f\u8272\u7d66\u5716\u7684\u6bcf\u500b\u9802\u9ede\u8457\u8272\uff0c\u4f7f\u5f97\u76f8\u9130\u9802\u9ede\u984f\u8272\u4e0d\u540c\u3002

    \u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u4e00\u500b\u7d44\u5408\u7a7a\u9593\u4e2d\u627e\u5230\u6eff\u8db3\u67d0\u4e9b\u689d\u4ef6\u7684\u6700\u512a\u89e3\u3002

    • 0-1 \u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u80cc\u5305\uff0c\u6bcf\u500b\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u50f9\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5167\uff0c\u9078\u64c7\u7269\u54c1\u4f7f\u5f97\u7e3d\u50f9\u503c\u6700\u5927\u3002
    • \u65c5\u884c\u5546\u554f\u984c\uff1a\u5728\u4e00\u500b\u5716\u4e2d\uff0c\u5f9e\u4e00\u500b\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u6240\u6709\u5176\u4ed6\u9ede\u6070\u597d\u4e00\u6b21\u5f8c\u8fd4\u56de\u8d77\u9ede\uff0c\u6c42\u6700\u77ed\u8def\u5f91\u3002
    • \u6700\u5927\u5718\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u5716\uff0c\u5373\u5b50\u5716\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9802\u9ede\u4e4b\u9593\u90fd\u6709\u908a\u76f8\u9023\u3002

    \u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u512a\u89e3\u6c7a\u65b9\u6848\u3002

    • 0-1 \u80cc\u5305\u554f\u984c\u901a\u5e38\u4f7f\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\uff0c\u4ee5\u9054\u5230\u66f4\u9ad8\u7684\u6642\u9593\u6548\u7387\u3002
    • \u65c5\u884c\u5546\u662f\u4e00\u500b\u8457\u540d\u7684 NP-Hard \u554f\u984c\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u907a\u50b3\u6f14\u7b97\u6cd5\u548c\u87fb\u7fa4\u6f14\u7b97\u6cd5\u7b49\u3002
    • \u6700\u5927\u5718\u554f\u984c\u662f\u5716\u8ad6\u4e2d\u7684\u4e00\u500b\u7d93\u5178\u554f\u984c\uff0c\u53ef\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u555f\u767c\u5f0f\u6f14\u7b97\u6cd5\u4f86\u89e3\u6c7a\u3002
    "},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u554f\u984c","text":"

    Question

    \u6839\u64da\u570b\u969b\u8c61\u68cb\u7684\u898f\u5247\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u64ca\u8207\u540c\u8655\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u689d\u659c\u7dda\u4e0a\u7684\u68cb\u5b50\u3002\u7d66\u5b9a \\(n\\) \u500b\u7687\u540e\u548c\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5c0b\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u9593\u7121\u6cd5\u76f8\u4e92\u653b\u64ca\u7684\u64fa\u653e\u65b9\u6848\u3002

    \u5982\u5716 13-15 \u6240\u793a\uff0c\u7576 \\(n = 4\\) \u6642\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u5169\u500b\u89e3\u3002\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\u5171\u6709 \\(n^2\\) \u500b\u683c\u5b50\uff0c\u7d66\u51fa\u4e86\u6240\u6709\u7684\u9078\u64c7 choices \u3002\u5728\u9010\u500b\u653e\u7f6e\u7687\u540e\u7684\u904e\u7a0b\u4e2d\uff0c\u68cb\u76e4\u72c0\u614b\u5728\u4e0d\u65b7\u5730\u8b8a\u5316\uff0c\u6bcf\u500b\u6642\u523b\u7684\u68cb\u76e4\u5c31\u662f\u72c0\u614b state \u3002

    \u5716 13-15 \u00a0 4 \u7687\u540e\u554f\u984c\u7684\u89e3

    \u5716 13-16 \u5c55\u793a\u4e86\u672c\u984c\u7684\u4e09\u500b\u7d04\u675f\u689d\u4ef6\uff1a\u591a\u500b\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u689d\u5c0d\u89d2\u7dda\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5c0d\u89d2\u7dda\u5206\u70ba\u4e3b\u5c0d\u89d2\u7dda \\ \u548c\u6b21\u5c0d\u89d2\u7dda / \u5169\u7a2e\u3002

    \u5716 13-16 \u00a0 n \u7687\u540e\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6

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

    \u7687\u540e\u7684\u6578\u91cf\u548c\u68cb\u76e4\u7684\u884c\u6578\u90fd\u70ba \\(n\\) \uff0c\u56e0\u6b64\u6211\u5011\u5bb9\u6613\u5f97\u5230\u4e00\u500b\u63a8\u8ad6\uff1a\u68cb\u76e4\u6bcf\u884c\u90fd\u5141\u8a31\u4e14\u53ea\u5141\u8a31\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u5f9e\u7b2c\u4e00\u884c\u958b\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\uff0c\u76f4\u81f3\u6700\u5f8c\u4e00\u884c\u7d50\u675f\u3002

    \u5716 13-17 \u6240\u793a\u70ba \\(4\\) \u7687\u540e\u554f\u984c\u7684\u9010\u884c\u653e\u7f6e\u904e\u7a0b\u3002\u53d7\u756b\u5e45\u9650\u5236\uff0c\u5716 13-17 \u50c5\u5c55\u958b\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u500b\u641c\u5c0b\u5206\u652f\uff0c\u4e26\u4e14\u5c07\u4e0d\u6eff\u8db3\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u65b9\u6848\u90fd\u9032\u884c\u4e86\u526a\u679d\u3002

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

    \u5f9e\u672c\u8cea\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\u73fe\u591a\u500b\u7687\u540e\u7684\u6240\u6709\u641c\u5c0b\u5206\u652f\u3002

    "},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u8207\u5c0d\u89d2\u7dda\u526a\u679d","text":"

    \u70ba\u4e86\u6eff\u8db3\u5217\u7d04\u675f\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u5e03\u6797\u578b\u9663\u5217 cols \u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u6c7a\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u5011\u900f\u904e cols \u5c07\u5df2\u6709\u7687\u540e\u7684\u5217\u9032\u884c\u526a\u679d\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u52d5\u614b\u66f4\u65b0 cols \u7684\u72c0\u614b\u3002

    \u90a3\u9ebc\uff0c\u5982\u4f55\u8655\u7406\u5c0d\u89d2\u7dda\u7d04\u675f\u5462\uff1f\u8a2d\u68cb\u76e4\u4e2d\u67d0\u500b\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\((row, col)\\) \uff0c\u9078\u5b9a\u77e9\u9663\u4e2d\u7684\u67d0\u689d\u4e3b\u5c0d\u89d2\u7dda\uff0c\u6211\u5011\u767c\u73fe\u8a72\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u6e1b\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u70ba\u6046\u5b9a\u503c\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5982\u679c\u5169\u500b\u683c\u5b50\u6eff\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5247\u5b83\u5011\u4e00\u5b9a\u8655\u5728\u540c\u4e00\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u3002\u5229\u7528\u8a72\u898f\u5f8b\uff0c\u6211\u5011\u53ef\u4ee5\u85c9\u52a9\u5716 13-18 \u6240\u793a\u7684\u9663\u5217 diags1 \u8a18\u9304\u6bcf\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

    \u540c\u7406\uff0c\u6b21\u5c0d\u89d2\u7dda\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6046\u5b9a\u503c\u3002\u6211\u5011\u540c\u6a23\u4e5f\u53ef\u4ee5\u85c9\u52a9\u9663\u5217 diags2 \u4f86\u8655\u7406\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002

    \u5716 13-18 \u00a0 \u8655\u7406\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f

    "},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u8acb\u6ce8\u610f\uff0c\\(n\\) \u7dad\u65b9\u9663\u4e2d \\(row - col\\) \u7684\u7bc4\u570d\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u7bc4\u570d\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7684\u6578\u91cf\u90fd\u70ba \\(2n - 1\\) \uff0c\u5373\u9663\u5217 diags1 \u548c diags2 \u7684\u9577\u5ea6\u90fd\u70ba \\(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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u8d70\u8a2a\u6240\u6709\u5217\n    for col in range(n):\n        # \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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  # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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);           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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    // \u8a18\u9304\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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  // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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  // \u8d70\u8a2a\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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};           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u616e\u5217\u7d04\u675f\uff0c\u5247\u5f9e\u7b2c\u4e00\u884c\u5230\u6700\u5f8c\u4e00\u884c\u5206\u5225\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u500b\u9078\u64c7\uff0c\u4f7f\u7528 \\(O(n!)\\) \u6642\u9593\u3002\u7576\u8a18\u9304\u89e3\u6642\uff0c\u9700\u8981\u8907\u88fd\u77e9\u9663 state \u4e26\u65b0\u589e\u9032 res \uff0c\u8907\u88fd\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002\u56e0\u6b64\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n! \\cdot n^2)\\) \u3002\u5be6\u969b\u4e0a\uff0c\u6839\u64da\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u526a\u679d\u4e5f\u80fd\u5920\u5927\u5e45\u7e2e\u5c0f\u641c\u5c0b\u7a7a\u9593\uff0c\u56e0\u800c\u641c\u5c0b\u6548\u7387\u5f80\u5f80\u512a\u65bc\u4ee5\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u3002

    \u9663\u5217 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff0c\u9663\u5217 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

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

    \u5168\u6392\u5217\u554f\u984c\u662f\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u7684\u5b9a\u7fa9\u662f\u5728\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff08\u5982\u4e00\u500b\u9663\u5217\u6216\u5b57\u4e32\uff09\u7684\u60c5\u6cc1\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u8868 13-2 \u5217\u8209\u4e86\u5e7e\u500b\u793a\u4f8b\u8cc7\u6599\uff0c\u5305\u62ec\u8f38\u5165\u9663\u5217\u548c\u5c0d\u61c9\u7684\u6240\u6709\u6392\u5217\u3002

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

    \u8f38\u5165\u9663\u5217 \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 \u7121\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\u3002\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u5011\u5148\u9078\u64c7 \\(1\\) \uff0c\u518d\u9078\u64c7 \\(3\\) \uff0c\u6700\u5f8c\u9078\u64c7 \\(2\\) \uff0c\u5247\u7372\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u92b7\u4e00\u500b\u9078\u64c7\uff0c\u4e4b\u5f8c\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002

    \u5f9e\u56de\u6eaf\u7a0b\u5f0f\u78bc\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9078\u96c6\u5408 choices \u662f\u8f38\u5165\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72c0\u614b state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9078\u64c7\u7684\u5143\u7d20\u3002\u8acb\u6ce8\u610f\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u5141\u8a31\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u61c9\u8a72\u662f\u552f\u4e00\u7684\u3002

    \u5982\u5716 13-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u641c\u5c0b\u904e\u7a0b\u5c55\u958b\u6210\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u7576\u524d\u72c0\u614b state \u3002\u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u7d93\u904e\u4e09\u8f2a\u9078\u64c7\u5f8c\u5230\u9054\u8449\u7bc0\u9ede\uff0c\u6bcf\u500b\u8449\u7bc0\u9ede\u90fd\u5c0d\u61c9\u4e00\u500b\u6392\u5217\u3002

    \u5716 13-5 \u00a0 \u5168\u6392\u5217\u7684\u905e\u8ff4\u6a39

    "},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u8907\u9078\u64c7\u526a\u679d","text":"

    \u70ba\u4e86\u5be6\u73fe\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u6211\u5011\u8003\u616e\u5f15\u5165\u4e00\u500b\u5e03\u6797\u578b\u9663\u5217 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9078\u64c7\uff0c\u4e26\u57fa\u65bc\u5b83\u5be6\u73fe\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

    • \u5728\u505a\u51fa\u9078\u64c7 choice[i] \u5f8c\uff0c\u6211\u5011\u5c31\u5c07 selected[i] \u8ce6\u503c\u70ba \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9078\u64c7\u3002
    • \u8d70\u8a2a\u9078\u64c7\u4e32\u5217 choices \u6642\uff0c\u8df3\u904e\u6240\u6709\u5df2\u88ab\u9078\u64c7\u7684\u7bc0\u9ede\uff0c\u5373\u526a\u679d\u3002

    \u5982\u5716 13-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u7b2c\u4e00\u8f2a\u9078\u64c7 1 \uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7 3 \uff0c\u7b2c\u4e09\u8f2a\u9078\u64c7 2 \uff0c\u5247\u9700\u8981\u5728\u7b2c\u4e8c\u8f2a\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f2a\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

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

    \u89c0\u5bdf\u5716 13-6 \u767c\u73fe\uff0c\u8a72\u526a\u679d\u64cd\u4f5c\u5c07\u641c\u5c0b\u7a7a\u9593\u5927\u5c0f\u5f9e \\(O(n^n)\\) \u6e1b\u5c0f\u81f3 \\(O(n!)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u8cc7\u8a0a\u4e4b\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u70ba\u4e86\u7e2e\u77ed\u6574\u9ad4\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4e0d\u55ae\u7368\u5be6\u73fe\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u7684\u5404\u500b\u51fd\u5f0f\uff0c\u800c\u662f\u5c07\u5b83\u5011\u5c55\u958b\u5728 backtrack() \u51fd\u5f0f\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if not selected[i]:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    if (!selected[i]) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    Question

    \u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u8907\u7684\u6392\u5217\u3002

    \u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 1, 2]\\) \u3002\u70ba\u4e86\u65b9\u4fbf\u5340\u5206\u5169\u500b\u91cd\u8907\u5143\u7d20 \\(1\\) \uff0c\u6211\u5011\u5c07\u7b2c\u4e8c\u500b \\(1\\) \u8a18\u70ba \\(\\hat{1}\\) \u3002

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

    \u5716 13-7 \u00a0 \u91cd\u8907\u6392\u5217

    \u90a3\u9ebc\u5982\u4f55\u53bb\u9664\u91cd\u8907\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u76f4\u63a5\u5c0d\u6392\u5217\u7d50\u679c\u9032\u884c\u53bb\u91cd\u3002\u7136\u800c\u9019\u6a23\u505a\u4e0d\u5920\u512a\u96c5\uff0c\u56e0\u70ba\u751f\u6210\u91cd\u8907\u6392\u5217\u7684\u641c\u5c0b\u5206\u652f\u6c92\u6709\u5fc5\u8981\uff0c\u61c9\u7576\u63d0\u524d\u8b58\u5225\u4e26\u526a\u679d\uff0c\u9019\u6a23\u53ef\u4ee5\u9032\u4e00\u6b65\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002

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

    \u89c0\u5bdf\u5716 13-8 \uff0c\u5728\u7b2c\u4e00\u8f2a\u4e2d\uff0c\u9078\u64c7 \\(1\\) \u6216\u9078\u64c7 \\(\\hat{1}\\) \u662f\u7b49\u50f9\u7684\uff0c\u5728\u9019\u5169\u500b\u9078\u64c7\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u8907\u7684\u3002\u56e0\u6b64\u61c9\u8a72\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

    \u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(2\\) \u4e4b\u5f8c\uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u61c9\u5c07\u7b2c\u4e8c\u8f2a\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u5728\u67d0\u4e00\u8f2a\u9078\u64c7\u4e2d\uff0c\u4fdd\u8b49\u591a\u500b\u76f8\u7b49\u7684\u5143\u7d20\u50c5\u88ab\u9078\u64c7\u4e00\u6b21\u3002

    \u5716 13-8 \u00a0 \u91cd\u8907\u6392\u5217\u526a\u679d

    "},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5728\u4e0a\u4e00\u984c\u7684\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u8003\u616e\u5728\u6bcf\u4e00\u8f2a\u9078\u64c7\u4e2d\u958b\u555f\u4e00\u500b\u96dc\u6e4a\u8868 duplicated \uff0c\u7528\u65bc\u8a18\u9304\u8a72\u8f2a\u4e2d\u5df2\u7d93\u5617\u8a66\u904e\u7684\u5143\u7d20\uff0c\u4e26\u5c07\u91cd\u8907\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice)  # \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.emplace(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.Add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated[choice] = true; // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5047\u8a2d\u5143\u7d20\u5169\u5169\u4e4b\u9593\u4e92\u4e0d\u76f8\u540c\uff0c\u5247 \\(n\\) \u500b\u5143\u7d20\u5171\u6709 \\(n!\\) \u7a2e\u6392\u5217\uff08\u968e\u4e58\uff09\uff1b\u5728\u8a18\u9304\u7d50\u679c\u6642\uff0c\u9700\u8981\u8907\u88fd\u9577\u5ea6\u70ba \\(n\\) \u7684\u4e32\u5217\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n!n)\\) \u3002

    \u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u540c\u4e00\u6642\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u500b duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\u3002\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u5169\u7a2e\u526a\u679d\u5c0d\u6bd4","text":"

    \u8acb\u6ce8\u610f\uff0c\u96d6\u7136 selected \u548c duplicated \u90fd\u7528\u65bc\u526a\u679d\uff0c\u4f46\u5169\u8005\u7684\u76ee\u6a19\u4e0d\u540c\u3002

    • \u91cd\u8907\u9078\u64c7\u526a\u679d\uff1a\u6574\u500b\u641c\u5c0b\u904e\u7a0b\u4e2d\u53ea\u6709\u4e00\u500b selected \u3002\u5b83\u8a18\u9304\u7684\u662f\u7576\u524d\u72c0\u614b\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u500b\u5143\u7d20\u5728 state \u4e2d\u91cd\u8907\u51fa\u73fe\u3002
    • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f2a\u9078\u64c7\uff08\u6bcf\u500b\u547c\u53eb\u7684 backtrack \u51fd\u5f0f\uff09\u90fd\u5305\u542b\u4e00\u500b duplicated \u3002\u5b83\u8a18\u9304\u7684\u662f\u5728\u672c\u8f2a\u8d70\u8a2a\uff08for \u8ff4\u5708\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9078\u64c7\u904e\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8b49\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002

    \u5716 13-9 \u5c55\u793a\u4e86\u5169\u500b\u526a\u679d\u689d\u4ef6\u7684\u751f\u6548\u7bc4\u570d\u3002\u6ce8\u610f\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u9078\u64c7\uff0c\u5f9e\u6839\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\u69cb\u6210\u4e00\u500b\u6392\u5217\u3002

    \u5716 13-9 \u00a0 \u5169\u7a2e\u526a\u679d\u689d\u4ef6\u7684\u4f5c\u7528\u7bc4\u570d

    "},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u7121\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ef\u4ee5\u88ab\u9078\u53d6\u591a\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

    \u4f8b\u5982\uff0c\u8f38\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6a19\u6574\u6578 \\(9\\) \uff0c\u89e3\u70ba \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

    • \u8f38\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u91cd\u8907\u9078\u53d6\u3002
    • \u5b50\u96c6\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u500b\u5b50\u96c6\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c3\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

    \u985e\u4f3c\u65bc\u5168\u6392\u5217\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\uff0c\u4e26\u5728\u9078\u64c7\u904e\u7a0b\u4e2d\u5be6\u6642\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u7576\u5143\u7d20\u548c\u7b49\u65bc target \u6642\uff0c\u5c31\u5c07\u5b50\u96c6\u8a18\u9304\u81f3\u7d50\u679c\u4e32\u5217\u3002

    \u800c\u8207\u5168\u6392\u5217\u554f\u984c\u4e0d\u540c\u7684\u662f\uff0c\u672c\u984c\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u9078\u53d6\uff0c\u56e0\u6b64\u7121\u9808\u85c9\u52a9 selected \u5e03\u6797\u4e32\u5217\u4f86\u8a18\u9304\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9078\u64c7\u3002\u6211\u5011\u53ef\u4ee5\u5c0d\u5168\u6392\u5217\u7a0b\u5f0f\u78bc\u9032\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u984c\u7a0b\u5f0f\u78bc\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u8907\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
    subset_sum_i_naive.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i_naive.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
    subset_sum_i_naive.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
    subset_sum_i_naive.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6578\u91cf\u70ba0\n    backtrack(target, 0, nums, numsSize);\n}\n
    subset_sum_i_naive.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
    subset_sum_i_naive.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
    subset_sum_i_naive.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5411\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u8f38\u5165\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u8f38\u51fa\u7d50\u679c\u70ba \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u96d6\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u70ba \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u8907\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

    \u9019\u662f\u56e0\u70ba\u641c\u5c0b\u904e\u7a0b\u662f\u5340\u5206\u9078\u64c7\u9806\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u5340\u5206\u9078\u64c7\u9806\u5e8f\u3002\u5982\u5716 13-10 \u6240\u793a\uff0c\u5148\u9078 \\(4\\) \u5f8c\u9078 \\(5\\) \u8207\u5148\u9078 \\(5\\) \u5f8c\u9078 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5c0d\u61c9\u540c\u4e00\u500b\u5b50\u96c6\u3002

    \u5716 13-10 \u00a0 \u5b50\u96c6\u641c\u5c0b\u8207\u8d8a\u754c\u526a\u679d

    \u70ba\u4e86\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u601d\u8def\u662f\u5c0d\u7d50\u679c\u4e32\u5217\u9032\u884c\u53bb\u91cd\u3002\u4f46\u9019\u500b\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u5169\u65b9\u9762\u539f\u56e0\u3002

    • \u7576\u9663\u5217\u5143\u7d20\u8f03\u591a\uff0c\u5c24\u5176\u662f\u7576 target \u8f03\u5927\u6642\uff0c\u641c\u5c0b\u904e\u7a0b\u6703\u7522\u751f\u5927\u91cf\u7684\u91cd\u8907\u5b50\u96c6\u3002
    • \u6bd4\u8f03\u5b50\u96c6\uff08\u9663\u5217\uff09\u7684\u7570\u540c\u975e\u5e38\u8017\u6642\uff0c\u9700\u8981\u5148\u6392\u5e8f\u9663\u5217\uff0c\u518d\u6bd4\u8f03\u9663\u5217\u4e2d\u6bcf\u500b\u5143\u7d20\u7684\u7570\u540c\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u8907\u5b50\u96c6\u526a\u679d","text":"

    \u6211\u5011\u8003\u616e\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u900f\u904e\u526a\u679d\u9032\u884c\u53bb\u91cd\u3002\u89c0\u5bdf\u5716 13-11 \uff0c\u91cd\u8907\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u9806\u5e8f\u9078\u64c7\u9663\u5217\u5143\u7d20\u6642\u7522\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u6cc1\u3002

    1. \u7576\u7b2c\u4e00\u8f2a\u548c\u7b2c\u4e8c\u8f2a\u5206\u5225\u9078\u64c7 \\(3\\) \u548c \\(4\\) \u6642\uff0c\u6703\u751f\u6210\u5305\u542b\u9019\u5169\u500b\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8a18\u70ba \\([3, 4, \\dots]\\) \u3002
    2. \u4e4b\u5f8c\uff0c\u7576\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(4\\) \u6642\uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \uff0c\u56e0\u70ba\u8a72\u9078\u64c7\u7522\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

    \u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c64\u7684\u9078\u64c7\u90fd\u662f\u5f9e\u5de6\u5230\u53f3\u88ab\u9010\u500b\u5617\u8a66\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

    1. \u524d\u5169\u8f2a\u9078\u64c7 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
    2. \u524d\u5169\u8f2a\u9078\u64c7 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
    3. \u82e5\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(5\\) \uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u70ba\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u8207\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

    \u5716 13-11 \u00a0 \u4e0d\u540c\u9078\u64c7\u9806\u5e8f\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

    \u7e3d\u7d50\u4f86\u770b\uff0c\u7d66\u5b9a\u8f38\u5165\u9663\u5217 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8a2d\u641c\u5c0b\u904e\u7a0b\u4e2d\u7684\u9078\u64c7\u5e8f\u5217\u70ba \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5247\u8a72\u9078\u64c7\u5e8f\u5217\u9700\u8981\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6eff\u8db3\u8a72\u689d\u4ef6\u7684\u9078\u64c7\u5e8f\u5217\u90fd\u6703\u9020\u6210\u91cd\u8907\uff0c\u61c9\u7576\u526a\u679d\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u70ba\u5be6\u73fe\u8a72\u526a\u679d\uff0c\u6211\u5011\u521d\u59cb\u5316\u8b8a\u6578 start \uff0c\u7528\u65bc\u6307\u793a\u8d70\u8a2a\u8d77\u59cb\u9ede\u3002\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i\\) \u958b\u59cb\u8d70\u8a2a\u3002\u9019\u6a23\u505a\u5c31\u53ef\u4ee5\u8b93\u9078\u64c7\u5e8f\u5217\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u5f9e\u800c\u4fdd\u8b49\u5b50\u96c6\u552f\u4e00\u3002

    \u9664\u6b64\u4e4b\u5916\uff0c\u6211\u5011\u9084\u5c0d\u7a0b\u5f0f\u78bc\u9032\u884c\u4e86\u4ee5\u4e0b\u5169\u9805\u6700\u4f73\u5316\u3002

    • \u5728\u958b\u555f\u641c\u5c0b\u524d\uff0c\u5148\u5c07\u9663\u5217 nums \u6392\u5e8f\u3002\u5728\u8d70\u8a2a\u6240\u6709\u9078\u64c7\u6642\uff0c\u7576\u5b50\u96c6\u548c\u8d85\u904e target \u6642\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\uff0c\u56e0\u70ba\u5f8c\u908a\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target \u3002
    • \u7701\u53bb\u5143\u7d20\u548c\u8b8a\u6578 total \uff0c\u900f\u904e\u5728 target \u4e0a\u57f7\u884c\u6e1b\u6cd5\u4f86\u7d71\u8a08\u5143\u7d20\u548c\uff0c\u7576 target \u7b49\u65bc \\(0\\) \u6642\u8a18\u9304\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_i.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_i.js
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_i.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_i.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                           // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    backtrack(target, nums, numsSize, start);\n}\n
    subset_sum_i.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_i.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
    subset_sum_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-12 \u6240\u793a\u70ba\u5c07\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u8f38\u5165\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u5f8c\u7684\u6574\u9ad4\u56de\u6eaf\u904e\u7a0b\u3002

    \u5716 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u904e\u7a0b

    "},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u616e\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u53ef\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

    \u76f8\u6bd4\u65bc\u4e0a\u984c\uff0c\u672c\u984c\u7684\u8f38\u5165\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u9019\u5f15\u5165\u4e86\u65b0\u7684\u554f\u984c\u3002\u4f8b\u5982\uff0c\u7d66\u5b9a\u9663\u5217 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u5247\u73fe\u6709\u7a0b\u5f0f\u78bc\u7684\u8f38\u51fa\u7d50\u679c\u70ba \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73fe\u4e86\u91cd\u8907\u5b50\u96c6\u3002

    \u9020\u6210\u9019\u7a2e\u91cd\u8907\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f2a\u4e2d\u88ab\u591a\u6b21\u9078\u64c7\u3002\u5728\u5716 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f2a\u5171\u6709\u4e09\u500b\u9078\u64c7\uff0c\u5176\u4e2d\u5169\u500b\u90fd\u70ba \\(4\\) \uff0c\u6703\u7522\u751f\u5169\u500b\u91cd\u8907\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5f9e\u800c\u8f38\u51fa\u91cd\u8907\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f2a\u7684\u5169\u500b \\(4\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002

    \u5716 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

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

    \u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5be6\u73fe\u65b9\u5f0f\u6bd4\u8f03\u5de7\u5999\uff1a\u7531\u65bc\u9663\u5217\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u9130\u7684\u3002\u9019\u610f\u5473\u8457\u5728\u67d0\u8f2a\u9078\u64c7\u4e2d\uff0c\u82e5\u7576\u524d\u5143\u7d20\u8207\u5176\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u5247\u8aaa\u660e\u5b83\u5df2\u7d93\u88ab\u9078\u64c7\u904e\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u904e\u7576\u524d\u5143\u7d20\u3002

    \u8207\u6b64\u540c\u6642\uff0c\u672c\u984c\u898f\u5b9a\u6bcf\u500b\u9663\u5217\u5143\u7d20\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5e78\u904b\u7684\u662f\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u5229\u7528\u8b8a\u6578 start \u4f86\u6eff\u8db3\u8a72\u7d04\u675f\uff1a\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i + 1\\) \u958b\u59cb\u5411\u5f8c\u8d70\u8a2a\u3002\u9019\u6a23\u65e2\u80fd\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u8907\u9078\u64c7\u5143\u7d20\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_ii.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_ii.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_ii.js
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_ii.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_ii.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u8df3\u904e\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u958b\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
    subset_sum_ii.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_ii.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
    subset_sum_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-14 \u5c55\u793a\u4e86\u9663\u5217 \\([4, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u904e\u7a0b\uff0c\u5171\u5305\u542b\u56db\u7a2e\u526a\u679d\u64cd\u4f5c\u3002\u8acb\u4f60\u5c07\u5716\u793a\u8207\u7a0b\u5f0f\u78bc\u8a3b\u91cb\u76f8\u7d50\u5408\uff0c\u7406\u89e3\u6574\u500b\u641c\u5c0b\u904e\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u7a2e\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

    \u5716 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u904e\u7a0b

    "},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u662f\u7aae\u8209\u6cd5\uff0c\u900f\u904e\u5c0d\u89e3\u7a7a\u9593\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4f86\u5c0b\u627e\u7b26\u5408\u689d\u4ef6\u7684\u89e3\u3002\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u9047\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u5247\u8a18\u9304\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u8d70\u8a2a\u5b8c\u6210\u5f8c\u7d50\u675f\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u641c\u5c0b\u904e\u7a0b\u5305\u62ec\u5617\u8a66\u8207\u56de\u9000\u5169\u500b\u90e8\u5206\u3002\u5b83\u900f\u904e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4f86\u5617\u8a66\u5404\u7a2e\u9078\u64c7\uff0c\u7576\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u60c5\u6cc1\u6642\uff0c\u5247\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002\u5617\u8a66\u8207\u56de\u9000\u662f\u5169\u500b\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
    • \u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u5b83\u5011\u53ef\u7528\u65bc\u5be6\u73fe\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7d50\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u5c0b\u6548\u7387\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u65bc\u89e3\u6c7a\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u3002\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u96d6\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u6f14\u7b97\u6cd5\u89e3\u6c7a\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
    • \u5168\u6392\u5217\u554f\u984c\u65e8\u5728\u641c\u5c0b\u7d66\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u500b\u5143\u7d20\u662f\u5426\u88ab\u9078\u64c7\uff0c\u526a\u6389\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\u7684\u641c\u5c0b\u5206\u652f\uff0c\u78ba\u4fdd\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002
    • \u5728\u5168\u6392\u5217\u554f\u984c\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff0c\u5247\u6700\u7d42\u7d50\u679c\u6703\u51fa\u73fe\u91cd\u8907\u6392\u5217\u3002\u6211\u5011\u9700\u8981\u7d04\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u9019\u901a\u5e38\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002
    • \u5b50\u96c6\u548c\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u7d66\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u70ba\u76ee\u6a19\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u800c\u641c\u5c0b\u904e\u7a0b\u6703\u8f38\u51fa\u6240\u6709\u9806\u5e8f\u7684\u7d50\u679c\uff0c\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002\u6211\u5011\u5728\u56de\u6eaf\u524d\u5c07\u8cc7\u6599\u9032\u884c\u6392\u5e8f\uff0c\u4e26\u8a2d\u5b9a\u4e00\u500b\u8b8a\u6578\u4f86\u6307\u793a\u6bcf\u4e00\u8f2a\u7684\u8d70\u8a2a\u8d77\u59cb\u9ede\uff0c\u5f9e\u800c\u5c07\u751f\u6210\u91cd\u8907\u5b50\u96c6\u7684\u641c\u5c0b\u5206\u652f\u9032\u884c\u526a\u679d\u3002
    • \u5c0d\u65bc\u5b50\u96c6\u548c\u554f\u984c\uff0c\u9663\u5217\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u6703\u7522\u751f\u91cd\u8907\u96c6\u5408\u3002\u6211\u5011\u5229\u7528\u9663\u5217\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\uff0c\u900f\u904e\u5224\u65b7\u76f8\u9130\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5be6\u73fe\u526a\u679d\uff0c\u5f9e\u800c\u78ba\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u4e2d\u4e00\u6b21\u3002
    • \\(n\\) \u7687\u540e\u554f\u984c\u65e8\u5728\u5c0b\u627e\u5c07 \\(n\\) \u500b\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76e4\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u5169\u5169\u4e4b\u9593\u7121\u6cd5\u653b\u64ca\u5c0d\u65b9\u3002\u8a72\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6\u6709\u884c\u7d04\u675f\u3001\u5217\u7d04\u675f\u3001\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002\u70ba\u6eff\u8db3\u884c\u7d04\u675f\uff0c\u6211\u5011\u63a1\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8b49\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002
    • \u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u8655\u7406\u65b9\u5f0f\u985e\u4f3c\u3002\u5c0d\u65bc\u5217\u7d04\u675f\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u5f9e\u800c\u6307\u793a\u9078\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5c0d\u65bc\u5c0d\u89d2\u7dda\u7d04\u675f\uff0c\u6211\u5011\u85c9\u52a9\u5169\u500b\u9663\u5217\u4f86\u5206\u5225\u8a18\u9304\u8a72\u4e3b\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96e3\u9ede\u5728\u65bc\u627e\u8655\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5c0d\u89d2\u7dda\u4e0a\u683c\u5b50\u6eff\u8db3\u7684\u884c\u5217\u7d22\u5f15\u898f\u5f8b\u3002
    "},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u600e\u9ebc\u7406\u89e3\u56de\u6eaf\u548c\u905e\u8ff4\u7684\u95dc\u4fc2\uff1f

    \u7e3d\u7684\u4f86\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u7a2e\u201c\u6f14\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u905e\u8ff4\u66f4\u50cf\u662f\u4e00\u500b\u201c\u5de5\u5177\u201d\u3002

    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u905e\u8ff4\u7684\u61c9\u7528\u5834\u666f\u4e4b\u4e00\uff0c\u662f\u905e\u8ff4\u5728\u641c\u5c0b\u554f\u984c\u4e2d\u7684\u61c9\u7528\u3002
    • \u905e\u8ff4\u7684\u7d50\u69cb\u9ad4\u73fe\u4e86\u201c\u5b50\u554f\u984c\u5206\u89e3\u201d\u7684\u89e3\u984c\u7bc4\u5f0f\uff0c\u5e38\u7528\u65bc\u89e3\u6c7a\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\uff08\u8a18\u61b6\u5316\u905e\u8ff4\uff09\u7b49\u554f\u984c\u3002
    "},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    Abstract

    \u8907\u96dc\u5ea6\u5206\u6790\u7336\u5982\u6d69\u701a\u7684\u6f14\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u6642\u7a7a\u56ae\u5c0e\u3002

    \u5b83\u5e36\u9818\u6211\u5011\u5728\u6642\u9593\u8207\u7a7a\u9593\u9019\u5169\u500b\u7dad\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5c0b\u627e\u66f4\u512a\u96c5\u7684\u89e3\u6c7a\u65b9\u6848\u3002

    "},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30
    • 2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4
    • 2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6
    • 2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6
    • 2.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4","text":"

    \u5728\u6f14\u7b97\u6cd5\u4e2d\uff0c\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u662f\u5f88\u5e38\u898b\u7684\uff0c\u5b83\u8207\u8907\u96dc\u5ea6\u5206\u6790\u606f\u606f\u76f8\u95dc\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7d39\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u4e4b\u524d\uff0c\u6211\u5011\u5148\u4f86\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5f0f\u4e2d\u5be6\u73fe\u91cd\u8907\u57f7\u884c\u4efb\u52d9\uff0c\u5373\u5169\u7a2e\u57fa\u672c\u7684\u7a0b\u5f0f\u63a7\u5236\u7d50\u69cb\uff1a\u8fed\u4ee3\u3001\u905e\u8ff4\u3002

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

    \u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u7a2e\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u7684\u63a7\u5236\u7d50\u69cb\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5f0f\u6703\u5728\u6eff\u8db3\u4e00\u5b9a\u7684\u689d\u4ef6\u4e0b\u91cd\u8907\u57f7\u884c\u67d0\u6bb5\u7a0b\u5f0f\u78bc\uff0c\u76f4\u5230\u9019\u500b\u689d\u4ef6\u4e0d\u518d\u6eff\u8db3\u3002

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

    for \u8ff4\u5708\u662f\u6700\u5e38\u898b\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9069\u5408\u5728\u9810\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6578\u6642\u4f7f\u7528\u3002

    \u4ee5\u4e0b\u51fd\u5f0f\u57fa\u65bc for \u8ff4\u5708\u5be6\u73fe\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7d50\u679c\u4f7f\u7528\u8b8a\u6578 res \u8a18\u9304\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5c0d\u61c9\u7684\u5340\u9593\u662f\u201c\u5de6\u9589\u53f3\u958b\u201d\u7684\uff0c\u5c0d\u61c9\u7684\u8d70\u8a2a\u7bc4\u570d\u70ba \\(a, a + 1, \\dots, b-1\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def for_loop(n: int) -> int:\n    \"\"\"for \u8ff4\u5708\"\"\"\n    res = 0\n    # \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint ForLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunc forLoop(n int) int {\n    res := 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunction forLoop(n) {\n    let res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n  int res = 0;\n  // \u8ff4\u5708\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 \u8ff4\u5708 */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
    iteration.c
    /* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 ###\ndef for_loop(n)\n  res = 0\n\n  # \u8ff4\u5708\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 \u8ff4\u5708\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u8ff4\u5708\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-1 \u662f\u8a72\u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716\u3002

    \u5716 2-1 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716

    \u6b64\u6c42\u548c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6210\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u9019\u500b\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u76f8\u95dc\u5167\u5bb9\u5c07\u6703\u5728\u4e0b\u4e00\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

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

    \u8207 for \u8ff4\u5708\u985e\u4f3c\uff0cwhile \u8ff4\u5708\u4e5f\u662f\u4e00\u7a2e\u5be6\u73fe\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u7a0b\u5f0f\u6bcf\u8f2a\u90fd\u6703\u5148\u6aa2\u67e5\u689d\u4ef6\uff0c\u5982\u679c\u689d\u4ef6\u70ba\u771f\uff0c\u5247\u7e7c\u7e8c\u57f7\u884c\uff0c\u5426\u5247\u5c31\u7d50\u675f\u8ff4\u5708\u3002

    \u4e0b\u9762\u6211\u5011\u7528 while \u8ff4\u5708\u4f86\u5be6\u73fe\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    while \u8ff4\u5708\u6bd4 for \u8ff4\u5708\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u81ea\u7531\u5730\u8a2d\u8a08\u689d\u4ef6\u8b8a\u6578\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9a5f\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u689d\u4ef6\u8b8a\u6578 \\(i\\) \u6bcf\u8f2a\u9032\u884c\u5169\u6b21\u66f4\u65b0\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u8ff4\u5708\u5be6\u73fe\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u7684\u4f86\u8aaa\uff0cfor \u8ff4\u5708\u7684\u7a0b\u5f0f\u78bc\u66f4\u52a0\u7dca\u6e4a\uff0cwhile \u8ff4\u5708\u66f4\u52a0\u9748\u6d3b\uff0c\u5169\u8005\u90fd\u53ef\u4ee5\u5be6\u73fe\u8fed\u4ee3\u7d50\u69cb\u3002\u9078\u64c7\u4f7f\u7528\u54ea\u4e00\u500b\u61c9\u8a72\u6839\u64da\u7279\u5b9a\u554f\u984c\u7684\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5de2\u72c0\u8ff4\u5708","text":"

    \u6211\u5011\u53ef\u4ee5\u5728\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\u5167\u5de2\u72c0\u53e6\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\uff0c\u4e0b\u9762\u4ee5 for \u8ff4\u5708\u70ba\u4f8b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def nested_for_loop(n: int) -> str:\n    \"\"\"\u96d9\u5c64 for \u8ff4\u5708\"\"\"\n    res = \"\"\n    # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
    iteration.swift
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nchar *nestedForLoop(int n) {\n    // n * n \u70ba\u5c0d\u61c9\u9ede\u6578\u91cf\uff0c\"(i, j), \" \u5c0d\u61c9\u5b57\u4e32\u9577\u6700\u5927\u70ba 6+10*2\uff0c\u52a0\u4e0a\u6700\u5f8c\u4e00\u500b\u7a7a\u5b57\u5143 \\0 \u7684\u984d\u5916\u7a7a\u9593\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u8ff4\u5708 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
    ### \u96d9\u5c64 for \u8ff4\u5708 ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u8ff4\u5708 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
    // \u96d9\u5c64 for \u8ff4\u5708\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    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u8ff4\u5708 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-2 \u662f\u8a72\u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716\u3002

    \u5716 2-2 \u00a0 \u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716

    \u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207 \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u548c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u95dc\u4fc2\u201d\u3002

    \u6211\u5011\u53ef\u4ee5\u7e7c\u7e8c\u65b0\u589e\u5de2\u72c0\u8ff4\u5708\uff0c\u6bcf\u4e00\u6b21\u5de2\u72c0\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7dad\u201d\uff0c\u5c07\u6703\u4f7f\u6642\u9593\u8907\u96dc\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u95dc\u4fc2\u201d\u201c\u56db\u6b21\u65b9\u95dc\u4fc2\u201d\uff0c\u4ee5\u6b64\u985e\u63a8\u3002

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

    \u905e\u8ff4\uff08recursion\uff09\u662f\u4e00\u7a2e\u6f14\u7b97\u6cd5\u7b56\u7565\uff0c\u900f\u904e\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\u4f86\u89e3\u6c7a\u554f\u984c\u3002\u5b83\u4e3b\u8981\u5305\u542b\u5169\u500b\u968e\u6bb5\u3002

    1. \u905e\uff1a\u7a0b\u5f0f\u4e0d\u65b7\u6df1\u5165\u5730\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u50b3\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\uff0c\u76f4\u5230\u9054\u5230\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u3002
    2. \u8ff4\uff1a\u89f8\u767c\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u5f8c\uff0c\u7a0b\u5f0f\u5f9e\u6700\u6df1\u5c64\u7684\u905e\u8ff4\u51fd\u5f0f\u958b\u59cb\u9010\u5c64\u8fd4\u56de\uff0c\u532f\u805a\u6bcf\u4e00\u5c64\u7684\u7d50\u679c\u3002

    \u800c\u5f9e\u5be6\u73fe\u7684\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u7a0b\u5f0f\u78bc\u4e3b\u8981\u5305\u542b\u4e09\u500b\u8981\u7d20\u3002

    1. \u7d42\u6b62\u689d\u4ef6\uff1a\u7528\u65bc\u6c7a\u5b9a\u4ec0\u9ebc\u6642\u5019\u7531\u201c\u905e\u201d\u8f49\u201c\u8ff4\u201d\u3002
    2. \u905e\u8ff4\u547c\u53eb\uff1a\u5c0d\u61c9\u201c\u905e\u201d\uff0c\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u8f38\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\u3002
    3. \u8fd4\u56de\u7d50\u679c\uff1a\u5c0d\u61c9\u201c\u8ff4\u201d\uff0c\u5c07\u7576\u524d\u905e\u8ff4\u5c64\u7d1a\u7684\u7d50\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c64\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u53ea\u9700\u547c\u53eb\u51fd\u5f0f recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8a08\u7b97\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def recur(n: int) -> int:\n    \"\"\"\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 1:\n        return 1\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res = recur(n - 1)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n
    recursion.cpp
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.java
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.cs
    /* \u905e\u8ff4 */\nint Recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = Recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.go
    /* \u905e\u8ff4 */\nfunc recur(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res := recur(n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.swift
    /* \u905e\u8ff4 */\nfunc recur(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n: n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.js
    /* \u905e\u8ff4 */\nfunction recur(n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.ts
    /* \u905e\u8ff4 */\nfunction recur(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.dart
    /* \u905e\u8ff4 */\nint recur(int n) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 1) return 1;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  int res = recur(n - 1);\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  return n + res;\n}\n
    recursion.rs
    /* \u905e\u8ff4 */\nfn recur(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    n + res\n}\n
    recursion.c
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.kt
    /* \u905e\u8ff4 */\nfun recur(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    val res = recur(n - 1)\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.rb
    ### \u905e\u8ff4 ###\ndef recur(n)\n  # \u7d42\u6b62\u689d\u4ef6\n  return 1 if n == 1\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  res = recur(n - 1)\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  n + res\nend\n
    recursion.zig
    // \u905e\u8ff4\u51fd\u5f0f\nfn recur(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var res: i32 = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-3 \u5c55\u793a\u4e86\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b\u3002

    \u5716 2-3 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b

    \u96d6\u7136\u5f9e\u8a08\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u8207\u905e\u8ff4\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7d50\u679c\uff0c\u4f46\u5b83\u5011\u4ee3\u8868\u4e86\u5169\u7a2e\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u6c7a\u554f\u984c\u7684\u7bc4\u5f0f\u3002

    • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5f9e\u6700\u57fa\u790e\u7684\u6b65\u9a5f\u958b\u59cb\uff0c\u7136\u5f8c\u4e0d\u65b7\u91cd\u8907\u6216\u7d2f\u52a0\u9019\u4e9b\u6b65\u9a5f\uff0c\u76f4\u5230\u4efb\u52d9\u5b8c\u6210\u3002
    • \u905e\u8ff4\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u9019\u4e9b\u5b50\u554f\u984c\u548c\u539f\u554f\u984c\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u4f86\u5c07\u5b50\u554f\u984c\u7e7c\u7e8c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u6cc1\u6642\u505c\u6b62\uff08\u57fa\u672c\u60c5\u6cc1\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

    \u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u5f0f\u70ba\u4f8b\uff0c\u8a2d\u554f\u984c \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

    • \u8fed\u4ee3\uff1a\u5728\u8ff4\u5708\u4e2d\u6a21\u64ec\u6c42\u548c\u904e\u7a0b\uff0c\u5f9e \\(1\\) \u8d70\u8a2a\u5230 \\(n\\) \uff0c\u6bcf\u8f2a\u57f7\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
    • \u905e\u8ff4\uff1a\u5c07\u554f\u984c\u5206\u89e3\u70ba\u5b50\u554f\u984c \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65b7\uff08\u905e\u8ff4\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u6cc1 \\(f(1) = 1\\) \u6642\u7d42\u6b62\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u547c\u53eb\u5806\u758a","text":"

    \u905e\u8ff4\u51fd\u5f0f\u6bcf\u6b21\u547c\u53eb\u81ea\u8eab\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u70ba\u65b0\u958b\u555f\u7684\u51fd\u5f0f\u5206\u914d\u8a18\u61b6\u9ad4\uff0c\u4ee5\u5132\u5b58\u5340\u57df\u6027\u8b8a\u6578\u3001\u547c\u53eb\u4f4d\u5740\u548c\u5176\u4ed6\u8cc7\u8a0a\u7b49\u3002\u9019\u5c07\u5c0e\u81f4\u5169\u65b9\u9762\u7684\u7d50\u679c\u3002

    • \u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u90fd\u5132\u5b58\u5728\u7a31\u70ba\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u7684\u8a18\u61b6\u9ad4\u5340\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u5f0f\u8fd4\u56de\u5f8c\u624d\u6703\u88ab\u91cb\u653e\u3002\u56e0\u6b64\uff0c\u905e\u8ff4\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u905e\u8ff4\u547c\u53eb\u51fd\u5f0f\u6703\u7522\u751f\u984d\u5916\u7684\u958b\u92b7\u3002\u56e0\u6b64\u905e\u8ff4\u901a\u5e38\u6bd4\u8ff4\u5708\u7684\u6642\u9593\u6548\u7387\u66f4\u4f4e\u3002

    \u5982\u5716 2-4 \u6240\u793a\uff0c\u5728\u89f8\u767c\u7d42\u6b62\u689d\u4ef6\u524d\uff0c\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u51fd\u5f0f\uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002

    \u5716 2-4 \u00a0 \u905e\u8ff4\u547c\u53eb\u6df1\u5ea6

    \u5728\u5be6\u969b\u4e2d\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u5141\u8a31\u7684\u905e\u8ff4\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u904e\u6df1\u7684\u905e\u8ff4\u53ef\u80fd\u5c0e\u81f4\u5806\u758a\u6ea2\u4f4d\u932f\u8aa4\u3002

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

    \u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u5f0f\u5728\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u6b65\u624d\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5247\u8a72\u51fd\u5f0f\u53ef\u4ee5\u88ab\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u6700\u4f73\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u9593\u6548\u7387\u4e0a\u8207\u8fed\u4ee3\u76f8\u7576\u3002\u9019\u7a2e\u60c5\u6cc1\u88ab\u7a31\u70ba\u5c3e\u905e\u8ff4\uff08tail recursion\uff09\u3002

    • \u666e\u901a\u905e\u8ff4\uff1a\u7576\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u7684\u51fd\u5f0f\u5f8c\uff0c\u9700\u8981\u7e7c\u7e8c\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u56e0\u6b64\u7cfb\u7d71\u9700\u8981\u5132\u5b58\u4e0a\u4e00\u5c64\u547c\u53eb\u7684\u4e0a\u4e0b\u6587\u3002
    • \u5c3e\u905e\u8ff4\uff1a\u905e\u8ff4\u547c\u53eb\u662f\u51fd\u5f0f\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u500b\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u5f8c\uff0c\u7121\u9808\u7e7c\u7e8c\u57f7\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7d71\u7121\u9808\u5132\u5b58\u4e0a\u4e00\u5c64\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u3002

    \u4ee5\u8a08\u7b97 \\(1 + 2 + \\dots + n\\) \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u7d50\u679c\u8b8a\u6578 res \u8a2d\u70ba\u51fd\u5f0f\u53c3\u6578\uff0c\u5f9e\u800c\u5be6\u73fe\u5c3e\u905e\u8ff4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def tail_recur(n, res):\n    \"\"\"\u5c3e\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tail_recur(n - 1, res + n)\n
    recursion.cpp
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.java
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.cs
    /* \u5c3e\u905e\u8ff4 */\nint TailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return TailRecur(n - 1, res + n);\n}\n
    recursion.go
    /* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n int, res int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n-1, res+n)\n}\n
    recursion.swift
    /* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n: n - 1, res: res + n)\n}\n
    recursion.js
    /* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n, res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.ts
    /* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.dart
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u905e\u8ff4\u547c\u53eb\n  return tailRecur(n - 1, res + n);\n}\n
    recursion.rs
    /* \u5c3e\u905e\u8ff4 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    tail_recur(n - 1, res + n)\n}\n
    recursion.c
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.kt
    /* \u5c3e\u905e\u8ff4 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u65b0\u589e tailrec \u95dc\u9375\u8a5e\uff0c\u4ee5\u958b\u555f\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n)\n}\n
    recursion.rb
    ### \u5c3e\u905e\u8ff4 ###\ndef tail_recur(n, res)\n  # \u7d42\u6b62\u689d\u4ef6\n  return res if n == 0\n  # \u5c3e\u905e\u8ff4\u547c\u53eb\n  tail_recur(n - 1, res + n)\nend\n
    recursion.zig
    // \u5c3e\u905e\u8ff4\u51fd\u5f0f\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5c3e\u905e\u8ff4\u7684\u57f7\u884c\u904e\u7a0b\u5982\u5716 2-5 \u6240\u793a\u3002\u5c0d\u6bd4\u666e\u901a\u905e\u8ff4\u548c\u5c3e\u905e\u8ff4\uff0c\u5169\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u57f7\u884c\u9ede\u662f\u4e0d\u540c\u7684\u3002

    • \u666e\u901a\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u6bcf\u5c64\u8fd4\u56de\u5f8c\u90fd\u8981\u518d\u57f7\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
    • \u5c3e\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u53ea\u9700\u5c64\u5c64\u8fd4\u56de\u3002

    \u5716 2-5 \u00a0 \u5c3e\u905e\u8ff4\u904e\u7a0b

    Tip

    \u8acb\u6ce8\u610f\uff0c\u8a31\u591a\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u4e26\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u3002\u4f8b\u5982\uff0cPython \u9810\u8a2d\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u5f0f\u662f\u5c3e\u905e\u8ff4\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u6703\u9047\u5230\u5806\u758a\u6ea2\u4f4d\u554f\u984c\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u905e\u8ff4\u6a39","text":"

    \u7576\u8655\u7406\u8207\u201c\u5206\u6cbb\u201d\u76f8\u95dc\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u905e\u8ff4\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c0\u3001\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6613\u8b80\u3002\u4ee5\u201c\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u201d\u70ba\u4f8b\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u8cbb\u6ce2\u90a3\u5951\u6578\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8a72\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u3002

    \u8a2d\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u70ba \\(f(n)\\) \uff0c\u6613\u5f97\u5169\u500b\u7d50\u8ad6\u3002

    • \u6578\u5217\u7684\u524d\u5169\u500b\u6578\u5b57\u70ba \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
    • \u6578\u5217\u4e2d\u7684\u6bcf\u500b\u6578\u5b57\u662f\u524d\u5169\u500b\u6578\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

    \u6309\u7167\u905e\u63a8\u95dc\u4fc2\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5c07\u524d\u5169\u500b\u6578\u5b57\u4f5c\u70ba\u7d42\u6b62\u689d\u4ef6\uff0c\u4fbf\u53ef\u5beb\u51fa\u905e\u8ff4\u7a0b\u5f0f\u78bc\u3002\u547c\u53eb fib(n) \u5373\u53ef\u5f97\u5230\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def fib(n: int) -> int:\n    \"\"\"\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n
    recursion.cpp
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.java
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.cs
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint Fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.go
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.swift
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.js
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.ts
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.dart
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n  // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7d50\u679c f(n)\n  return res;\n}\n
    recursion.rs
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfn fib(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c\n    res\n}\n
    recursion.c
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.kt
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfun fib(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.rb
    ### \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 ###\ndef fib(n)\n  # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7d50\u679c f(n)\n  res\nend\n
    recursion.zig
    // \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\nfn fib(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u5728\u51fd\u5f0f\u5167\u905e\u8ff4\u547c\u53eb\u4e86\u5169\u500b\u51fd\u5f0f\uff0c\u9019\u610f\u5473\u8457\u5f9e\u4e00\u500b\u547c\u53eb\u7522\u751f\u4e86\u5169\u500b\u547c\u53eb\u5206\u652f\u3002\u5982\u5716 2-6 \u6240\u793a\uff0c\u9019\u6a23\u4e0d\u65b7\u905e\u8ff4\u547c\u53eb\u4e0b\u53bb\uff0c\u6700\u7d42\u5c07\u7522\u751f\u4e00\u68f5\u5c64\u6578\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff08recursion tree\uff09\u3002

    \u5716 2-6 \u00a0 \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u905e\u8ff4\u6a39

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u905e\u8ff4\u9ad4\u73fe\u4e86\u201c\u5c07\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u5b50\u554f\u984c\u201d\u7684\u601d\u7dad\u7bc4\u5f0f\uff0c\u9019\u7a2e\u5206\u6cbb\u7b56\u7565\u81f3\u95dc\u91cd\u8981\u3002

    • \u5f9e\u6f14\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u7b49\u8a31\u591a\u91cd\u8981\u6f14\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u9593\u63a5\u5730\u61c9\u7528\u4e86\u9019\u7a2e\u601d\u7dad\u65b9\u5f0f\u3002
    • \u5f9e\u8cc7\u6599\u7d50\u69cb\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u5929\u7136\u9069\u5408\u8655\u7406\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u76f8\u95dc\u554f\u984c\uff0c\u56e0\u70ba\u5b83\u5011\u975e\u5e38\u9069\u5408\u7528\u5206\u6cbb\u601d\u60f3\u9032\u884c\u5206\u6790\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u5169\u8005\u5c0d\u6bd4","text":"

    \u7e3d\u7d50\u4ee5\u4e0a\u5167\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5be6\u73fe\u3001\u6548\u80fd\u548c\u9069\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

    \u8868 2-1 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4\u7279\u9ede\u5c0d\u6bd4

    \u8fed\u4ee3 \u905e\u8ff4 \u5be6\u73fe\u65b9\u5f0f \u8ff4\u5708\u7d50\u69cb \u51fd\u5f0f\u547c\u53eb\u81ea\u8eab \u6642\u9593\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f03\u9ad8\uff0c\u7121\u51fd\u5f0f\u547c\u53eb\u958b\u92b7 \u6bcf\u6b21\u51fd\u5f0f\u547c\u53eb\u90fd\u6703\u7522\u751f\u958b\u92b7 \u8a18\u61b6\u9ad4\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593 \u7d2f\u7a4d\u51fd\u5f0f\u547c\u53eb\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u5806\u758a\u5e40\u7a7a\u9593 \u9069\u7528\u554f\u984c \u9069\u7528\u65bc\u7c21\u55ae\u8ff4\u5708\u4efb\u52d9\uff0c\u7a0b\u5f0f\u78bc\u76f4\u89c0\u3001\u53ef\u8b80\u6027\u597d \u9069\u7528\u65bc\u5b50\u554f\u984c\u5206\u89e3\uff0c\u5982\u6a39\u3001\u5716\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u7a0b\u5f0f\u78bc\u7d50\u69cb\u7c21\u6f54\u3001\u6e05\u6670

    Tip

    \u5982\u679c\u611f\u89ba\u4ee5\u4e0b\u5167\u5bb9\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5728\u8b80\u5b8c\u201c\u5806\u758a\u201d\u7ae0\u7bc0\u5f8c\u518d\u4f86\u8907\u7fd2\u3002

    \u90a3\u9ebc\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5177\u6709\u4ec0\u9ebc\u5167\u5728\u95dc\u806f\u5462\uff1f\u4ee5\u4e0a\u8ff0\u905e\u8ff4\u51fd\u5f0f\u70ba\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u905e\u8ff4\u7684\u201c\u8ff4\u201d\u968e\u6bb5\u9032\u884c\u3002\u9019\u610f\u5473\u8457\u6700\u521d\u88ab\u547c\u53eb\u7684\u51fd\u5f0f\u5be6\u969b\u4e0a\u662f\u6700\u5f8c\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u9019\u7a2e\u5de5\u4f5c\u6a5f\u5236\u8207\u5806\u758a\u7684\u201c\u5148\u5165\u5f8c\u51fa\u201d\u539f\u5247\u7570\u66f2\u540c\u5de5\u3002

    \u4e8b\u5be6\u4e0a\uff0c\u201c\u547c\u53eb\u5806\u758a\u201d\u548c\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u9019\u985e\u905e\u8ff4\u8853\u8a9e\u5df2\u7d93\u6697\u793a\u4e86\u905e\u8ff4\u8207\u5806\u758a\u4e4b\u9593\u7684\u5bc6\u5207\u95dc\u4fc2\u3002

    1. \u905e\uff1a\u7576\u51fd\u5f0f\u88ab\u547c\u53eb\u6642\uff0c\u7cfb\u7d71\u6703\u5728\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u70ba\u8a72\u51fd\u5f0f\u5206\u914d\u65b0\u7684\u5806\u758a\u5e40\uff0c\u7528\u65bc\u5132\u5b58\u51fd\u5f0f\u7684\u5340\u57df\u6027\u8b8a\u6578\u3001\u53c3\u6578\u3001\u8fd4\u56de\u4f4d\u5740\u7b49\u8cc7\u6599\u3002
    2. \u8ff4\uff1a\u7576\u51fd\u5f0f\u5b8c\u6210\u57f7\u884c\u4e26\u8fd4\u56de\u6642\uff0c\u5c0d\u61c9\u7684\u5806\u758a\u5e40\u6703\u88ab\u5f9e\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u5fa9\u4e4b\u524d\u51fd\u5f0f\u7684\u57f7\u884c\u74b0\u5883\u3002

    \u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\uff0c\u5f9e\u800c\u5c07\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f62\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\"\"\"\n    # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack = []\n    res = 0\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in range(n, 0, -1):\n        # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while stack:\n        # \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
    recursion.cpp
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack<int> stack;\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.empty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\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\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.isEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.cs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<int> stack = new();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.Push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.Count > 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.go
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack := list.New()\n    res := 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i := n; i > 0; i-- {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.PushBack(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    for stack.Len() != 0 {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\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\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [Int] = []\n    var res = 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1 ... n).reversed() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.isEmpty {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.js
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    const stack = [];\n    let res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.ts
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.dart
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  List<int> stack = [];\n  int res = 0;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for (int i = n; i > 0; i--) {\n    // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack.add(i);\n  }\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while (!stack.isEmpty) {\n    // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
    recursion.rs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1..=n).rev() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.is_empty() {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
    recursion.c
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u85c9\u52a9\u4e00\u500b\u5927\u9663\u5217\u4f86\u6a21\u64ec\u5806\u758a\n    int top = -1;    // \u5806\u758a\u9802\u7d22\u5f15\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack[1 + top++] = i;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (top >= 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.kt
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    val stack = Stack<Int>()\n    var res = 0\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    for (i in n downTo 0) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i)\n    }\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    while (stack.isNotEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.rb
    ### \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  stack = []\n  res = 0\n\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for i in n.downto(0)\n    # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack << i\n  end\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\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\u64ec\u905e\u8ff4\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7576\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f8c\uff0c\u7a0b\u5f0f\u78bc\u8b8a\u5f97\u66f4\u52a0\u8907\u96dc\u4e86\u3002\u5118\u7ba1\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5f88\u591a\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f49\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u9019\u6a23\u505a\uff0c\u6709\u4ee5\u4e0b\u5169\u9ede\u539f\u56e0\u3002

    • \u8f49\u5316\u5f8c\u7684\u7a0b\u5f0f\u78bc\u53ef\u80fd\u66f4\u52a0\u96e3\u4ee5\u7406\u89e3\uff0c\u53ef\u8b80\u6027\u66f4\u5dee\u3002
    • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\u53ef\u80fd\u975e\u5e38\u56f0\u96e3\u3002

    \u7e3d\u4e4b\uff0c\u9078\u64c7\u8fed\u4ee3\u9084\u662f\u905e\u8ff4\u53d6\u6c7a\u65bc\u7279\u5b9a\u554f\u984c\u7684\u6027\u8cea\u3002\u5728\u7a0b\u5f0f\u8a2d\u8a08\u5be6\u8e10\u4e2d\uff0c\u6b0a\u8861\u5169\u8005\u7684\u512a\u52a3\u4e26\u6839\u64da\u60c5\u5883\u9078\u64c7\u5408\u9069\u7684\u65b9\u6cd5\u81f3\u95dc\u91cd\u8981\u3002

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

    \u5728\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u8ffd\u6c42\u4ee5\u4e0b\u5169\u500b\u5c64\u9762\u7684\u76ee\u6a19\u3002

    1. \u627e\u5230\u554f\u984c\u89e3\u6cd5\uff1a\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u898f\u5b9a\u7684\u8f38\u5165\u7bc4\u570d\u5167\u53ef\u9760\u5730\u6c42\u5f97\u554f\u984c\u7684\u6b63\u78ba\u89e3\u3002
    2. \u5c0b\u6c42\u6700\u512a\u89e3\u6cd5\uff1a\u540c\u4e00\u500b\u554f\u984c\u53ef\u80fd\u5b58\u5728\u591a\u7a2e\u89e3\u6cd5\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u5118\u53ef\u80fd\u9ad8\u6548\u7684\u6f14\u7b97\u6cd5\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5728\u80fd\u5920\u89e3\u6c7a\u554f\u984c\u7684\u524d\u63d0\u4e0b\uff0c\u6f14\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u70ba\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u5169\u500b\u7dad\u5ea6\u3002

    • \u6642\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
    • \u7a7a\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u7684\u5927\u5c0f\u3002

    \u7c21\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u8a2d\u8a08\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u81f3\u95dc\u91cd\u8981\uff0c\u56e0\u70ba\u53ea\u6709\u9019\u6a23\uff0c\u6211\u5011\u624d\u80fd\u5c07\u5404\u7a2e\u6f14\u7b97\u6cd5\u9032\u884c\u5c0d\u6bd4\uff0c\u9032\u800c\u6307\u5c0e\u6f14\u7b97\u6cd5\u8a2d\u8a08\u8207\u6700\u4f73\u5316\u904e\u7a0b\u3002

    \u6548\u7387\u8a55\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u70ba\u5169\u7a2e\uff1a\u5be6\u969b\u6e2c\u8a66\u3001\u7406\u8ad6\u4f30\u7b97\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5be6\u969b\u6e2c\u8a66","text":"

    \u5047\u8a2d\u6211\u5011\u73fe\u5728\u6709\u6f14\u7b97\u6cd5 A \u548c\u6f14\u7b97\u6cd5 B \uff0c\u5b83\u5011\u90fd\u80fd\u89e3\u6c7a\u540c\u4e00\u554f\u984c\uff0c\u73fe\u5728\u9700\u8981\u5c0d\u6bd4\u9019\u5169\u500b\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u81fa\u8a08\u7b97\u6a5f\uff0c\u57f7\u884c\u9019\u5169\u500b\u6f14\u7b97\u6cd5\uff0c\u4e26\u76e3\u63a7\u8a18\u9304\u5b83\u5011\u7684\u57f7\u884c\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u4f54\u7528\u60c5\u6cc1\u3002\u9019\u7a2e\u8a55\u4f30\u65b9\u5f0f\u80fd\u5920\u53cd\u6620\u771f\u5be6\u60c5\u6cc1\uff0c\u4f46\u4e5f\u5b58\u5728\u8f03\u5927\u7684\u4fb7\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u96e3\u4ee5\u6392\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5e72\u64fe\u56e0\u7d20\u3002\u786c\u9ad4\u914d\u7f6e\u6703\u5f71\u97ff\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u81fa\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u81fa\u914d\u7f6e\u4e0d\u540c\u7684\u8a08\u7b97\u6a5f\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6e2c\u8a66\u7d50\u679c\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u9700\u8981\u5728\u5404\u7a2e\u6a5f\u5668\u4e0a\u9032\u884c\u6e2c\u8a66\uff0c\u7d71\u8a08\u5e73\u5747\u6548\u7387\uff0c\u800c\u9019\u662f\u4e0d\u73fe\u5be6\u7684\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u958b\u5b8c\u6574\u6e2c\u8a66\u975e\u5e38\u8017\u8cbb\u8cc7\u6e90\u3002\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u91cf\u7684\u8b8a\u5316\uff0c\u6f14\u7b97\u6cd5\u6703\u8868\u73fe\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5927\u6642\uff0c\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u70ba\u4e86\u5f97\u5230\u6709\u8aaa\u670d\u529b\u7684\u7d50\u8ad6\uff0c\u6211\u5011\u9700\u8981\u6e2c\u8a66\u5404\u7a2e\u898f\u6a21\u7684\u8f38\u5165\u8cc7\u6599\uff0c\u800c\u9019\u9700\u8981\u8017\u8cbb\u5927\u91cf\u7684\u8a08\u7b97\u8cc7\u6e90\u3002

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

    \u7531\u65bc\u5be6\u969b\u6e2c\u8a66\u5177\u6709\u8f03\u5927\u7684\u4fb7\u9650\u6027\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u8003\u616e\u50c5\u900f\u904e\u4e00\u4e9b\u8a08\u7b97\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u9019\u7a2e\u4f30\u7b97\u65b9\u6cd5\u88ab\u7a31\u70ba\u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7c21\u7a31\u8907\u96dc\u5ea6\u5206\u6790\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u80fd\u5920\u9ad4\u73fe\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u4e4b\u9593\u7684\u95dc\u4fc2\u3002\u5b83\u63cf\u8ff0\u4e86\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u5b9a\u7fa9\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u5206\u70ba\u4e09\u500b\u91cd\u9ede\u4f86\u7406\u89e3\u3002

    • \u201c\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u201d\u5206\u5225\u5c0d\u61c9\u6642\u9593\u8907\u96dc\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u3002
    • \u201c\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u8457\u8907\u96dc\u5ea6\u53cd\u6620\u4e86\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u8207\u8f38\u5165\u8cc7\u6599\u9ad4\u91cf\u4e4b\u9593\u7684\u95dc\u4fc2\u3002
    • \u201c\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u201d\u8868\u793a\u8907\u96dc\u5ea6\u5206\u6790\u95dc\u6ce8\u7684\u4e0d\u662f\u57f7\u884c\u6642\u9593\u6216\u4f54\u7528\u7a7a\u9593\u7684\u5177\u9ad4\u503c\uff0c\u800c\u662f\u6642\u9593\u6216\u7a7a\u9593\u589e\u9577\u7684\u201c\u5feb\u6162\u201d\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5be6\u969b\u6e2c\u8a66\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5169\u500b\u65b9\u9762\u3002

    • \u5b83\u7368\u7acb\u65bc\u6e2c\u8a66\u74b0\u5883\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\u3002
    • \u5b83\u53ef\u4ee5\u9ad4\u73fe\u4e0d\u540c\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002

    Tip

    \u5982\u679c\u4f60\u4ecd\u5c0d\u8907\u96dc\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u7121\u9808\u64d4\u5fc3\uff0c\u6211\u5011\u6703\u5728\u5f8c\u7e8c\u7ae0\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u70ba\u6211\u5011\u63d0\u4f9b\u4e86\u4e00\u628a\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6a19\u5c3a\u201d\uff0c\u4f7f\u6211\u5011\u53ef\u4ee5\u8861\u91cf\u57f7\u884c\u67d0\u500b\u6f14\u7b97\u6cd5\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\uff0c\u5c0d\u6bd4\u4e0d\u540c\u6f14\u7b97\u6cd5\u4e4b\u9593\u7684\u6548\u7387\u3002

    \u8907\u96dc\u5ea6\u662f\u500b\u6578\u5b78\u6982\u5ff5\uff0c\u5c0d\u65bc\u521d\u5b78\u8005\u53ef\u80fd\u6bd4\u8f03\u62bd\u8c61\uff0c\u5b78\u7fd2\u96e3\u5ea6\u76f8\u5c0d\u8f03\u9ad8\u3002\u5f9e\u9019\u500b\u89d2\u5ea6\u770b\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9069\u5408\u4f5c\u70ba\u6700\u5148\u4ecb\u7d39\u7684\u5167\u5bb9\u3002\u7136\u800c\uff0c\u7576\u6211\u5011\u8a0e\u8ad6\u67d0\u500b\u8cc7\u6599\u7d50\u69cb\u6216\u6f14\u7b97\u6cd5\u7684\u7279\u9ede\u6642\uff0c\u96e3\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u57f7\u884c\u901f\u5ea6\u548c\u7a7a\u9593\u4f7f\u7528\u60c5\u6cc1\u3002

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u5efa\u8b70\u4f60\u5728\u6df1\u5165\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5c0d\u8907\u96dc\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u77ad\u89e3\uff0c\u4ee5\u4fbf\u80fd\u5920\u5b8c\u6210\u7c21\u55ae\u6f14\u7b97\u6cd5\u7684\u8907\u96dc\u5ea6\u5206\u6790\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6","text":"

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u6982\u5ff5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u975e\u5e38\u985e\u4f3c\uff0c\u53ea\u9700\u5c07\u201c\u57f7\u884c\u6642\u9593\u201d\u66ff\u63db\u70ba\u201c\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u201d\u3002

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

    \u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u4f7f\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

    • \u8f38\u5165\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u5165\u8cc7\u6599\u3002
    • \u66ab\u5b58\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u8b8a\u6578\u3001\u7269\u4ef6\u3001\u51fd\u5f0f\u4e0a\u4e0b\u6587\u7b49\u8cc7\u6599\u3002
    • \u8f38\u51fa\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u51fa\u8cc7\u6599\u3002

    \u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u7d71\u8a08\u7bc4\u570d\u662f\u201c\u66ab\u5b58\u7a7a\u9593\u201d\u52a0\u4e0a\u201c\u8f38\u51fa\u7a7a\u9593\u201d\u3002

    \u66ab\u5b58\u7a7a\u9593\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

    • \u66ab\u5b58\u8cc7\u6599\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u5404\u7a2e\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u7b49\u3002
    • \u5806\u758a\u5e40\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u547c\u53eb\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u3002\u7cfb\u7d71\u5728\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\u90fd\u6703\u5728\u5806\u758a\u9802\u90e8\u5efa\u7acb\u4e00\u500b\u5806\u758a\u5e40\uff0c\u51fd\u5f0f\u8fd4\u56de\u5f8c\uff0c\u5806\u758a\u5e40\u7a7a\u9593\u6703\u88ab\u91cb\u653e\u3002
    • \u6307\u4ee4\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u7de8\u8b6f\u5f8c\u7684\u7a0b\u5f0f\u6307\u4ee4\uff0c\u5728\u5be6\u969b\u7d71\u8a08\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8a08\u3002

    \u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6642\uff0c\u6211\u5011\u901a\u5e38\u7d71\u8a08\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u8f38\u51fa\u8cc7\u6599\u4e09\u90e8\u5206\uff0c\u5982\u5716 2-15 \u6240\u793a\u3002

    \u5716 2-15 \u00a0 \u6f14\u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u95dc\u7a7a\u9593

    \u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class Node:\n    \"\"\"\u985e\u5225\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u7bc0\u9ede\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f38\u5165\u8cc7\u6599\n    A = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff0c\u4e00\u822c\u7528\u5927\u5beb\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node(0)        # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function()        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return A + b + c      # \u8f38\u51fa\u8cc7\u6599\n
    /* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node* node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = func();           // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    final int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new(0);       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = Function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u7d50\u69cb\u9ad4 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u5efa\u7acb node \u7d50\u69cb\u9ad4  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f38\u5165\u8cc7\u6599\n    const a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b := 0                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    newNode(0)              // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c := function()         // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c        // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u5f0f */\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f38\u5165\u8cc7\u6599\n    let a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node(x: 0) // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function()    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c      // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f38\u5165\u8cc7\u6599\n    const a = 0;              // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f38\u5165\u8cc7\u6599\n    const a = 0;                        // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                          // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0);           // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();              // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;                   // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f38\u5165\u8cc7\u6599\n  const int a = 0;      // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n  int b = 0;            // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n  Node node = Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n  int c = function();   // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n  return a + b + c;     // \u8f38\u51fa\u8cc7\u6599\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u5efa\u7acb Node \u7d50\u69cb\u9ad4 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u5f0f */\nfn function() -> i32 {      \n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f38\u5165\u8cc7\u6599\n    const a: i32 = 0;               // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let mut b = 0;                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node::new(0);        // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function();             // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;               // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;   // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;         // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    int c = func();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;  // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f38\u5165\u8cc7\u6599\n    val a = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    val node = Node(0)       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    val c = function()       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c         // \u8f38\u51fa\u8cc7\u6599\n}\n
    ### \u985e\u5225 ###\nclass Node\n    attr_accessor :val      # \u7bc0\u9ede\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u5f0f ###\ndef function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u6f14\u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f38\u5165\u8cc7\u6599\n    a = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node.new(0)  # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    a + b + c           # \u8f38\u51fa\u8cc7\u6599\nend\n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c07\u7d71\u8a08\u7269\u4ef6\u5f9e\u201c\u64cd\u4f5c\u6578\u91cf\u201d\u8f49\u70ba\u201c\u4f7f\u7528\u7a7a\u9593\u5927\u5c0f\u201d\u3002

    \u800c\u8207\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u3002\u9019\u662f\u56e0\u70ba\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u4e00\u9805\u786c\u6027\u8981\u6c42\uff0c\u6211\u5011\u5fc5\u9808\u78ba\u4fdd\u5728\u6240\u6709\u8f38\u5165\u8cc7\u6599\u4e0b\u90fd\u6709\u8db3\u5920\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u9810\u7559\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u5169\u5c64\u542b\u7fa9\u3002

    1. \u4ee5\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u70ba\u6e96\uff1a\u7576 \\(n < 10\\) \u6642\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1b\u4f46\u7576 \\(n > 10\\) \u6642\uff0c\u521d\u59cb\u5316\u7684\u9663\u5217 nums \u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
    2. \u4ee5\u6f14\u7b97\u6cd5\u57f7\u884c\u4e2d\u7684\u5cf0\u503c\u8a18\u61b6\u9ad4\u70ba\u6e96\uff1a\u4f8b\u5982\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6700\u5f8c\u4e00\u884c\u4e4b\u524d\uff0c\u4f54\u7528 \\(O(1)\\) \u7a7a\u9593\uff1b\u7576\u521d\u59cb\u5316\u9663\u5217 nums \u6642\uff0c\u7a0b\u5f0f\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(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\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7d71\u8a08\u5806\u758a\u5e40\u7a7a\u9593\u3002\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def function() -> int:\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    fun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
    def function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
    \n

    \u51fd\u5f0f loop() \u548c recur() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u4f46\u7a7a\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u3002

    • \u51fd\u5f0f loop() \u5728\u8ff4\u5708\u4e2d\u547c\u53eb\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f2a\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u4e26\u91cb\u653e\u4e86\u5806\u758a\u5e40\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \u3002
    • \u905e\u8ff4\u51fd\u5f0f recur() \u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u6703\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 recur() \uff0c\u5f9e\u800c\u4f54\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
    "},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u898b\u578b\u5225","text":"

    \u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5716 2-16 \u5c55\u793a\u4e86\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\uff08\u5f9e\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\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} \\end{aligned} \\]

    \u5716 2-16 \u00a0 \u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225

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

    \u5e38\u6578\u968e\u5e38\u898b\u65bc\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u7684\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u8ff4\u5708\u4e2d\u521d\u59cb\u5316\u8b8a\u6578\u6216\u547c\u53eb\u51fd\u5f0f\u800c\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\uff0c\u5728\u9032\u5165\u4e0b\u4e00\u8ff4\u5708\u5f8c\u5c31\u6703\u88ab\u91cb\u653e\uff0c\u56e0\u6b64\u4e0d\u6703\u7d2f\u7a4d\u4f54\u7528\u7a7a\u9593\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        c = 0\n    # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        function()\n
    space_complexity.cpp
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.java
    /* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
    space_complexity.cs
    /* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid Constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
    space_complexity.go
    /* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc spaceConstant(n int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\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\u5f0f */\n@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
    space_complexity.js
    /* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.ts
    /* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n: number): void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.dart
    /* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n  // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
    space_complexity.rs
    /* \u51fd\u5f0f */\nfn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        function();\n    }\n}\n
    space_complexity.c
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.kt
    /* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfun constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        function()\n    }\n}\n
    space_complexity.rb
    ### \u51fd\u5f0f ###\ndef function\n  # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6578\u968e ###\ndef constant(n)\n  # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { c = 0 }\n  # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { function }\nend\n
    space_complexity.zig
    // \u51fd\u5f0f\nfn function() i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6578\u968e\nfn constant(n: i32) void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\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    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7dda\u6027\u968e\u5e38\u898b\u65bc\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u6b63\u6bd4\u7684\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u7b49\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear(n: int):\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    nums = [0] * n\n    # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
    space_complexity.cpp
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<int> nums(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid Linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunc spaceLinear(n int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    _ = make([]int, n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunc linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nums = Array(repeating: 0, count: n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
    space_complexity.js
    /* \u7dda\u6027\u968e */\nfunction linear(n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunction linear(n: number): void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n  // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<int> nums = List.filled(n, 0);\n  // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nums = vec![0; n as usize];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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    // \u8a18\u61b6\u9ad4\u91cb\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
    /* \u7dda\u6027\u968e */\nfun linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nums = Array(n) { 0 }\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
    space_complexity.rb
    ### \u7dda\u6027\u968e ###\ndef linear(n)\n  # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  nums = Array.new(n, 0)\n\n  # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
    space_complexity.zig
    // \u7dda\u6027\u968e\nfn linear(comptime n: i32) !void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nums = [_]i32{0}**n;\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\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    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5373\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u5f0f\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-17 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u7dda\u6027\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

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

    \u5e73\u65b9\u968e\u5e38\u898b\u65bc\u77e9\u9663\u548c\u5716\uff0c\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u5e73\u65b9\u95dc\u4fc2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    num_matrix = [[0] * n for _ in range(n)]\n
    space_complexity.cpp
    /* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid Quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunction quadratic(n: number): void {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n  // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u968e */\nfun quadratic(n: Int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e ###\ndef quadratic(n)\n  # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  Array.new(n) { Array.new(n, 0) }\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u968e\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 2-18 \u6240\u793a\uff0c\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5728\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u500b\u9663\u5217\uff0c\u9577\u5ea6\u5206\u5225\u70ba \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u9577\u5ea6\u70ba \\(n / 2\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u4f54\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
    space_complexity.cpp
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u905e\u8ff4 n = \" << n << \" \u4e2d\u7684 nums \u9577\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u905e\u8ff4 n = \\(n) \u4e2d\u7684 nums \u9577\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\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\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-18 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u5e73\u65b9\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

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

    \u6307\u6578\u968e\u5e38\u898b\u65bc\u4e8c\u5143\u6a39\u3002\u89c0\u5bdf\u5716 2-19 \uff0c\u5c64\u6578\u70ba \\(n\\) \u7684\u201c\u6eff\u4e8c\u5143\u6a39\u201d\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(2^n - 1\\) \uff0c\u4f54\u7528 \\(O(2^n)\\) \u7a7a\u9593\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-19 \u00a0 \u6eff\u4e8c\u5143\u6a39\u7522\u751f\u7684\u6307\u6578\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

    \u5c0d\u6578\u968e\u5e38\u898b\u65bc\u5206\u6cbb\u6f14\u7b97\u6cd5\u3002\u4f8b\u5982\u5408\u4f75\u6392\u5e8f\uff0c\u8f38\u5165\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u6bcf\u8f2a\u905e\u8ff4\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002

    \u518d\u4f8b\u5982\u5c07\u6578\u5b57\u8f49\u5316\u70ba\u5b57\u4e32\uff0c\u8f38\u5165\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6578\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5c0d\u61c9\u5b57\u4e32\u9577\u5ea6\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6b0a\u8861\u6642\u9593\u8207\u7a7a\u9593","text":"

    \u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u80fd\u9054\u5230\u6700\u512a\u3002\u7136\u800c\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u540c\u6642\u6700\u4f73\u5316\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96e3\u3002

    \u964d\u4f4e\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba\u4ee3\u50f9\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u5011\u5c07\u72a7\u7272\u8a18\u61b6\u9ad4\u7a7a\u9593\u4f86\u63d0\u5347\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u601d\u8def\u7a31\u70ba\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff1b\u53cd\u4e4b\uff0c\u5247\u7a31\u70ba\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002

    \u9078\u64c7\u54ea\u7a2e\u601d\u8def\u53d6\u6c7a\u65bc\u6211\u5011\u66f4\u770b\u91cd\u54ea\u500b\u65b9\u9762\u3002\u5728\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u6642\u9593\u6bd4\u7a7a\u9593\u66f4\u5bf6\u8cb4\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u7576\u7136\uff0c\u5728\u8cc7\u6599\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\uff0c\u63a7\u5236\u7a7a\u9593\u8907\u96dc\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"

    \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30

    • \u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u5169\u500b\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\u3002
    • \u6211\u5011\u53ef\u4ee5\u900f\u904e\u5be6\u969b\u6e2c\u8a66\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96e3\u4ee5\u6d88\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5f71\u97ff\uff0c\u4e14\u6703\u8017\u8cbb\u5927\u91cf\u8a08\u7b97\u8cc7\u6e90\u3002
    • \u8907\u96dc\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5be6\u969b\u6e2c\u8a66\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\uff0c\u4e26\u4e14\u80fd\u5920\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u8cc7\u6599\u898f\u6a21\u4e0b\u7684\u6548\u7387\u3002

    \u6642\u9593\u8907\u96dc\u5ea6

    • \u6642\u9593\u8907\u96dc\u5ea6\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\uff0c\u53ef\u4ee5\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f38\u5165\u7684\u8cc7\u6599\u91cf\u8f03\u5c0f\u6216\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\u6642\uff0c\u7121\u6cd5\u7cbe\u78ba\u5c0d\u6bd4\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u512a\u52a3\u3002
    • \u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u865f\u8868\u793a\uff0c\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u7576 \\(n\\) \u8da8\u5411\u6b63\u7121\u7aae\u6642\uff0c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u7684\u589e\u9577\u7d1a\u5225\u3002
    • \u63a8\u7b97\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u5169\u6b65\uff0c\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002
    • \u5e38\u898b\u6642\u9593\u8907\u96dc\u5ea6\u5f9e\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\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u5e7e\u4e4e\u4e0d\u7528\uff0c\u56e0\u70ba\u8f38\u5165\u8cc7\u6599\u4e00\u822c\u9700\u8981\u6eff\u8db3\u56b4\u683c\u689d\u4ef6\u624d\u80fd\u9054\u5230\u6700\u4f73\u60c5\u6cc1\u3002
    • \u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53cd\u6620\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8cc7\u6599\u8f38\u5165\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5be6\u969b\u61c9\u7528\u4e2d\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u9700\u8981\u7d71\u8a08\u8f38\u5165\u8cc7\u6599\u5206\u4f48\u4ee5\u53ca\u7d9c\u5408\u5f8c\u7684\u6578\u5b78\u671f\u671b\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6

    • \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u4f5c\u7528\u985e\u4f3c\u65bc\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\u3002
    • \u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u76f8\u95dc\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u5206\u70ba\u8f38\u5165\u7a7a\u9593\u3001\u66ab\u5b58\u7a7a\u9593\u3001\u8f38\u51fa\u7a7a\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u8f38\u5165\u7a7a\u9593\u4e0d\u7d0d\u5165\u7a7a\u9593\u8907\u96dc\u5ea6\u8a08\u7b97\u3002\u66ab\u5b58\u7a7a\u9593\u53ef\u5206\u70ba\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u6307\u4ee4\u7a7a\u9593\uff0c\u5176\u4e2d\u5806\u758a\u5e40\u7a7a\u9593\u901a\u5e38\u50c5\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\u5f71\u97ff\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5373\u7d71\u8a08\u6f14\u7b97\u6cd5\u5728\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u548c\u6700\u5dee\u57f7\u884c\u6642\u523b\u4e0b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u5e38\u898b\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e\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\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u55ce\uff1f

    \u7406\u8ad6\u4e0a\uff0c\u5c3e\u905e\u8ff4\u51fd\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u904e\u7d55\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52d5\u6700\u4f73\u5316\u5c3e\u905e\u8ff4\uff0c\u56e0\u6b64\u901a\u5e38\u8a8d\u70ba\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(n)\\) \u3002

    Q\uff1a\u51fd\u5f0f\u548c\u65b9\u6cd5\u9019\u5169\u500b\u8853\u8a9e\u7684\u5340\u5225\u662f\u4ec0\u9ebc\uff1f

    \u51fd\u5f0f\uff08function\uff09\u53ef\u4ee5\u88ab\u7368\u7acb\u57f7\u884c\uff0c\u6240\u6709\u53c3\u6578\u90fd\u4ee5\u986f\u5f0f\u50b3\u905e\u3002\u65b9\u6cd5\uff08method\uff09\u8207\u4e00\u500b\u7269\u4ef6\u95dc\u806f\uff0c\u88ab\u96b1\u5f0f\u50b3\u905e\u7d66\u547c\u53eb\u5b83\u7684\u7269\u4ef6\uff0c\u80fd\u5920\u5c0d\u985e\u5225\u7684\u4f8b\u9805\u4e2d\u5305\u542b\u7684\u8cc7\u6599\u9032\u884c\u64cd\u4f5c\u3002

    \u4e0b\u9762\u4ee5\u5e7e\u7a2e\u5e38\u898b\u7684\u7a0b\u5f0f\u8a9e\u8a00\u70ba\u4f8b\u4f86\u8aaa\u660e\u3002

    • C \u8a9e\u8a00\u662f\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\u8a9e\u8a00\uff0c\u6c92\u6709\u7269\u4ef6\u5c0e\u5411\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u5f0f\u3002\u4f46\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5efa\u7acb\u7d50\u69cb\u9ad4\uff08struct\uff09\u4f86\u6a21\u64ec\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff0c\u8207\u7d50\u69cb\u9ad4\u76f8\u95dc\u806f\u7684\u51fd\u5f0f\u5c31\u76f8\u7576\u65bc\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
    • Java \u548c C# \u662f\u7269\u4ef6\u5c0e\u5411\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u78bc\u584a\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u70ba\u67d0\u500b\u985e\u5225\u7684\u4e00\u90e8\u5206\u3002\u975c\u614b\u65b9\u6cd5\u7684\u884c\u70ba\u985e\u4f3c\u65bc\u51fd\u5f0f\uff0c\u56e0\u70ba\u5b83\u88ab\u7e6b\u7d50\u5728\u985e\u5225\u4e0a\uff0c\u4e0d\u80fd\u8a2a\u554f\u7279\u5b9a\u7684\u4f8b\u9805\u8b8a\u6578\u3002
    • C++ \u548c Python \u65e2\u652f\u6301\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\uff08\u51fd\u5f0f\uff09\uff0c\u4e5f\u652f\u6301\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff08\u65b9\u6cd5\uff09\u3002

    Q\uff1a\u5716\u89e3\u201c\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8a72\u5716\u5c55\u793a\u7684\u662f\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u9577\u8da8\u52e2\uff0c\u800c\u4e0d\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\u3002

    \u5047\u8a2d\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u6bcf\u689d\u66f2\u7dda\u7684\u503c\u8207\u51fd\u5f0f\u5c0d\u61c9\u4e0d\u4e0a\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u689d\u66f2\u7dda\u90fd\u5305\u542b\u4e00\u500b\u5e38\u6578\u9805\uff0c\u7528\u65bc\u5c07\u53d6\u503c\u7bc4\u570d\u58d3\u7e2e\u5230\u4e00\u500b\u8996\u89ba\u8212\u9069\u7684\u7bc4\u570d\u5167\u3002

    \u5728\u5be6\u969b\u4e2d\uff0c\u56e0\u70ba\u6211\u5011\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u500b\u65b9\u6cd5\u7684\u201c\u5e38\u6578\u9805\u201d\u8907\u96dc\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u7121\u6cd5\u50c5\u6191\u8907\u96dc\u5ea6\u4f86\u9078\u64c7 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u512a\u89e3\u6cd5\u3002\u4f46\u5c0d\u65bc \\(n = 8^5\\) \u5c31\u5f88\u597d\u9078\u4e86\uff0c\u9019\u6642\u589e\u9577\u8da8\u52e2\u5df2\u7d93\u4f54\u4e3b\u5c0e\u4e86\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6","text":"

    \u57f7\u884c\u6642\u9593\u53ef\u4ee5\u76f4\u89c0\u4e14\u6e96\u78ba\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u5011\u60f3\u6e96\u78ba\u9810\u4f30\u4e00\u6bb5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6642\u9593\uff0c\u61c9\u8a72\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

    1. \u78ba\u5b9a\u57f7\u884c\u5e73\u81fa\uff0c\u5305\u62ec\u786c\u9ad4\u914d\u7f6e\u3001\u7a0b\u5f0f\u8a9e\u8a00\u3001\u7cfb\u7d71\u74b0\u5883\u7b49\uff0c\u9019\u4e9b\u56e0\u7d20\u90fd\u6703\u5f71\u97ff\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6548\u7387\u3002
    2. \u8a55\u4f30\u5404\u7a2e\u8a08\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u57f7\u884c\u6642\u9593\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u5217\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
    3. \u7d71\u8a08\u7a0b\u5f0f\u78bc\u4e2d\u6240\u6709\u7684\u8a08\u7b97\u64cd\u4f5c\uff0c\u4e26\u5c07\u6240\u6709\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u6c42\u548c\uff0c\u5f9e\u800c\u5f97\u5230\u57f7\u884c\u6642\u9593\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff1a

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

    \u6839\u64da\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u70ba \\((6n + 12)\\) ns \uff1a

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

    \u4f46\u5be6\u969b\u4e0a\uff0c\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73fe\u5be6\u3002\u9996\u5148\uff0c\u6211\u5011\u4e0d\u5e0c\u671b\u5c07\u9810\u4f30\u6642\u9593\u548c\u57f7\u884c\u5e73\u81fa\u7e6b\u7d50\uff0c\u56e0\u70ba\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u5404\u7a2e\u4e0d\u540c\u7684\u5e73\u81fa\u4e0a\u57f7\u884c\u3002\u5176\u6b21\uff0c\u6211\u5011\u5f88\u96e3\u7372\u77e5\u6bcf\u7a2e\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\uff0c\u9019\u7d66\u9810\u4f30\u904e\u7a0b\u5e36\u4f86\u4e86\u6975\u5927\u7684\u96e3\u5ea6\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7d71\u8a08\u6642\u9593\u589e\u9577\u8da8\u52e2","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u7d71\u8a08\u7684\u4e0d\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\uff0c\u800c\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002

    \u201c\u6642\u9593\u589e\u9577\u8da8\u52e2\u201d\u9019\u500b\u6982\u5ff5\u6bd4\u8f03\u62bd\u8c61\uff0c\u6211\u5011\u900f\u904e\u4e00\u500b\u4f8b\u5b50\u4f86\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7d66\u5b9a\u4e09\u500b\u6f14\u7b97\u6cd5 A\u3001B \u548c C \uff1a

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

    \u5716 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u500b\u6f14\u7b97\u6cd5\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

    • \u6f14\u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u500b\u5217\u5370\u64cd\u4f5c\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u4e0d\u96a8\u8457 \\(n\\) \u589e\u5927\u800c\u589e\u9577\u3002\u6211\u5011\u7a31\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002
    • \u6f14\u7b97\u6cd5 B \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(n\\) \u6b21\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457 \\(n\\) \u589e\u5927\u5448\u7dda\u6027\u589e\u9577\u3002\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u968e\u201d\u3002
    • \u6f14\u7b97\u6cd5 C \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(1000000\\) \u6b21\uff0c\u96d6\u7136\u57f7\u884c\u6642\u9593\u5f88\u9577\uff0c\u4f46\u5b83\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u3002\u56e0\u6b64 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002

    \u5716 2-7 \u00a0 \u6f14\u7b97\u6cd5 A\u3001B \u548c C \u7684\u6642\u9593\u589e\u9577\u8da8\u52e2

    \u76f8\u8f03\u65bc\u76f4\u63a5\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u9ede\u5462\uff1f

    • \u6642\u9593\u8907\u96dc\u5ea6\u80fd\u5920\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u6f14\u7b97\u6cd5 B \u7684\u57f7\u884c\u6642\u9593\u5448\u7dda\u6027\u589e\u9577\uff0c\u5728 \\(n > 1\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5be6\u4e0a\uff0c\u53ea\u8981\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8db3\u5920\u5927\uff0c\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u7684\u6f14\u7b97\u6cd5\u4e00\u5b9a\u512a\u65bc\u201c\u7dda\u6027\u968e\u201d\u7684\u6f14\u7b97\u6cd5\uff0c\u9019\u6b63\u662f\u6642\u9593\u589e\u9577\u8da8\u52e2\u7684\u542b\u7fa9\u3002
    • \u6642\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7c21\u4fbf\u3002\u986f\u7136\uff0c\u57f7\u884c\u5e73\u81fa\u548c\u8a08\u7b97\u64cd\u4f5c\u578b\u5225\u90fd\u8207\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u7121\u95dc\u3002\u56e0\u6b64\u5728\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u5c07\u6240\u6709\u8a08\u7b97\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u8996\u70ba\u76f8\u540c\u7684\u201c\u55ae\u4f4d\u6642\u9593\u201d\uff0c\u5f9e\u800c\u5c07\u201c\u8a08\u7b97\u64cd\u4f5c\u57f7\u884c\u6642\u9593\u7d71\u8a08\u201d\u7c21\u5316\u70ba\u201c\u8a08\u7b97\u64cd\u4f5c\u6578\u91cf\u7d71\u8a08\u201d\uff0c\u9019\u6a23\u4e00\u4f86\u4f30\u7b97\u96e3\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
    • \u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u4fb7\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 A \u548c C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\uff0c\u4f46\u5be6\u969b\u57f7\u884c\u6642\u9593\u5dee\u5225\u5f88\u5927\u3002\u540c\u6a23\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 B \u660e\u986f\u512a\u65bc\u6f14\u7b97\u6cd5 C \u3002\u5728\u9019\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5f88\u96e3\u50c5\u6191\u6642\u9593\u8907\u96dc\u5ea6\u5224\u65b7\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u7576\u7136\uff0c\u5118\u7ba1\u5b58\u5728\u4e0a\u8ff0\u554f\u984c\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8a55\u5224\u6f14\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\u5f0f\u6f38\u8fd1\u4e0a\u754c","text":"

    \u7d66\u5b9a\u4e00\u500b\u8f38\u5165\u5927\u5c0f\u70ba \\(n\\) \u7684\u51fd\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 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    // \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    # \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    \u8a2d\u6f14\u7b97\u6cd5\u7684\u64cd\u4f5c\u6578\u91cf\u662f\u4e00\u500b\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7684\u51fd\u5f0f\uff0c\u8a18\u70ba \\(T(n)\\) \uff0c\u5247\u4ee5\u4e0a\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u70ba\uff1a

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

    \\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u5f0f\uff0c\u8aaa\u660e\u5176\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u662f\u7dda\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u7dda\u6027\u968e\u3002

    \u6211\u5011\u5c07\u7dda\u6027\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8a18\u70ba \\(O(n)\\) \uff0c\u9019\u500b\u6578\u5b78\u7b26\u865f\u7a31\u70ba\u5927 \\(O\\) \u8a18\u865f\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u5f0f \\(T(n)\\) \u7684\u6f38\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

    \u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u672c\u8cea\u4e0a\u662f\u8a08\u7b97\u201c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\)\u201d\u7684\u6f38\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u78ba\u7684\u6578\u5b78\u5b9a\u7fa9\u3002

    \u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c

    \u82e5\u5b58\u5728\u6b63\u5be6\u6578 \\(c\\) \u548c\u5be6\u6578 \\(n_0\\) \uff0c\u4f7f\u5f97\u5c0d\u65bc\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5247\u53ef\u8a8d\u70ba \\(f(n)\\) \u7d66\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u500b\u6f38\u8fd1\u4e0a\u754c\uff0c\u8a18\u70ba \\(T(n) = O(f(n))\\) \u3002

    \u5982\u5716 2-8 \u6240\u793a\uff0c\u8a08\u7b97\u6f38\u8fd1\u4e0a\u754c\u5c31\u662f\u5c0b\u627e\u4e00\u500b\u51fd\u5f0f \\(f(n)\\) \uff0c\u4f7f\u5f97\u7576 \\(n\\) \u8da8\u5411\u65bc\u7121\u7aae\u5927\u6642\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u8655\u65bc\u76f8\u540c\u7684\u589e\u9577\u7d1a\u5225\uff0c\u50c5\u76f8\u5dee\u4e00\u500b\u5e38\u6578\u9805 \\(c\\) \u7684\u500d\u6578\u3002

    \u5716 2-8 \u00a0 \u51fd\u5f0f\u7684\u6f38\u8fd1\u4e0a\u754c

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

    \u6f38\u8fd1\u4e0a\u754c\u7684\u6578\u5b78\u5473\u5152\u6709\u9ede\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89ba\u6c92\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u7121\u9808\u64d4\u5fc3\u3002\u6211\u5011\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65b7\u7684\u5be6\u8e10\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6f38\u9818\u609f\u5176\u6578\u5b78\u610f\u7fa9\u3002

    \u6839\u64da\u5b9a\u7fa9\uff0c\u78ba\u5b9a \\(f(n)\\) \u4e4b\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u9ebc\u5982\u4f55\u78ba\u5b9a\u6f38\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u7e3d\u9ad4\u5206\u70ba\u5169\u6b65\uff1a\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf","text":"

    \u91dd\u5c0d\u7a0b\u5f0f\u78bc\uff0c\u9010\u884c\u5f9e\u4e0a\u5230\u4e0b\u8a08\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u65bc\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6578\u9805 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u7a2e\u4fc2\u6578\u3001\u5e38\u6578\u9805\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u64da\u6b64\u539f\u5247\uff0c\u53ef\u4ee5\u7e3d\u7d50\u51fa\u4ee5\u4e0b\u8a08\u6578\u7c21\u5316\u6280\u5de7\u3002

    1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6578\u9805\u3002\u56e0\u70ba\u5b83\u5011\u90fd\u8207 \\(n\\) \u7121\u95dc\uff0c\u6240\u4ee5\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u7522\u751f\u5f71\u97ff\u3002
    2. \u7701\u7565\u6240\u6709\u4fc2\u6578\u3002\u4f8b\u5982\uff0c\u8ff4\u5708 \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7c21\u5316\u8a18\u70ba \\(n\\) \u6b21\uff0c\u56e0\u70ba \\(n\\) \u524d\u9762\u7684\u4fc2\u6578\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u6c92\u6709\u5f71\u97ff\u3002
    3. \u8ff4\u5708\u5de2\u72c0\u6642\u4f7f\u7528\u4e58\u6cd5\u3002\u7e3d\u64cd\u4f5c\u6578\u91cf\u7b49\u65bc\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u64cd\u4f5c\u6578\u91cf\u4e4b\u7a4d\uff0c\u6bcf\u4e00\u5c64\u8ff4\u5708\u4f9d\u7136\u53ef\u4ee5\u5206\u5225\u5957\u7528\u7b2c 1. \u9ede\u548c\u7b2c 2. \u9ede\u7684\u6280\u5de7\u3002

    \u7d66\u5b9a\u4e00\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u4f86\u7d71\u8a08\u64cd\u4f5c\u6578\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\u5f8c\u7684\u7d71\u8a08\u7d50\u679c\uff0c\u5169\u8005\u63a8\u7b97\u51fa\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002

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

    \u6642\u9593\u8907\u96dc\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u968e\u7684\u9805\u4f86\u6c7a\u5b9a\u3002\u9019\u662f\u56e0\u70ba\u5728 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u6700\u9ad8\u968e\u7684\u9805\u5c07\u767c\u63ee\u4e3b\u5c0e\u4f5c\u7528\uff0c\u5176\u4ed6\u9805\u7684\u5f71\u97ff\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

    \u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u8a87\u5f35\u7684\u503c\u662f\u70ba\u4e86\u5f37\u8abf\u201c\u4fc2\u6578\u7121\u6cd5\u64bc\u52d5\u968e\u6578\u201d\u9019\u4e00\u7d50\u8ad6\u3002\u7576 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u9019\u4e9b\u5e38\u6578\u8b8a\u5f97\u7121\u8db3\u8f15\u91cd\u3002

    \u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6578\u91cf\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u6642\u9593\u8907\u96dc\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\u898b\u578b\u5225","text":"

    \u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225\u5982\u5716 2-9 \u6240\u793a\uff08\u6309\u7167\u5f9e\u4f4e\u5230\u9ad8\u7684\u9806\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\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u7dda\u6027\u5c0d\u6578\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} < \\text{\u968e\u4e58\u968e} \\end{aligned} \\]

    \u5716 2-9 \u00a0 \u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225

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

    \u5e38\u6578\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u5373\u4e0d\u96a8\u8457 \\(n\\) \u7684\u8b8a\u5316\u800c\u8b8a\u5316\u3002

    \u5728\u4ee5\u4e0b\u51fd\u5f0f\u4e2d\uff0c\u5118\u7ba1\u64cd\u4f5c\u6578\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u65bc\u5176\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def constant(n: int) -> int:\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e38\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e ###\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\u6578\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7dda\u6027\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u7dda\u6027\u7d1a\u5225\u589e\u9577\u3002\u7dda\u6027\u968e\u901a\u5e38\u51fa\u73fe\u5728\u55ae\u5c64\u8ff4\u5708\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear(n: int) -> int:\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    ### \u7dda\u6027\u968e ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
    time_complexity.zig
    // \u7dda\u6027\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8d70\u8a2a\u9663\u5217\u548c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u7b49\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u9577\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u9700\u6839\u64da\u8f38\u5165\u8cc7\u6599\u7684\u578b\u5225\u4f86\u5177\u9ad4\u78ba\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u500b\u793a\u4f8b\u4e2d\uff0c\u8b8a\u6578 \\(n\\) \u70ba\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u500b\u793a\u4f8b\u4e2d\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u70ba\u8cc7\u6599\u5927\u5c0f\u3002

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

    \u5e73\u65b9\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7d1a\u5225\u589e\u9577\u3002\u5e73\u65b9\u968e\u901a\u5e38\u51fa\u73fe\u5728\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint Quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunc quadratic(n int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunction quadratic(n) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint quadratic(int n) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e ###\ndef quadratic(n)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-10 \u5c0d\u6bd4\u4e86\u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u4e09\u7a2e\u6642\u9593\u8907\u96dc\u5ea6\u3002

    \u5716 2-10 \u00a0 \u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u4ee5\u6ce1\u6cab\u6392\u5e8f\u70ba\u4f8b\uff0c\u5916\u5c64\u8ff4\u5708\u57f7\u884c \\(n - 1\\) \u6b21\uff0c\u5167\u5c64\u8ff4\u5708\u57f7\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u70ba \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(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\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8a08\u6578\u5668\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8a08\u6578\u5668\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8a08\u6578\u5668\n\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8a08\u6578\u5668\n\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8a08\u6578\u5668 \n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u751f\u7269\u5b78\u7684\u201c\u7d30\u80de\u5206\u88c2\u201d\u662f\u6307\u6578\u968e\u589e\u9577\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72c0\u614b\u70ba \\(1\\) \u500b\u7d30\u80de\uff0c\u5206\u88c2\u4e00\u8f2a\u5f8c\u8b8a\u70ba \\(2\\) \u500b\uff0c\u5206\u88c2\u5169\u8f2a\u5f8c\u8b8a\u70ba \\(4\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f2a\u5f8c\u6709 \\(2^n\\) \u500b\u7d30\u80de\u3002

    \u5716 2-11 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u7d30\u80de\u5206\u88c2\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exponential(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-11 \u00a0 \u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u5728\u5be6\u969b\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6307\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u5176\u905e\u8ff4\u5730\u4e00\u5206\u70ba\u4e8c\uff0c\u7d93\u904e \\(n\\) \u6b21\u5206\u88c2\u5f8c\u505c\u6b62\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
    time_complexity.cpp
    /* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6307\u6578\u968e\u589e\u9577\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7aae\u8209\u6cd5\uff08\u66b4\u529b\u641c\u5c0b\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f03\u5e38\u898b\u3002\u5c0d\u65bc\u8cc7\u6599\u898f\u6a21\u8f03\u5927\u7684\u554f\u984c\uff0c\u6307\u6578\u968e\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52d5\u614b\u898f\u5283\u6216\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u4f86\u89e3\u6c7a\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

    \u8207\u6307\u6578\u968e\u76f8\u53cd\uff0c\u5c0d\u6578\u968e\u53cd\u6620\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u60c5\u6cc1\u3002\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7531\u65bc\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u5f0f\u3002

    \u5716 2-12 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_2 n)\\) \uff0c\u7c21\u8a18\u70ba \\(O(\\log n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def logarithmic(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    ### \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    // \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-12 \u00a0 \u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u8207\u6307\u6578\u968e\u985e\u4f3c\uff0c\u5c0d\u6578\u968e\u4e5f\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(\\log_2 n\\) \u7684\u905e\u8ff4\u6a39\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def log_recur(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
    time_complexity.cpp
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.java
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.cs
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
    time_complexity.go
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.ts
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.dart
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
    time_complexity.rs
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.kt
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
    time_complexity.rb
    ### \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
    time_complexity.zig
    // \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6f14\u7b97\u6cd5\u4e2d\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u591a\u201d\u548c\u201c\u5316\u7e41\u70ba\u7c21\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u9577\u7de9\u6162\uff0c\u662f\u50c5\u6b21\u65bc\u5e38\u6578\u968e\u7684\u7406\u60f3\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

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

    \u6e96\u78ba\u4f86\u8aaa\uff0c\u201c\u4e00\u5206\u70ba \\(m\\)\u201d\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u900f\u904e\u5c0d\u6578\u63db\u5e95\u516c\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6578\u3001\u76f8\u7b49\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a

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

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5e95\u6578 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u97ff\u8907\u96dc\u5ea6\u7684\u524d\u63d0\u4e0b\u8f49\u63db\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u7701\u7565\u5e95\u6578 \\(m\\) \uff0c\u5c07\u5c0d\u6578\u968e\u76f4\u63a5\u8a18\u70ba \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7dda\u6027\u5c0d\u6578\u968e \\(O(n \\log n)\\)","text":"

    \u7dda\u6027\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5169\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5206\u5225\u70ba \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear_log_recur(n: int) -> int:\n    \"\"\"\u7dda\u6027\u5c0d\u6578\u968e\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    ### \u7dda\u6027\u5c0d\u6578\u968e ###\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
    // \u7dda\u6027\u5c0d\u6578\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-13 \u5c55\u793a\u4e86\u7dda\u6027\u5c0d\u6578\u968e\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u5143\u6a39\u7684\u6bcf\u4e00\u5c64\u7684\u64cd\u4f5c\u7e3d\u6578\u90fd\u70ba \\(n\\) \uff0c\u6a39\u5171\u6709 \\(\\log_2 n + 1\\) \u5c64\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u5716 2-13 \u00a0 \u7dda\u6027\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u7b49\u3002

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

    \u968e\u4e58\u968e\u5c0d\u61c9\u6578\u5b78\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u554f\u984c\u3002\u7d66\u5b9a \\(n\\) \u500b\u4e92\u4e0d\u91cd\u8907\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6578\u91cf\u70ba\uff1a

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

    \u968e\u4e58\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u5be6\u73fe\u3002\u5982\u5716 2-14 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u7b2c\u4e00\u5c64\u5206\u88c2\u51fa \\(n\\) \u500b\uff0c\u7b2c\u4e8c\u5c64\u5206\u88c2\u51fa \\(n - 1\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c64\u6642\u505c\u6b62\u5206\u88c2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def factorial_recur(n: int) -> int:\n    \"\"\"\u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
    time_complexity.cpp
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
    time_complexity.js
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
    time_complexity.c
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
    time_complexity.zig
    // \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-14 \u00a0 \u968e\u4e58\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u7576 \\(n \\geq 4\\) \u6642\u6046\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u968e\u4e58\u968e\u6bd4\u6307\u6578\u968e\u589e\u9577\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f03\u5927\u6642\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\u6642\u9593\u8907\u96dc\u5ea6","text":"

    \u6f14\u7b97\u6cd5\u7684\u6642\u9593\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u5047\u8a2d\u8f38\u5165\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d nums \u7531\u5f9e \\(1\\) \u81f3 \\(n\\) \u7684\u6578\u5b57\u7d44\u6210\uff0c\u6bcf\u500b\u6578\u5b57\u53ea\u51fa\u73fe\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u9806\u5e8f\u662f\u96a8\u6a5f\u6253\u4e82\u7684\uff0c\u4efb\u52d9\u76ee\u6a19\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

    • \u7576 nums = [?, ?, ..., 1] \uff0c\u5373\u7576\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u6642\uff0c\u9700\u8981\u5b8c\u6574\u8d70\u8a2a\u9663\u5217\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
    • \u7576 nums = [1, ?, ?, ...] \uff0c\u5373\u7576\u9996\u500b\u5143\u7d20\u70ba \\(1\\) \u6642\uff0c\u7121\u8ad6\u9663\u5217\u591a\u9577\u90fd\u4e0d\u9700\u8981\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(\\Omega(1)\\) \u3002

    \u201c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8a18\u865f\u8868\u793a\u3002\u76f8\u61c9\u5730\uff0c\u201c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8a18\u865f\u8868\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82\"\"\"\n    # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
    worst_best_time_complexity.cpp
    /* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7d71\u6642\u9593\u751f\u6210\u96a8\u6a5f\u7a2e\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u7a4d\u5340\u8a18\u61b6\u9ad4\uff08\u5efa\u7acb\u4e00\u7dad\u53ef\u8b8a\u9577\u9663\u5217\uff1a\u9663\u5217\u4e2d\u5143\u7d20\u6578\u91cf\u70ba n \uff0c\u5143\u7d20\u578b\u5225\u70ba int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82 ###\ndef random_numbers(n)\n  # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6211\u5011\u5728\u5be6\u969b\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u56e0\u70ba\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6a5f\u7387\u4e0b\u624d\u80fd\u9054\u5230\uff0c\u53ef\u80fd\u6703\u5e36\u4f86\u4e00\u5b9a\u7684\u8aa4\u5c0e\u6027\u3002\u800c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u70ba\u5be6\u7528\uff0c\u56e0\u70ba\u5b83\u7d66\u51fa\u4e86\u4e00\u500b\u6548\u7387\u5b89\u5168\u503c\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u6f14\u7b97\u6cd5\u3002

    \u5f9e\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ea\u51fa\u73fe\u65bc\u201c\u7279\u6b8a\u7684\u8cc7\u6599\u5206\u4f48\u201d\uff0c\u9019\u4e9b\u60c5\u6cc1\u7684\u51fa\u73fe\u6a5f\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u4e26\u4e0d\u80fd\u771f\u5be6\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9ad4\u73fe\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8f38\u5165\u8cc7\u6599\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8a18\u865f\u4f86\u8868\u793a\u3002

    \u5c0d\u65bc\u90e8\u5206\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u63a8\u7b97\u51fa\u96a8\u6a5f\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u5e73\u5747\u60c5\u6cc1\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u65bc\u8f38\u5165\u9663\u5217\u662f\u88ab\u6253\u4e82\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73fe\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6a5f\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u9ebc\u6f14\u7b97\u6cd5\u7684\u5e73\u5747\u8ff4\u5708\u6b21\u6578\u5c31\u662f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

    \u4f46\u5c0d\u65bc\u8f03\u70ba\u8907\u96dc\u7684\u6f14\u7b97\u6cd5\uff0c\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5f80\u5f80\u6bd4\u8f03\u56f0\u96e3\uff0c\u56e0\u70ba\u5f88\u96e3\u5206\u6790\u51fa\u5728\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u6574\u9ad4\u6578\u5b78\u671f\u671b\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f5c\u70ba\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u8a55\u5224\u6a19\u6e96\u3002

    \u70ba\u4ec0\u9ebc\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u865f\uff1f

    \u53ef\u80fd\u7531\u65bc \\(O\\) \u7b26\u865f\u904e\u65bc\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u5011\u5e38\u5e38\u4f7f\u7528\u5b83\u4f86\u8868\u793a\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u3002\u4f46\u5f9e\u56b4\u683c\u610f\u7fa9\u4e0a\u8b1b\uff0c\u9019\u7a2e\u505a\u6cd5\u4e26\u4e0d\u898f\u7bc4\u3002\u5728\u672c\u66f8\u548c\u5176\u4ed6\u8cc7\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u985e\u4f3c\u201c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8acb\u5c07\u5176\u76f4\u63a5\u7406\u89e3\u70ba \\(\\Theta(n)\\) \u3002

    "},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u8cc7\u6599\u7d50\u69cb","text":"

    Abstract

    \u8cc7\u6599\u7d50\u69cb\u5982\u540c\u4e00\u526f\u7a69\u56fa\u800c\u591a\u6a23\u7684\u6846\u67b6\u3002

    \u5b83\u70ba\u8cc7\u6599\u7684\u6709\u5e8f\u7d44\u7e54\u63d0\u4f9b\u4e86\u85cd\u5716\uff0c\u6f14\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u790e\u4e0a\u751f\u52d5\u8d77\u4f86\u3002

    "},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e
    • 3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225
    • 3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *
    • 3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *
    • 3.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225","text":"

    \u7576\u8ac7\u53ca\u8a08\u7b97\u6a5f\u4e2d\u7684\u8cc7\u6599\u6642\uff0c\u6211\u5011\u6703\u60f3\u5230\u6587\u5b57\u3001\u5716\u7247\u3001\u5f71\u7247\u3001\u8a9e\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u7a2e\u5f62\u5f0f\u3002\u5118\u7ba1\u9019\u4e9b\u8cc7\u6599\u7684\u7d44\u7e54\u5f62\u5f0f\u5404\u7570\uff0c\u4f46\u5b83\u5011\u90fd\u7531\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u69cb\u6210\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u9032\u884c\u904b\u7b97\u7684\u578b\u5225\uff0c\u5728\u6f14\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

    • \u6574\u6578\u578b\u5225 byte\u3001short\u3001int\u3001long \u3002
    • \u6d6e\u9ede\u6578\u578b\u5225 float\u3001double \uff0c\u7528\u65bc\u8868\u793a\u5c0f\u6578\u3002
    • \u5b57\u5143\u578b\u5225 char \uff0c\u7528\u65bc\u8868\u793a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u6bcd\u3001\u6a19\u9ede\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002
    • \u5e03\u6797\u578b\u5225 bool \uff0c\u7528\u65bc\u8868\u793a\u201c\u662f\u201d\u8207\u201c\u5426\u201d\u5224\u65b7\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u4ee5\u4e8c\u9032\u4f4d\u5236\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u3002\u4e00\u500b\u4e8c\u9032\u4f4d\u5236\u4f4d\u5373\u70ba \\(1\\) \u4f4d\u5143\u3002\u5728\u7d55\u5927\u591a\u6578\u73fe\u4ee3\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\\(1\\) \u4f4d\u5143\u7d44\uff08byte\uff09\u7531 \\(8\\) \u4f4d\u5143\uff08bit\uff09\u7d44\u6210\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u5176\u4f54\u7528\u7684\u7a7a\u9593\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u70ba\u4f8b\u3002

    • \u6574\u6578\u578b\u5225 byte \u4f54\u7528 \\(1\\) \u4f4d\u5143\u7d44 = \\(8\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u500b\u6578\u5b57\u3002
    • \u6574\u6578\u578b\u5225 int \u4f54\u7528 \\(4\\) \u4f4d\u5143\u7d44 = \\(32\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u500b\u6578\u5b57\u3002

    \u8868 3-1 \u5217\u8209\u4e86 Java \u4e2d\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u3002\u6b64\u8868\u683c\u7121\u9808\u6b7b\u8a18\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u6642\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u4f86\u56de\u61b6\u3002

    \u8868 3-1 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u548c\u53d6\u503c\u7bc4\u570d

    \u578b\u5225 \u7b26\u865f \u4f54\u7528\u7a7a\u9593 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9810\u8a2d\u503c \u6574\u6578 byte 1 \u4f4d\u5143\u7d44 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u4f4d\u5143\u7d44 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u4f4d\u5143\u7d44 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u4f4d\u5143\u7d44 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u9ede\u6578 float 4 \u4f4d\u5143\u7d44 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u4f4d\u5143\u7d44 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u5143 char 2 \u4f4d\u5143\u7d44 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u6797 bool 1 \u4f4d\u5143\u7d44 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    \u8acb\u6ce8\u610f\uff0c\u8868 3-1 \u91dd\u5c0d\u7684\u662f Java \u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u60c5\u6cc1\u3002\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u6709\u5404\u81ea\u7684\u8cc7\u6599\u578b\u5225\u5b9a\u7fa9\uff0c\u5b83\u5011\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002

    • \u5728 Python \u4e2d\uff0c\u6574\u6578\u578b\u5225 int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\uff1b\u6d6e\u9ede\u6578 float \u662f\u96d9\u7cbe\u5ea6 64 \u4f4d\uff1b\u6c92\u6709 char \u578b\u5225\uff0c\u55ae\u500b\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32 str \u3002
    • C \u548c C++ \u672a\u660e\u78ba\u898f\u5b9a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5be6\u73fe\u548c\u5e73\u81fa\u5404\u7570\u3002\u8868 3-1 \u9075\u5faa LP64 \u8cc7\u6599\u6a21\u578b\uff0c\u5176\u7528\u65bc\u5305\u62ec Linux \u548c macOS \u5728\u5167\u7684 Unix 64 \u4f4d\u4f5c\u696d\u7cfb\u7d71\u3002
    • \u5b57\u5143 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u53d6\u6c7a\u65bc\u7279\u5b9a\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\uff0c\u8a73\u898b\u201c\u5b57\u5143\u7de8\u78bc\u201d\u7ae0\u7bc0\u3002
    • \u5373\u4f7f\u8868\u793a\u5e03\u6797\u91cf\u50c5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u8a18\u61b6\u9ad4\u4e2d\u901a\u5e38\u4e5f\u5132\u5b58\u70ba 1 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba\u73fe\u4ee3\u8a08\u7b97\u6a5f CPU \u901a\u5e38\u5c07 1 \u4f4d\u5143\u7d44\u4f5c\u70ba\u6700\u5c0f\u5b9a\u5740\u8a18\u61b6\u9ad4\u55ae\u5143\u3002

    \u90a3\u9ebc\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u9593\u6709\u4ec0\u9ebc\u95dc\u806f\u5462\uff1f\u6211\u5011\u77e5\u9053\uff0c\u8cc7\u6599\u7d50\u69cb\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u8207\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002\u9019\u53e5\u8a71\u7684\u4e3b\u8a9e\u662f\u201c\u7d50\u69cb\u201d\u800c\u975e\u201c\u8cc7\u6599\u201d\u3002

    \u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6578\u5b57\u201d\uff0c\u6211\u5011\u81ea\u7136\u6703\u60f3\u5230\u4f7f\u7528\u9663\u5217\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u7684\u7dda\u6027\u7d50\u69cb\u53ef\u4ee5\u8868\u793a\u6578\u5b57\u7684\u76f8\u9130\u95dc\u4fc2\u548c\u9806\u5e8f\u95dc\u4fc2\uff0c\u4f46\u81f3\u65bc\u5132\u5b58\u7684\u5167\u5bb9\u662f\u6574\u6578 int\u3001\u5c0f\u6578 float \u9084\u662f\u5b57\u5143 char \uff0c\u5247\u8207\u201c\u8cc7\u6599\u7d50\u69cb\u201d\u7121\u95dc\u3002

    \u63db\u53e5\u8a71\u8aaa\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u5167\u5bb9\u578b\u5225\u201d\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u7d44\u7e54\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u7528\u76f8\u540c\u7684\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\uff09\u4f86\u5132\u5b58\u8207\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u9663\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\nconst array = [0, 0.0, 'a', false];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
    # Ruby \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *","text":"

    \u5728\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6240\u6709\u8cc7\u6599\u90fd\u662f\u4ee5\u4e8c\u9032\u4f4d\u5236\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\uff0c\u5b57\u5143 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u70ba\u4e86\u8868\u793a\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u898f\u5b9a\u6bcf\u500b\u5b57\u5143\u548c\u4e8c\u9032\u4f4d\u5236\u6578\u4e4b\u9593\u7684\u4e00\u4e00\u5c0d\u61c9\u95dc\u4fc2\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u5f8c\uff0c\u8a08\u7b97\u6a5f\u5c31\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u5b8c\u6210\u4e8c\u9032\u4f4d\u5236\u6578\u5230\u5b57\u5143\u7684\u8f49\u63db\u3002

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

    ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u7a31\u70ba American Standard Code for Information Interchange\uff08\u7f8e\u570b\u6a19\u6e96\u8cc7\u8a0a\u4ea4\u63db\u7a0b\u5f0f\u78bc\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u9032\u4f4d\u5236\u6578\uff08\u4e00\u500b\u4f4d\u5143\u7d44\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6700\u591a\u80fd\u5920\u8868\u793a 128 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002\u5982\u5716 3-6 \u6240\u793a\uff0cASCII \u78bc\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5beb\u3001\u6578\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6a19\u9ede\u7b26\u865f\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u5143\uff08\u5982\u63db\u884c\u7b26\u548c\u88fd\u8868\u7b26\uff09\u3002

    \u5716 3-6 \u00a0 ASCII \u78bc

    \u7136\u800c\uff0cASCII \u78bc\u50c5\u80fd\u5920\u8868\u793a\u82f1\u6587\u3002\u96a8\u8457\u8a08\u7b97\u6a5f\u7684\u5168\u7403\u5316\uff0c\u8a95\u751f\u4e86\u4e00\u7a2e\u80fd\u5920\u8868\u793a\u66f4\u591a\u8a9e\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u790e\u4e0a\u64f4\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u5920\u8868\u793a 256 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002

    \u5728\u4e16\u754c\u7bc4\u570d\u5167\uff0c\u9678\u7e8c\u51fa\u73fe\u4e86\u4e00\u6279\u9069\u7528\u65bc\u4e0d\u540c\u5730\u5340\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u9019\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u500b\u5b57\u5143\u7d71\u4e00\u70ba ASCII \u78bc\uff0c\u5f8c 128 \u500b\u5b57\u5143\u5b9a\u7fa9\u4e0d\u540c\uff0c\u4ee5\u9069\u61c9\u4e0d\u540c\u8a9e\u8a00\u7684\u9700\u6c42\u3002

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

    \u5f8c\u4f86\u4eba\u5011\u767c\u73fe\uff0cEASCII \u78bc\u4ecd\u7136\u7121\u6cd5\u6eff\u8db3\u8a31\u591a\u8a9e\u8a00\u7684\u5b57\u5143\u6578\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6f22\u5b57\u6709\u8fd1\u5341\u842c\u500b\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u5e7e\u5343\u500b\u3002\u4e2d\u570b\u570b\u5bb6\u6a19\u6e96\u7e3d\u5c40\u65bc 1980 \u5e74\u91cb\u51fa\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u9304\u4e86 6763 \u500b\u6f22\u5b57\uff0c\u57fa\u672c\u6eff\u8db3\u4e86\u6f22\u5b57\u7684\u8a08\u7b97\u6a5f\u8655\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u7121\u6cd5\u8655\u7406\u90e8\u5206\u7f55\u898b\u5b57\u548c\u7e41\u9ad4\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u790e\u4e0a\u64f4\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u9304\u4e86 21886 \u500b\u6f22\u5b57\u3002\u5728 GBK \u7684\u7de8\u78bc\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u5143\u4f7f\u7528\u4e00\u500b\u4f4d\u5143\u7d44\u8868\u793a\uff0c\u6f22\u5b57\u4f7f\u7528\u5169\u500b\u4f4d\u5143\u7d44\u8868\u793a\u3002

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

    \u96a8\u8457\u8a08\u7b97\u6a5f\u6280\u8853\u7684\u84ec\u52c3\u767c\u5c55\uff0c\u5b57\u7b26\u96c6\u8207\u7de8\u78bc\u6a19\u6e96\u767e\u82b1\u9f4a\u653e\uff0c\u800c\u9019\u5e36\u4f86\u4e86\u8a31\u591a\u554f\u984c\u3002\u4e00\u65b9\u9762\uff0c\u9019\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u7fa9\u4e86\u7279\u5b9a\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u7121\u6cd5\u5728\u591a\u8a9e\u8a00\u74b0\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u7a2e\u8a9e\u8a00\u5b58\u5728\u591a\u7a2e\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u5982\u679c\u5169\u81fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7de8\u78bc\u6a19\u6e96\uff0c\u5247\u5728\u8cc7\u8a0a\u50b3\u905e\u6642\u5c31\u6703\u51fa\u73fe\u4e82\u78bc\u3002

    \u90a3\u500b\u6642\u4ee3\u7684\u7814\u7a76\u4eba\u54e1\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u500b\u8db3\u5920\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c07\u4e16\u754c\u7bc4\u570d\u5167\u7684\u6240\u6709\u8a9e\u8a00\u548c\u7b26\u865f\u90fd\u6536\u9304\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u6c7a\u8de8\u8a9e\u8a00\u74b0\u5883\u548c\u4e82\u78bc\u554f\u984c\u4e86\u55ce\uff1f\u5728\u9019\u7a2e\u60f3\u6cd5\u7684\u9a45\u52d5\u4e0b\uff0c\u4e00\u500b\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u61c9\u904b\u800c\u751f\u3002

    Unicode \u7684\u4e2d\u6587\u540d\u7a31\u70ba\u201c\u7d71\u4e00\u78bc\u201d\uff0c\u7406\u8ad6\u4e0a\u80fd\u5bb9\u7d0d 100 \u591a\u842c\u500b\u5b57\u5143\u3002\u5b83\u81f4\u529b\u65bc\u5c07\u5168\u7403\u7bc4\u570d\u5167\u7684\u5b57\u5143\u7d0d\u5165\u7d71\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u7a2e\u901a\u7528\u7684\u5b57\u7b26\u96c6\u4f86\u8655\u7406\u548c\u986f\u793a\u5404\u7a2e\u8a9e\u8a00\u6587\u5b57\uff0c\u6e1b\u5c11\u56e0\u70ba\u7de8\u78bc\u6a19\u6e96\u4e0d\u540c\u800c\u7522\u751f\u7684\u4e82\u78bc\u554f\u984c\u3002

    \u81ea 1991 \u5e74\u91cb\u51fa\u4ee5\u4f86\uff0cUnicode \u4e0d\u65b7\u64f4\u5145\u65b0\u7684\u8a9e\u8a00\u8207\u5b57\u5143\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7d93\u5305\u542b 149186 \u500b\u5b57\u5143\uff0c\u5305\u62ec\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\u3001\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002\u5728\u9f90\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u5143\u4f54\u7528 3 \u4f4d\u5143\u7d44\u751a\u81f3 4 \u4f4d\u5143\u7d44\u3002

    Unicode \u662f\u4e00\u7a2e\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8cea\u4e0a\u662f\u7d66\u6bcf\u500b\u5b57\u5143\u5206\u914d\u4e00\u500b\u7de8\u865f\uff08\u7a31\u70ba\u201c\u78bc\u9ede\u201d\uff09\uff0c\u4f46\u5b83\u4e26\u6c92\u6709\u898f\u5b9a\u5728\u8a08\u7b97\u6a5f\u4e2d\u5982\u4f55\u5132\u5b58\u9019\u4e9b\u5b57\u5143\u78bc\u9ede\u3002\u6211\u5011\u4e0d\u7981\u6703\u554f\uff1a\u7576\u591a\u7a2e\u9577\u5ea6\u7684 Unicode \u78bc\u9ede\u540c\u6642\u51fa\u73fe\u5728\u4e00\u500b\u6587\u5b57\u4e2d\u6642\uff0c\u7cfb\u7d71\u5982\u4f55\u89e3\u6790\u5b57\u5143\uff1f\u4f8b\u5982\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u7684\u7de8\u78bc\uff0c\u7cfb\u7d71\u5982\u4f55\u78ba\u8a8d\u5b83\u662f\u4e00\u500b 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\u9084\u662f\u5169\u500b 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff1f

    \u5c0d\u65bc\u4ee5\u4e0a\u554f\u984c\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u89e3\u6c7a\u65b9\u6848\u662f\u5c07\u6240\u6709\u5b57\u5143\u5132\u5b58\u70ba\u7b49\u9577\u7684\u7de8\u78bc\u3002\u5982\u5716 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff0c\u201c\u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u9ad8\u4f4d\u586b 0 \u5c07\u201cHello \u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u5143\u90fd\u7de8\u78bc\u70ba 2 \u4f4d\u5143\u7d44\u9577\u5ea6\u3002\u9019\u6a23\u7cfb\u7d71\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u4f4d\u5143\u7d44\u89e3\u6790\u4e00\u500b\u5b57\u5143\uff0c\u6062\u5fa9\u9019\u500b\u77ed\u8a9e\u7684\u5167\u5bb9\u4e86\u3002

    \u5716 3-7 \u00a0 Unicode \u7de8\u78bc\u793a\u4f8b

    \u7136\u800c ASCII \u78bc\u5df2\u7d93\u5411\u6211\u5011\u8b49\u660e\uff0c\u7de8\u78bc\u82f1\u6587\u53ea\u9700 1 \u4f4d\u5143\u7d44\u3002\u82e5\u63a1\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u5b57\u4f54\u7528\u7a7a\u9593\u7684\u5927\u5c0f\u5c07\u6703\u662f ASCII \u7de8\u78bc\u4e0b\u7684\u5169\u500d\uff0c\u975e\u5e38\u6d6a\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002

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

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u70ba\u570b\u969b\u4e0a\u4f7f\u7528\u6700\u5ee3\u6cdb\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u7a2e\u53ef\u8b8a\u9577\u5ea6\u7684\u7de8\u78bc\uff0c\u4f7f\u7528 1 \u5230 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6839\u64da\u5b57\u5143\u7684\u8907\u96dc\u6027\u800c\u8b8a\u3002ASCII \u5b57\u5143\u53ea\u9700 1 \u4f4d\u5143\u7d44\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u81d8\u5b57\u6bcd\u9700\u8981 2 \u4f4d\u5143\u7d44\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u5143\u9700\u8981 3 \u4f4d\u5143\u7d44\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u5143\u9700\u8981 4 \u4f4d\u5143\u7d44\u3002

    UTF-8 \u7684\u7de8\u78bc\u898f\u5247\u4e26\u4e0d\u8907\u96dc\uff0c\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u5c0d\u65bc\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0c\u5c07\u6700\u9ad8\u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff0c\u5176\u9918 7 \u4f4d\u8a2d\u5b9a\u70ba Unicode \u78bc\u9ede\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u5143\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u4f54\u64da\u4e86\u524d 128 \u500b\u78bc\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0cUTF-8 \u7de8\u78bc\u53ef\u4ee5\u5411\u4e0b\u76f8\u5bb9 ASCII \u78bc\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u4f86\u89e3\u6790\u5e74\u4ee3\u4e45\u9060\u7684 ASCII \u78bc\u6587\u5b57\u3002
    • \u5c0d\u65bc\u9577\u5ea6\u70ba \\(n\\) \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c07\u9996\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff1b\u5f9e\u7b2c\u4e8c\u500b\u4f4d\u5143\u7d44\u958b\u59cb\uff0c\u5c07\u6bcf\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \uff1b\u5176\u9918\u6240\u6709\u4f4d\u7528\u65bc\u586b\u5145\u5b57\u5143\u7684 Unicode \u78bc\u9ede\u3002

    \u5716 3-8 \u5c55\u793a\u4e86\u201cHello\u6f14\u7b97\u6cd5\u201d\u5c0d\u61c9\u7684 UTF-8 \u7de8\u78bc\u3002\u89c0\u5bdf\u767c\u73fe\uff0c\u7531\u65bc\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7d71\u53ef\u4ee5\u900f\u904e\u8b80\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u500b\u6578\u4f86\u89e3\u6790\u51fa\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(n\\) \u3002

    \u4f46\u70ba\u4ec0\u9ebc\u8981\u5c07\u5176\u9918\u6240\u6709\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \u5462\uff1f\u5be6\u969b\u4e0a\uff0c\u9019\u500b \\(10\\) \u80fd\u5920\u8d77\u5230\u6821\u9a57\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8a2d\u7cfb\u7d71\u5f9e\u4e00\u500b\u932f\u8aa4\u7684\u4f4d\u5143\u7d44\u958b\u59cb\u89e3\u6790\u6587\u5b57\uff0c\u4f4d\u5143\u7d44\u982d\u90e8\u7684 \\(10\\) \u80fd\u5920\u5e6b\u52a9\u7cfb\u7d71\u5feb\u901f\u5224\u65b7\u51fa\u7570\u5e38\u3002

    \u4e4b\u6240\u4ee5\u5c07 \\(10\\) \u7576\u4f5c\u6821\u9a57\u7b26\uff0c\u662f\u56e0\u70ba\u5728 UTF-8 \u7de8\u78bc\u898f\u5247\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \u3002\u9019\u500b\u7d50\u8ad6\u53ef\u4ee5\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\uff1a\u5047\u8a2d\u4e00\u500b\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \uff0c\u8aaa\u660e\u8a72\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(1\\) \uff0c\u5c0d\u61c9 ASCII \u78bc\u3002\u800c ASCII \u78bc\u7684\u6700\u9ad8\u4f4d\u61c9\u8a72\u662f \\(0\\) \uff0c\u8207\u5047\u8a2d\u77db\u76fe\u3002

    \u5716 3-8 \u00a0 UTF-8 \u7de8\u78bc\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u898b\u7684\u7de8\u78bc\u65b9\u5f0f\u9084\u5305\u62ec\u4ee5\u4e0b\u5169\u7a2e\u3002

    • UTF-16 \u7de8\u78bc\uff1a\u4f7f\u7528 2 \u6216 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\u3002\u6240\u6709\u7684 ASCII \u5b57\u5143\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u5143\uff0c\u90fd\u7528 2 \u4f4d\u5143\u7d44\u8868\u793a\uff1b\u5c11\u6578\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4f4d\u5143\u7d44\u8868\u793a\u3002\u5c0d\u65bc 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0cUTF-16 \u7de8\u78bc\u8207 Unicode \u78bc\u9ede\u76f8\u7b49\u3002
    • UTF-32 \u7de8\u78bc\uff1a\u6bcf\u500b\u5b57\u5143\u90fd\u4f7f\u7528 4 \u4f4d\u5143\u7d44\u3002\u9019\u610f\u5473\u8457 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u4f54\u7528\u7a7a\u9593\uff0c\u7279\u5225\u662f\u5c0d\u65bc ASCII \u5b57\u5143\u4f54\u6bd4\u8f03\u9ad8\u7684\u6587\u5b57\u3002

    \u5f9e\u5132\u5b58\u7a7a\u9593\u4f54\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u5143\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 1 \u4f4d\u5143\u7d44\uff1b\u4f7f\u7528 UTF-16 \u7de8\u78bc\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u5143\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u6703\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 2 \u4f4d\u5143\u7d44\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4f4d\u5143\u7d44\u3002

    \u5f9e\u76f8\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8a31\u591a\u5de5\u5177\u548c\u5eab\u512a\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc","text":"

    \u5c0d\u65bc\u4ee5\u5f80\u7684\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u57f7\u884c\u4e2d\u7684\u5b57\u4e32\u90fd\u63a1\u7528 UTF-16 \u6216 UTF-32 \u9019\u985e\u7b49\u9577\u7de8\u78bc\u3002\u5728\u7b49\u9577\u7de8\u78bc\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b57\u4e32\u770b\u4f5c\u9663\u5217\u4f86\u8655\u7406\uff0c\u9019\u7a2e\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

    • \u96a8\u6a5f\u8a2a\u554f\uff1aUTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u9032\u884c\u96a8\u6a5f\u8a2a\u554f\u3002UTF-8 \u662f\u4e00\u7a2e\u8b8a\u9577\u7de8\u78bc\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5f9e\u5b57\u4e32\u7684\u958b\u59cb\u8655\u8d70\u8a2a\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u9019\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u3002
    • \u5b57\u5143\u8a08\u6578\uff1a\u8207\u96a8\u6a5f\u8a2a\u554f\u985e\u4f3c\uff0c\u8a08\u7b97 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8a08\u7b97 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u9700\u8981\u8d70\u8a2a\u6574\u500b\u5b57\u4e32\u3002
    • \u5b57\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u9023\u7dda\u3001\u63d2\u5165\u3001\u522a\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u9032\u884c\u3002\u5728 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u9032\u884c\u9019\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u984d\u5916\u7684\u8a08\u7b97\uff0c\u4ee5\u78ba\u4fdd\u4e0d\u6703\u7522\u751f\u7121\u6548\u7684 UTF-8 \u7de8\u78bc\u3002

    \u5be6\u969b\u4e0a\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6848\u8a2d\u8a08\u662f\u4e00\u500b\u5f88\u6709\u8da3\u7684\u8a71\u984c\uff0c\u6d89\u53ca\u8a31\u591a\u56e0\u7d20\u3002

    • Java \u7684 String \u578b\u5225\u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba Java \u8a9e\u8a00\u8a2d\u8a08\u4e4b\u521d\uff0c\u4eba\u5011\u8a8d\u70ba 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u5143\u3002\u7136\u800c\uff0c\u9019\u662f\u4e00\u500b\u4e0d\u6b63\u78ba\u7684\u5224\u65b7\u3002\u5f8c\u4f86 Unicode \u898f\u7bc4\u64f4\u5c55\u5230\u4e86\u8d85\u904e 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u5143\u73fe\u5728\u53ef\u80fd\u7531\u4e00\u5c0d 16 \u4f4d\u7684\u503c\uff08\u7a31\u70ba\u201c\u4ee3\u7406\u5c0d\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u4e32\u4f7f\u7528 UTF-16 \u7de8\u78bc\u7684\u539f\u56e0\u8207 Java \u985e\u4f3c\u3002\u7576 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8a9e\u8a00\u6642\uff0cUnicode \u9084\u8655\u65bc\u767c\u5c55\u65e9\u671f\uff0c\u90a3\u6642\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7de8\u78bc\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u5143\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u4e3b\u8981\u662f\u56e0\u70ba .NET \u5e73\u81fa\u662f\u7531 Microsoft \u8a2d\u8a08\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u8853\uff08\u5305\u62ec Windows \u4f5c\u696d\u7cfb\u7d71\uff09\u90fd\u5ee3\u6cdb\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002

    \u7531\u65bc\u4ee5\u4e0a\u7a0b\u5f0f\u8a9e\u8a00\u5c0d\u5b57\u5143\u6578\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u5011\u4e0d\u5f97\u4e0d\u63a1\u53d6\u201c\u4ee3\u7406\u5c0d\u201d\u7684\u65b9\u5f0f\u4f86\u8868\u793a\u8d85\u904e 16 \u4f4d\u9577\u5ea6\u7684 Unicode \u5b57\u5143\u3002\u9019\u662f\u4e00\u500b\u4e0d\u5f97\u5df2\u70ba\u4e4b\u7684\u7121\u5948\u4e4b\u8209\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5c0d\u7684\u5b57\u4e32\u4e2d\uff0c\u4e00\u500b\u5b57\u5143\u53ef\u80fd\u4f54\u7528 2 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\uff0c\u5f9e\u800c\u55aa\u5931\u4e86\u7b49\u9577\u7de8\u78bc\u7684\u512a\u52e2\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u8655\u7406\u4ee3\u7406\u5c0d\u9700\u8981\u984d\u5916\u589e\u52a0\u7a0b\u5f0f\u78bc\uff0c\u9019\u63d0\u9ad8\u4e86\u7a0b\u5f0f\u8a2d\u8a08\u7684\u8907\u96dc\u6027\u548c\u9664\u932f\u96e3\u5ea6\u3002

    \u51fa\u65bc\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7de8\u78bc\u65b9\u6848\u3002

    • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7de8\u78bc\uff0c\u4e26\u63a1\u7528\u4e00\u7a2e\u9748\u6d3b\u7684\u5b57\u4e32\u8868\u793a\uff0c\u5132\u5b58\u7684\u5b57\u5143\u9577\u5ea6\u53d6\u6c7a\u65bc\u5b57\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u78bc\u9ede\u3002\u82e5\u5b57\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u5b57\u5143\u8d85\u51fa\u4e86 ASCII \u7bc4\u570d\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8a9e\u8a00\u5e73\u9762\uff08BMP\uff09\u5167\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 4 \u4f4d\u5143\u7d44\u3002
    • Go \u8a9e\u8a00\u7684 string \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Go \u8a9e\u8a00\u9084\u63d0\u4f9b\u4e86 rune \u578b\u5225\uff0c\u5b83\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002
    • Rust \u8a9e\u8a00\u7684 str \u548c String \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u578b\u5225\uff0c\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8a0e\u8ad6\u7684\u90fd\u662f\u5b57\u4e32\u5728\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u9019\u548c\u5b57\u4e32\u5982\u4f55\u5728\u6a94\u6848\u4e2d\u5132\u5b58\u6216\u5728\u7db2\u8def\u4e2d\u50b3\u8f38\u662f\u4e0d\u540c\u7684\u554f\u984c\u3002\u5728\u6a94\u6848\u5132\u5b58\u6216\u7db2\u8def\u50b3\u8f38\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u5b57\u4e32\u7de8\u78bc\u70ba UTF-8 \u683c\u5f0f\uff0c\u4ee5\u9054\u5230\u6700\u512a\u7684\u76f8\u5bb9\u6027\u548c\u7a7a\u9593\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e","text":"

    \u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\u5305\u62ec\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\uff0c\u5b83\u5011\u53ef\u4ee5\u5f9e\u201c\u908f\u8f2f\u7d50\u69cb\u201d\u548c\u201c\u7269\u7406\u7d50\u69cb\u201d\u5169\u500b\u7dad\u5ea6\u9032\u884c\u5206\u985e\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u908f\u8f2f\u7d50\u69cb\uff1a\u7dda\u6027\u8207\u975e\u7dda\u6027","text":"

    \u908f\u8f2f\u7d50\u69cb\u63ed\u793a\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\u3002\u5728\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u8cc7\u6599\u6309\u7167\u4e00\u5b9a\u9806\u5e8f\u6392\u5217\uff0c\u9ad4\u73fe\u4e86\u8cc7\u6599\u4e4b\u9593\u7684\u7dda\u6027\u95dc\u4fc2\uff1b\u800c\u5728\u6a39\u4e2d\uff0c\u8cc7\u6599\u5f9e\u9802\u90e8\u5411\u4e0b\u6309\u5c64\u6b21\u6392\u5217\uff0c\u8868\u73fe\u51fa\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff1b\u5716\u5247\u7531\u7bc0\u9ede\u548c\u908a\u69cb\u6210\uff0c\u53cd\u6620\u4e86\u8907\u96dc\u7684\u7db2\u8def\u95dc\u4fc2\u3002

    \u5982\u5716 3-1 \u6240\u793a\uff0c\u908f\u8f2f\u7d50\u69cb\u53ef\u5206\u70ba\u201c\u7dda\u6027\u201d\u548c\u201c\u975e\u7dda\u6027\u201d\u5169\u5927\u985e\u3002\u7dda\u6027\u7d50\u69cb\u6bd4\u8f03\u76f4\u89c0\uff0c\u6307\u8cc7\u6599\u5728\u908f\u8f2f\u95dc\u4fc2\u4e0a\u5448\u7dda\u6027\u6392\u5217\uff1b\u975e\u7dda\u6027\u7d50\u69cb\u5247\u76f8\u53cd\uff0c\u5448\u975e\u7dda\u6027\u6392\u5217\u3002

    • \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u4e00\u7684\u9806\u5e8f\u95dc\u4fc2\u3002
    • \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u96dc\u6e4a\u8868\u3002

    \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u6a39\u5f62\u7d50\u69cb\u548c\u7db2\u72c0\u7d50\u69cb\u3002

    • \u6a39\u5f62\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u591a\u7684\u95dc\u4fc2\u3002
    • \u7db2\u72c0\u7d50\u69cb\uff1a\u5716\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u591a\u5c0d\u591a\u7684\u95dc\u4fc2\u3002

    \u5716 3-1 \u00a0 \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u8207\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb

    "},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7d50\u69cb\uff1a\u9023\u7e8c\u8207\u5206\u6563","text":"

    \u7576\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u5716 3-2 \u5c55\u793a\u4e86\u4e00\u500b\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u689d\uff0c\u5176\u4e2d\u6bcf\u500b\u9ed1\u8272\u65b9\u584a\u90fd\u5305\u542b\u4e00\u584a\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u8a18\u61b6\u9ad4\u60f3\u8c61\u6210\u4e00\u500b\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u500b\u55ae\u5143\u683c\u90fd\u53ef\u4ee5\u5132\u5b58\u4e00\u5b9a\u5927\u5c0f\u7684\u8cc7\u6599\u3002

    \u7cfb\u7d71\u900f\u904e\u8a18\u61b6\u9ad4\u4f4d\u5740\u4f86\u8a2a\u554f\u76ee\u6a19\u4f4d\u7f6e\u7684\u8cc7\u6599\u3002\u5982\u5716 3-2 \u6240\u793a\uff0c\u8a08\u7b97\u6a5f\u6839\u64da\u7279\u5b9a\u898f\u5247\u70ba\u8868\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5206\u914d\u7de8\u865f\uff0c\u78ba\u4fdd\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u6709\u552f\u4e00\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u3002\u6709\u4e86\u9019\u4e9b\u4f4d\u5740\uff0c\u7a0b\u5f0f\u4fbf\u53ef\u4ee5\u8a2a\u554f\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u3002

    \u5716 3-2 \u00a0 \u8a18\u61b6\u9ad4\u689d\u3001\u8a18\u61b6\u9ad4\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u4f4d\u5740

    Tip

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5c07\u8a18\u61b6\u9ad4\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u500b\u7c21\u5316\u7684\u985e\u6bd4\uff0c\u5be6\u969b\u8a18\u61b6\u9ad4\u7684\u5de5\u4f5c\u6a5f\u5236\u6bd4\u8f03\u8907\u96dc\uff0c\u6d89\u53ca\u4f4d\u5740\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u7ba1\u7406\u3001\u5feb\u53d6\u6a5f\u5236\u3001\u865b\u64ec\u8a18\u61b6\u9ad4\u548c\u7269\u7406\u8a18\u61b6\u9ad4\u7b49\u6982\u5ff5\u3002

    \u8a18\u61b6\u9ad4\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u5171\u4eab\u8cc7\u6e90\uff0c\u7576\u67d0\u584a\u8a18\u61b6\u9ad4\u88ab\u67d0\u500b\u7a0b\u5f0f\u4f54\u7528\u6642\uff0c\u5247\u7121\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5f0f\u540c\u6642\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u4e2d\uff0c\u8a18\u61b6\u9ad4\u8cc7\u6e90\u662f\u4e00\u500b\u91cd\u8981\u7684\u8003\u616e\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u6f14\u7b97\u6cd5\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u5cf0\u503c\u4e0d\u61c9\u8d85\u904e\u7cfb\u7d71\u5269\u9918\u7a7a\u9592\u8a18\u61b6\u9ad4\uff1b\u5982\u679c\u7f3a\u5c11\u9023\u7e8c\u5927\u584a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u90a3\u9ebc\u6240\u9078\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u5fc5\u9808\u80fd\u5920\u5132\u5b58\u5728\u5206\u6563\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\u3002

    \u5982\u5716 3-3 \u6240\u793a\uff0c\u7269\u7406\u7d50\u69cb\u53cd\u6620\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u53ef\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u7269\u7406\u7d50\u69cb\u5f9e\u5e95\u5c64\u6c7a\u5b9a\u4e86\u8cc7\u6599\u7684\u8a2a\u554f\u3001\u66f4\u65b0\u3001\u589e\u522a\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u65b9\u9762\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u9ede\u3002

    \u5716 3-3 \u00a0 \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u8207\u5206\u6563\u7a7a\u9593\u5132\u5b58

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u57fa\u65bc\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u4e8c\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002\u4f8b\u5982\uff0c\u5806\u758a\u548c\u4f47\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u5be6\u73fe\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1b\u800c\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u3002

    • \u57fa\u65bc\u9663\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u77e9\u9663\u3001\u5f35\u91cf\uff08\u7dad\u5ea6 \\(\\geq 3\\) \u7684\u9663\u5217\uff09\u7b49\u3002
    • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u3002

    \u93c8\u7d50\u4e32\u5217\u5728\u521d\u59cb\u5316\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u5c0d\u5176\u9577\u5ea6\u9032\u884c\u8abf\u6574\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u52d5\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u9663\u5217\u53ef\u900f\u904e\u91cd\u65b0\u5206\u914d\u8a18\u61b6\u9ad4\u5be6\u73fe\u9577\u5ea6\u8b8a\u5316\uff0c\u5f9e\u800c\u5177\u5099\u4e00\u5b9a\u7684\u201c\u52d5\u614b\u6027\u201d\u3002

    Tip

    \u5982\u679c\u4f60\u611f\u89ba\u7269\u7406\u7d50\u69cb\u7406\u89e3\u8d77\u4f86\u6709\u56f0\u96e3\uff0c\u5efa\u8b70\u5148\u95b1\u8b80\u4e0b\u4e00\u7ae0\uff0c\u7136\u5f8c\u518d\u56de\u9867\u672c\u7bc0\u5167\u5bb9\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *","text":"

    Note

    \u5728\u672c\u66f8\u4e2d\uff0c\u6a19\u984c\u5e36\u6709 * \u7b26\u865f\u7684\u662f\u9078\u8b80\u7ae0\u7bc0\u3002\u5982\u679c\u4f60\u6642\u9593\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\uff0c\u7b49\u5b78\u5b8c\u5fc5\u8b80\u7ae0\u7bc0\u5f8c\u518d\u55ae\u7368\u653b\u514b\u3002

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578","text":"

    \u5728\u4e0a\u4e00\u7bc0\u7684\u8868\u683c\u4e2d\u6211\u5011\u767c\u73fe\uff0c\u6240\u6709\u6574\u6578\u578b\u5225\u80fd\u5920\u8868\u793a\u7684\u8ca0\u6578\u90fd\u6bd4\u6b63\u6578\u591a\u4e00\u500b\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \u3002\u9019\u500b\u73fe\u8c61\u6bd4\u8f03\u53cd\u76f4\u89ba\uff0c\u5b83\u7684\u5167\u5728\u539f\u56e0\u6d89\u53ca\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u76f8\u95dc\u77e5\u8b58\u3002

    \u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6578\u5b57\u662f\u4ee5\u201c\u4e8c\u88dc\u6578\u201d\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u7684\u3002\u5728\u5206\u6790\u9019\u6a23\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7d66\u51fa\u4e09\u8005\u7684\u5b9a\u7fa9\u3002

    • \u539f\u78bc\uff1a\u6211\u5011\u5c07\u6578\u5b57\u7684\u4e8c\u9032\u4f4d\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u8996\u70ba\u7b26\u865f\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6578\uff0c\\(1\\) \u8868\u793a\u8ca0\u6578\uff0c\u5176\u9918\u4f4d\u8868\u793a\u6578\u5b57\u7684\u503c\u3002
    • \u4e00\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e00\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e00\u88dc\u6578\u662f\u5c0d\u5176\u539f\u78bc\u9664\u7b26\u865f\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u4e8c\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e8c\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e8c\u88dc\u6578\u662f\u5728\u5176\u4e00\u88dc\u6578\u7684\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u3002

    \u5716 3-4 \u5c55\u793a\u4e86\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u8f49\u63db\u65b9\u6cd5\u3002

    \u5716 3-4 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u8207\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u76f8\u4e92\u8f49\u63db

    \u539f\u78bc\uff08sign-magnitude\uff09\u96d6\u7136\u6700\u76f4\u89c0\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8ca0\u6578\u7684\u539f\u78bc\u4e0d\u80fd\u76f4\u63a5\u7528\u65bc\u904b\u7b97\u3002\u4f8b\u5982\u5728\u539f\u78bc\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7d50\u679c\u662f \\(-3\\) \uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002

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

    \u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u8a08\u7b97\u6a5f\u5f15\u5165\u4e86\u4e00\u88dc\u6578\uff081's complement\uff09\u3002\u5982\u679c\u6211\u5011\u5148\u5c07\u539f\u78bc\u8f49\u63db\u70ba\u4e00\u88dc\u6578\uff0c\u4e26\u5728\u4e00\u88dc\u6578\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5f9e\u4e00\u88dc\u6578\u8f49\u63db\u56de\u539f\u78bc\uff0c\u5247\u53ef\u5f97\u5230\u6b63\u78ba\u7d50\u679c \\(-1\\) \u3002

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

    \u53e6\u4e00\u65b9\u9762\uff0c\u6578\u5b57\u96f6\u7684\u539f\u78bc\u6709 \\(+0\\) \u548c \\(-0\\) \u5169\u7a2e\u8868\u793a\u65b9\u5f0f\u3002\u9019\u610f\u5473\u8457\u6578\u5b57\u96f6\u5c0d\u61c9\u5169\u500b\u4e0d\u540c\u7684\u4e8c\u9032\u4f4d\u5236\u7de8\u78bc\uff0c\u9019\u53ef\u80fd\u6703\u5e36\u4f86\u6b67\u7fa9\u3002\u6bd4\u5982\u5728\u689d\u4ef6\u5224\u65b7\u4e2d\uff0c\u5982\u679c\u6c92\u6709\u5340\u5206\u6b63\u96f6\u548c\u8ca0\u96f6\uff0c\u5247\u53ef\u80fd\u6703\u5c0e\u81f4\u5224\u65b7\u7d50\u679c\u51fa\u932f\u3002\u800c\u5982\u679c\u6211\u5011\u60f3\u8655\u7406\u6b63\u96f6\u548c\u8ca0\u96f6\u6b67\u7fa9\uff0c\u5247\u9700\u8981\u5f15\u5165\u984d\u5916\u7684\u5224\u65b7\u64cd\u4f5c\uff0c\u9019\u53ef\u80fd\u6703\u964d\u4f4e\u8a08\u7b97\u6a5f\u7684\u904b\u7b97\u6548\u7387\u3002

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

    \u8207\u539f\u78bc\u4e00\u6a23\uff0c\u4e00\u88dc\u6578\u4e5f\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u554f\u984c\uff0c\u56e0\u6b64\u8a08\u7b97\u6a5f\u9032\u4e00\u6b65\u5f15\u5165\u4e86\u4e8c\u88dc\u6578\uff082's complement\uff09\u3002\u6211\u5011\u5148\u4f86\u89c0\u5bdf\u4e00\u4e0b\u8ca0\u96f6\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u8f49\u63db\u904e\u7a0b\uff1a

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u78bc)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u4e00\u88dc\u6578)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline \\end{aligned} \\]

    \u5728\u8ca0\u96f6\u7684\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u6703\u7522\u751f\u9032\u4f4d\uff0c\u4f46 byte \u578b\u5225\u7684\u9577\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u4f4d\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u6703\u88ab\u6368\u68c4\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8ca0\u96f6\u7684\u4e8c\u88dc\u6578\u70ba \\(0000 \\; 0000\\) \uff0c\u8207\u6b63\u96f6\u7684\u4e8c\u88dc\u6578\u76f8\u540c\u3002\u9019\u610f\u5473\u8457\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u500b\u96f6\uff0c\u6b63\u8ca0\u96f6\u6b67\u7fa9\u5f9e\u800c\u5f97\u5230\u89e3\u6c7a\u3002

    \u9084\u5269\u6700\u5f8c\u4e00\u500b\u7591\u60d1\uff1abyte \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u4f86\u7684\u4e00\u500b\u8ca0\u6578 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u5011\u6ce8\u610f\u5230\uff0c\u5340\u9593 \\([-127, +127]\\) \u5167\u7684\u6240\u6709\u6574\u6578\u90fd\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\uff0c\u4e26\u4e14\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u53ef\u4ee5\u4e92\u76f8\u8f49\u63db\u3002

    \u7136\u800c\uff0c\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u662f\u4e00\u500b\u4f8b\u5916\uff0c\u5b83\u4e26\u6c92\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3002\u6839\u64da\u8f49\u63db\u65b9\u6cd5\uff0c\u6211\u5011\u5f97\u5230\u8a72\u4e8c\u88dc\u6578\u7684\u539f\u78bc\u70ba \\(0000 \\; 0000\\) \u3002\u9019\u986f\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u70ba\u8a72\u539f\u78bc\u8868\u793a\u6578\u5b57 \\(0\\) \uff0c\u5b83\u7684\u4e8c\u88dc\u6578\u61c9\u8a72\u662f\u81ea\u8eab\u3002\u8a08\u7b97\u6a5f\u898f\u5b9a\u9019\u500b\u7279\u6b8a\u7684\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5be6\u969b\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u4e8c\u88dc\u6578\u4e0b\u7684\u8a08\u7b97\u7d50\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u4e8c\u88dc\u6578)} + 1111 \\; 1111 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7d93\u767c\u73fe\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8a08\u7b97\u90fd\u662f\u52a0\u6cd5\u904b\u7b97\u3002\u9019\u6697\u793a\u8457\u4e00\u500b\u91cd\u8981\u4e8b\u5be6\uff1a\u8a08\u7b97\u6a5f\u5167\u90e8\u7684\u786c\u9ad4\u96fb\u8def\u4e3b\u8981\u662f\u57fa\u65bc\u52a0\u6cd5\u904b\u7b97\u8a2d\u8a08\u7684\u3002\u9019\u662f\u56e0\u70ba\u52a0\u6cd5\u904b\u7b97\u76f8\u5c0d\u65bc\u5176\u4ed6\u904b\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u6e1b\u6cd5\uff09\u4f86\u8aaa\uff0c\u786c\u9ad4\u5be6\u73fe\u8d77\u4f86\u66f4\u7c21\u55ae\uff0c\u66f4\u5bb9\u6613\u9032\u884c\u4e26\u884c\u5316\u8655\u7406\uff0c\u904b\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

    \u8acb\u6ce8\u610f\uff0c\u9019\u4e26\u4e0d\u610f\u5473\u8457\u8a08\u7b97\u6a5f\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u900f\u904e\u5c07\u52a0\u6cd5\u8207\u4e00\u4e9b\u57fa\u672c\u908f\u8f2f\u904b\u7b97\u7d50\u5408\uff0c\u8a08\u7b97\u6a5f\u80fd\u5920\u5be6\u73fe\u5404\u7a2e\u5176\u4ed6\u7684\u6578\u5b78\u904b\u7b97\u3002\u4f8b\u5982\uff0c\u8a08\u7b97\u6e1b\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8a08\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u6e1b\u6cd5\u3002

    \u73fe\u5728\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u4e8c\u88dc\u6578\u7684\u539f\u56e0\uff1a\u57fa\u65bc\u4e8c\u88dc\u6578\u8868\u793a\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u7528\u540c\u6a23\u7684\u96fb\u8def\u548c\u64cd\u4f5c\u4f86\u8655\u7406\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\u4f86\u8655\u7406\u6e1b\u6cd5\uff0c\u4e26\u4e14\u7121\u9808\u7279\u5225\u8655\u7406\u6b63\u8ca0\u96f6\u7684\u6b67\u7fa9\u554f\u984c\u3002\u9019\u5927\u5927\u7c21\u5316\u4e86\u786c\u9ad4\u8a2d\u8a08\uff0c\u63d0\u9ad8\u4e86\u904b\u7b97\u6548\u7387\u3002

    \u4e8c\u88dc\u6578\u7684\u8a2d\u8a08\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u95dc\u4fc2\u6211\u5011\u5c31\u5148\u4ecb\u7d39\u5230\u9019\u88e1\uff0c\u5efa\u8b70\u6709\u8208\u8da3\u7684\u8b80\u8005\u9032\u4e00\u6b65\u6df1\u5165\u77ad\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u9ede\u6578\u7de8\u78bc","text":"

    \u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u6703\u767c\u73fe\uff1aint \u548c float \u9577\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u4f4d\u5143\u7d44 \uff0c\u4f46\u70ba\u4ec0\u9ebc float \u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \uff1f\u9019\u975e\u5e38\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u6309\u7406\u8aaa float \u9700\u8981\u8868\u793a\u5c0f\u6578\uff0c\u53d6\u503c\u7bc4\u570d\u61c9\u8a72\u8b8a\u5c0f\u624d\u5c0d\u3002

    \u5be6\u969b\u4e0a\uff0c\u9019\u662f\u56e0\u70ba\u6d6e\u9ede\u6578 float \u63a1\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8a18\u4e00\u500b 32 \u4f4d\u5143\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u70ba\uff1a

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

    \u6839\u64da IEEE 754 \u6a19\u6e96\uff0c32-bit \u9577\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u500b\u90e8\u5206\u69cb\u6210\u3002

    • \u7b26\u865f\u4f4d \\(\\mathrm{S}\\) \uff1a\u4f54 1 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{31}\\) \u3002
    • \u6307\u6578\u4f4d \\(\\mathrm{E}\\) \uff1a\u4f54 8 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
    • \u5206\u6578\u4f4d \\(\\mathrm{N}\\) \uff1a\u4f54 23 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

    \u4e8c\u9032\u4f4d\u5236\u6578 float \u5c0d\u61c9\u503c\u7684\u8a08\u7b97\u65b9\u6cd5\u70ba\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 \\]

    \u8f49\u5316\u5230\u5341\u9032\u4f4d\u5236\u4e0b\u7684\u8a08\u7b97\u516c\u5f0f\u70ba\uff1a

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

    \u5176\u4e2d\u5404\u9805\u7684\u53d6\u503c\u7bc4\u570d\u70ba\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} \\]

    \u5716 3-5 \u00a0 IEEE 754 \u6a19\u6e96\u4e0b\u7684 float \u7684\u8a08\u7b97\u793a\u4f8b

    \u89c0\u5bdf\u5716 3-5 \uff0c\u7d66\u5b9a\u4e00\u500b\u793a\u4f8b\u8cc7\u6599 \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5247\u6709\uff1a

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

    \u73fe\u5728\u6211\u5011\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u554f\u984c\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6578\u4f4d\uff0c\u5c0e\u81f4\u5176\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \u3002\u6839\u64da\u4ee5\u4e0a\u8a08\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6578\u70ba \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u63db\u7b26\u865f\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8ca0\u6578\u3002

    \u5118\u7ba1\u6d6e\u9ede\u6578 float \u64f4\u5c55\u4e86\u53d6\u503c\u7bc4\u570d\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6578\u578b\u5225 int \u5c07\u5168\u90e8 32 \u4f4d\u5143\u7528\u65bc\u8868\u793a\u6578\u5b57\uff0c\u6578\u5b57\u662f\u5747\u52fb\u5206\u4f48\u7684\uff1b\u800c\u7531\u65bc\u6307\u6578\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u9ede\u6578 float \u7684\u6578\u503c\u8d8a\u5927\uff0c\u76f8\u9130\u5169\u500b\u6578\u5b57\u4e4b\u9593\u7684\u5dee\u503c\u5c31\u6703\u8da8\u5411\u8d8a\u5927\u3002

    \u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6578\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u7fa9\uff0c\u7528\u65bc\u8868\u793a\u96f6\u3001\u7121\u7aae\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

    \u8868 3-2 \u00a0 \u6307\u6578\u4f4d\u542b\u7fa9

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

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6b21\u6b63\u898f\u6578\u986f\u8457\u63d0\u5347\u4e86\u6d6e\u9ede\u6578\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u898f\u6578\u70ba \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u898f\u6578\u70ba \\(2^{-126} \\times 2^{-23}\\) \u3002

    \u96d9\u7cbe\u5ea6 double \u4e5f\u63a1\u7528\u985e\u4f3c\u65bc float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d05\u8ff0\u3002

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u5f9e\u908f\u8f2f\u7d50\u69cb\u548c\u7269\u7406\u7d50\u69cb\u5169\u500b\u89d2\u5ea6\u9032\u884c\u5206\u985e\u3002\u908f\u8f2f\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\uff0c\u800c\u7269\u7406\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\u3002
    • \u5e38\u898b\u7684\u908f\u8f2f\u7d50\u69cb\u5305\u62ec\u7dda\u6027\u3001\u6a39\u72c0\u548c\u7db2\u72c0\u7b49\u3002\u901a\u5e38\u6211\u5011\u6839\u64da\u908f\u8f2f\u7d50\u69cb\u5c07\u8cc7\u6599\u7d50\u69cb\u5206\u70ba\u7dda\u6027\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\uff09\u548c\u975e\u7dda\u6027\uff08\u6a39\u3001\u5716\u3001\u5806\u7a4d\uff09\u5169\u7a2e\u3002\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002
    • \u7576\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u88ab\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u3002\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u64c1\u6709\u5c0d\u61c9\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u7a0b\u5f0f\u900f\u904e\u9019\u4e9b\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a2a\u554f\u8cc7\u6599\u3002
    • \u7269\u7406\u7d50\u69cb\u4e3b\u8981\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u7531\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u5169\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002
    • \u8a08\u7b97\u6a5f\u4e2d\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u5305\u62ec\u6574\u6578 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u9ede\u6578 float\u3001double \uff0c\u5b57\u5143 char \u548c\u5e03\u6797 bool \u3002\u5b83\u5011\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u4f54\u7528\u7a7a\u9593\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7de8\u78bc\u6578\u5b57\u7684\u4e09\u7a2e\u65b9\u6cd5\uff0c\u5b83\u5011\u4e4b\u9593\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\u3002\u6574\u6578\u7684\u539f\u78bc\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u865f\u4f4d\uff0c\u5176\u9918\u4f4d\u662f\u6578\u5b57\u7684\u503c\u3002
    • \u6574\u6578\u5728\u8a08\u7b97\u6a5f\u4e2d\u662f\u4ee5\u4e8c\u88dc\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\u3002\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e0b\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u5c0d\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\u4e00\u8996\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u70ba\u6e1b\u6cd5\u64cd\u4f5c\u55ae\u7368\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\uff0c\u4e26\u4e14\u4e0d\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u7684\u554f\u984c\u3002
    • \u6d6e\u9ede\u6578\u7684\u7de8\u78bc\u7531 1 \u4f4d\u7b26\u865f\u4f4d\u30018 \u4f4d\u6307\u6578\u4f4d\u548c 23 \u4f4d\u5206\u6578\u4f4d\u69cb\u6210\u3002\u7531\u65bc\u5b58\u5728\u6307\u6578\u4f4d\uff0c\u56e0\u6b64\u6d6e\u9ede\u6578\u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc\u6574\u6578\uff0c\u4ee3\u50f9\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5171\u6536\u9304 127 \u500b\u5b57\u5143\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u9304\u5169\u842c\u591a\u500b\u6f22\u5b57\u3002Unicode \u81f4\u529b\u65bc\u63d0\u4f9b\u4e00\u500b\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u6536\u9304\u4e16\u754c\u4e0a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u5f9e\u800c\u89e3\u6c7a\u7531\u65bc\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5c0e\u81f4\u7684\u4e82\u78bc\u554f\u984c\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b61\u8fce\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u7a2e\u8b8a\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u64f4\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5132\u5b58\u7a7a\u9593\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\u3002\u5728\u7de8\u78bc\u4e2d\u6587\u6642\uff0cUTF-16 \u4f54\u7528\u7684\u7a7a\u9593\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7a0b\u5f0f\u8a9e\u8a00\u9810\u8a2d\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1f

    \u96dc\u6e4a\u8868\u5e95\u5c64\u662f\u9663\u5217\uff0c\u800c\u70ba\u4e86\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\uff0c\u6211\u5011\u53ef\u80fd\u6703\u4f7f\u7528\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\uff08\u5f8c\u7e8c\u201c\u96dc\u6e4a\u885d\u7a81\u201d\u7ae0\u7bc0\u6703\u8b1b\uff09\uff1a\u9663\u5217\u4e2d\u6bcf\u500b\u6876\u6307\u5411\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u8d85\u904e\u4e00\u5b9a\u95be\u503c\u6642\uff0c\u53c8\u53ef\u80fd\u88ab\u8f49\u5316\u70ba\u6a39\uff08\u901a\u5e38\u70ba\u7d05\u9ed1\u6a39\uff09\u3002

    \u5f9e\u5132\u5b58\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u96dc\u6e4a\u8868\u7684\u5e95\u5c64\u662f\u9663\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u500b\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u6216\u4e00\u68f5\u6a39\u3002\u56e0\u6b64\uff0c\u96dc\u6e4a\u8868\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\uff09\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u6a39\uff09\u3002

    Q\uff1achar \u578b\u5225\u7684\u9577\u5ea6\u662f 1 \u4f4d\u5143\u7d44\u55ce\uff1f

    char \u578b\u5225\u7684\u9577\u5ea6\u7531\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u7528\u7684\u7de8\u78bc\u65b9\u6cd5\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u63a1\u7528 UTF-16 \u7de8\u78bc\uff08\u5132\u5b58 Unicode \u78bc\u9ede\uff09\uff0c\u56e0\u6b64 char \u578b\u5225\u7684\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u3002

    Q\uff1a\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d \u662f\u5426\u6709\u6b67\u7fa9\uff1f\u5806\u758a\u4e5f\u53ef\u4ee5\u9032\u884c\u51fa\u5806\u758a\u548c\u5165\u5806\u758a\u7b49\u64cd\u4f5c\uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52d5\u614b\u201d\u7684\u3002

    \u5806\u758a\u78ba\u5be6\u53ef\u4ee5\u5be6\u73fe\u52d5\u614b\u7684\u8cc7\u6599\u64cd\u4f5c\uff0c\u4f46\u8cc7\u6599\u7d50\u69cb\u4ecd\u7136\u662f\u201c\u975c\u614b\u201d\uff08\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff09\u7684\u3002\u5118\u7ba1\u57fa\u65bc\u9663\u5217\u7684\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u52d5\u614b\u5730\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u5011\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u8cc7\u6599\u91cf\u8d85\u51fa\u4e86\u9810\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u66f4\u5927\u7684\u9663\u5217\uff0c\u4e26\u5c07\u820a\u9663\u5217\u7684\u5167\u5bb9\u8907\u88fd\u5230\u65b0\u9663\u5217\u4e2d\u3002

    Q\uff1a\u5728\u69cb\u5efa\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u6642\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u70ba\u4ec0\u9ebc\u5b83\u5011\u662f\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u5462\uff1f

    \u5728\u9ad8\u968e\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u7121\u9808\u4eba\u5de5\u6307\u5b9a\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u9019\u500b\u5de5\u4f5c\u7531\u985e\u5225\u5167\u90e8\u81ea\u52d5\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u70ba 10\u3002\u53e6\u5916\uff0c\u64f4\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52d5\u5be6\u73fe\u7684\u3002\u8a73\u898b\u5f8c\u7e8c\u7684\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u3002

    Q\uff1a\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\uff0c\u90a3\u9ebc\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u61c9\u8a72\u662f\u9006\u904b\u7b97\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff0c\u800c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u4e5f\u4e00\u6a23\u53ef\u4ee5\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff0c\u9019\u662f\u70ba\u4ec0\u9ebc\u5462\uff1f

    A\uff1a\u9019\u662f\u56e0\u70ba\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u76f8\u4e92\u8f49\u63db\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u201c\u88dc\u6578\u201d\u7684\u904e\u7a0b\u3002\u6211\u5011\u5148\u7d66\u51fa\u88dc\u6578\u7684\u5b9a\u7fa9\uff1a\u5047\u8a2d \\(a + b = c\\) \uff0c\u90a3\u9ebc\u6211\u5011\u7a31 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u88dc\u6578\uff0c\u53cd\u4e4b\u4e5f\u7a31 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u88dc\u6578\u3002

    \u7d66\u5b9a\u4e00\u500b \\(n = 4\\) \u4f4d\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578 \\(0010\\) \uff0c\u5982\u679c\u5c07\u9019\u500b\u6578\u5b57\u770b\u4f5c\u539f\u78bc\uff08\u4e0d\u8003\u616e\u7b26\u865f\u4f4d\uff09\uff0c\u90a3\u9ebc\u5b83\u7684\u4e8c\u88dc\u6578\u9700\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff1a

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

    \u6211\u5011\u6703\u767c\u73fe\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8aaa\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u662f\u539f\u78bc \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u3002\u9019\u610f\u5473\u8457\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\u7684\u904e\u7a0b\u3002

    \u90a3\u9ebc\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u5011\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

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

    \u63db\u53e5\u8a71\u8aaa\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e92\u70ba\u5c0d\u65b9\u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\uff0c\u56e0\u6b64\u201c\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u201d\u548c\u201c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u5f8c\u52a0 1 \uff09\u5be6\u73fe\u3002

    \u7576\u7136\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u7528\u9006\u904b\u7b97\u4f86\u6c42\u4e8c\u88dc\u6578 \\(1110\\) \u7684\u539f\u78bc\uff0c\u5373\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff1a

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

    \u7e3d\u7d50\u4f86\u770b\uff0c\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u548c\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\u9019\u5169\u7a2e\u904b\u7b97\u90fd\u662f\u5728\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\uff0c\u5b83\u5011\u662f\u7b49\u50f9\u7684\u3002

    \u672c\u8cea\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u88dc\u6578\uff08\u56e0\u70ba\u6046\u6709 \u539f\u78bc + \u4e00\u88dc\u6578 = 1111\uff09\uff1b\u800c\u5728\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u4e8c\u88dc\u6578\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u88dc\u6578\u3002

    \u4e0a\u8ff0 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u63a8\u5ee3\u81f3\u4efb\u610f\u4f4d\u6578\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u3002

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

    Abstract

    \u96e3\u984c\u88ab\u9010\u5c64\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u8b8a\u5f97\u66f4\u70ba\u7c21\u55ae\u3002

    \u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u500b\u91cd\u8981\u7684\u4e8b\u5be6\uff1a\u5f9e\u7c21\u55ae\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u8907\u96dc\u3002

    "},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5
    • 12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565
    • 12.3 \u00a0 \u69cb\u5efa\u6a39\u554f\u984c
    • 12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c
    • 12.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565","text":"

    \u6211\u5011\u5df2\u7d93\u5b78\u904e\uff0c\u641c\u5c0b\u6f14\u7b97\u6cd5\u5206\u70ba\u5169\u5927\u985e\u3002

    • \u66b4\u529b\u641c\u5c0b\uff1a\u5b83\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
    • \u81ea\u9069\u61c9\u641c\u5c0b\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u8cc7\u6599\u7d44\u7e54\u5f62\u5f0f\u6216\u5148\u9a57\u8cc7\u8a0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u548c\u6a39\u3002

    • \u4e8c\u5206\u641c\u5c0b\u7684\u6bcf\u4e00\u6b65\u90fd\u5c07\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\u5206\u89e3\u70ba\u4e00\u500b\u5c0f\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\uff0c\u9019\u500b\u904e\u7a0b\u4e00\u76f4\u6301\u7e8c\u5230\u9663\u5217\u70ba\u7a7a\u6216\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
    • \u6a39\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u5806\u7a4d\u7b49\u8cc7\u6599\u7d50\u69cb\u4e2d\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7686\u70ba \\(O(\\log n)\\) \u3002

    \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

    • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u641c\u5c0b\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u9032\u884c\u67e5\u8a62\uff09\u5206\u89e3\u70ba\u5b50\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u9032\u884c\u67e5\u8a62\uff09\uff0c\u9019\u662f\u900f\u904e\u6bd4\u8f03\u4e2d\u9593\u5143\u7d20\u548c\u76ee\u6a19\u5143\u7d20\u4f86\u5be6\u73fe\u7684\u3002
    • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u8655\u7406\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u554f\u984c\u7684\u5f71\u97ff\u3002
    • \u5b50\u554f\u984c\u7684\u89e3\u7121\u9808\u5408\u4f75\uff1a\u4e8c\u5206\u641c\u5c0b\u65e8\u5728\u67e5\u8a62\u4e00\u500b\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u3002\u7576\u5b50\u554f\u984c\u5f97\u5230\u89e3\u6c7a\u6642\uff0c\u539f\u554f\u984c\u4e5f\u6703\u540c\u6642\u5f97\u5230\u89e3\u6c7a\u3002

    \u5206\u6cbb\u80fd\u5920\u63d0\u5347\u641c\u5c0b\u6548\u7387\uff0c\u672c\u8cea\u4e0a\u662f\u56e0\u70ba\u66b4\u529b\u641c\u5c0b\u6bcf\u8f2a\u53ea\u80fd\u6392\u9664\u4e00\u500b\u9078\u9805\uff0c\u800c\u5206\u6cbb\u641c\u5c0b\u6bcf\u8f2a\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9078\u9805\u3002

    "},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u65bc\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b","text":"

    \u5728\u4e4b\u524d\u7684\u7ae0\u7bc0\u4e2d\uff0c\u4e8c\u5206\u641c\u5c0b\u662f\u57fa\u65bc\u905e\u63a8\uff08\u8fed\u4ee3\uff09\u5be6\u73fe\u7684\u3002\u73fe\u5728\u6211\u5011\u57fa\u65bc\u5206\u6cbb\uff08\u905e\u8ff4\uff09\u4f86\u5be6\u73fe\u5b83\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8acb\u67e5\u8a62\u5143\u7d20 target \u3002

    \u5f9e\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u5011\u5c07\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u8a18\u70ba \\(f(i, j)\\) \u3002

    \u4ee5\u539f\u554f\u984c \\(f(0, n-1)\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u900f\u904e\u4ee5\u4e0b\u6b65\u9a5f\u9032\u884c\u4e8c\u5206\u641c\u5c0b\u3002

    1. \u8a08\u7b97\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u7684\u4e2d\u9ede \\(m\\) \uff0c\u6839\u64da\u5b83\u6392\u9664\u4e00\u534a\u641c\u5c0b\u5340\u9593\u3002
    2. \u905e\u8ff4\u6c42\u89e3\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\u7684\u5b50\u554f\u984c\uff0c\u53ef\u80fd\u70ba \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
    3. \u8ff4\u5708\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u5340\u9593\u70ba\u7a7a\u6642\u8fd4\u56de\u3002

    \u5716 12-4 \u5c55\u793a\u4e86\u5728\u9663\u5217\u4e2d\u4e8c\u5206\u641c\u5c0b\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u904e\u7a0b\u3002

    \u5716 12-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u904e\u7a0b

    \u5728\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \u4f86\u6c42\u89e3\u554f\u984c \\(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\u641c\u5c0b\uff1a\u554f\u984c f(i, j)\"\"\"\n    # \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
    binary_search_recur.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.java
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
    binary_search_recur.go
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u6c92\u6709\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8a08\u7b97\u7d22\u5f15\u4e2d\u9ede\n    m := i + ((j - i) >> 1)\n    //\u5224\u65b7\u4e2d\u9ede\u8207\u76ee\u6a19\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u53f3\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u5de6\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\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\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u554f\u984c 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\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u554f\u984c f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.c
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \uff0c\u8acb\u5f9e\u4e2d\u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u8fd4\u56de\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5047\u8a2d\u4e8c\u5143\u6a39\u4e2d\u6c92\u6709\u503c\u91cd\u8907\u7684\u7bc0\u9ede\uff08\u5982\u5716 12-5 \u6240\u793a\uff09\u3002

    \u5716 12-5 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65b7\u662f\u5426\u70ba\u5206\u6cbb\u554f\u984c","text":"

    \u539f\u554f\u984c\u5b9a\u7fa9\u70ba\u5f9e preorder \u548c inorder \u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u662f\u4e00\u500b\u5178\u578b\u7684\u5206\u6cbb\u554f\u984c\u3002

    • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u5f9e\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\u3001\u69cb\u5efa\u53f3\u5b50\u6a39\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u7bc0\u9ede\u3002\u800c\u5c0d\u65bc\u6bcf\u68f5\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u8907\u7528\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u5c07\u5176\u5283\u5206\u70ba\u66f4\u5c0f\u7684\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c\uff08\u7a7a\u5b50\u6a39\uff09\u6642\u7d42\u6b62\u3002
    • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u4ea4\u96c6\u3002\u5728\u69cb\u5efa\u5de6\u5b50\u6a39\u6642\uff0c\u6211\u5011\u53ea\u9700\u95dc\u6ce8\u4e2d\u5e8f\u8d70\u8a2a\u548c\u524d\u5e8f\u8d70\u8a2a\u4e2d\u8207\u5de6\u5b50\u6a39\u5c0d\u61c9\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6a39\u540c\u7406\u3002
    • \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5b83\u5011\u9023\u7d50\u5230\u6839\u7bc0\u9ede\u4e0a\uff0c\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5283\u5206\u5b50\u6a39","text":"

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u9019\u9053\u984c\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u4f86\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u900f\u904e\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u4f86\u5283\u5206\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u5462\uff1f

    \u6839\u64da\u5b9a\u7fa9\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

    • \u524d\u5e8f\u8d70\u8a2a\uff1a[ \u6839\u7bc0\u9ede | \u5de6\u5b50\u6a39 | \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 3 | 9 | 2 1 7 ] \u3002
    • \u4e2d\u5e8f\u8d70\u8a2a\uff1a[ \u5de6\u5b50\u6a39 | \u6839\u7bc0\u9ede \uff5c \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 9 | 3 | 1 2 7 ] \u3002

    \u4ee5\u4e0a\u5716\u8cc7\u6599\u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5716 12-6 \u6240\u793a\u7684\u6b65\u9a5f\u5f97\u5230\u5283\u5206\u7d50\u679c\u3002

    1. \u524d\u5e8f\u8d70\u8a2a\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u7bc0\u9ede\u7684\u503c\u3002
    2. \u67e5\u8a62\u6839\u7bc0\u9ede 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8a72\u7d22\u5f15\u53ef\u5c07 inorder \u5283\u5206\u70ba [ 9 | 3 \uff5c 1 2 7 ] \u3002
    3. \u6839\u64da inorder \u7684\u5283\u5206\u7d50\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u5206\u5225\u70ba 1 \u548c 3 \uff0c\u5f9e\u800c\u53ef\u5c07 preorder \u5283\u5206\u70ba [ 3 | 9 | 2 1 7 ] \u3002

    \u5716 12-6 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5283\u5206\u5b50\u6a39

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u65bc\u8b8a\u6578\u63cf\u8ff0\u5b50\u6a39\u5340\u9593","text":"

    \u6839\u64da\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u6211\u5011\u5df2\u7d93\u5f97\u5230\u6839\u7bc0\u9ede\u3001\u5de6\u5b50\u6a39\u3001\u53f3\u5b50\u6a39\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002\u800c\u70ba\u4e86\u63cf\u8ff0\u9019\u4e9b\u7d22\u5f15\u5340\u9593\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u3002

    • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(i\\) \u3002
    • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(m\\) \u3002
    • \u5c07\u7576\u524d\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u8a18\u70ba \\([l, r]\\) \u3002

    \u5982\u8868 12-1 \u6240\u793a\uff0c\u900f\u904e\u4ee5\u4e0a\u8b8a\u6578\u5373\u53ef\u8868\u793a\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002

    \u8868 12-1 \u00a0 \u6839\u7bc0\u9ede\u548c\u5b50\u6a39\u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u7684\u7d22\u5f15

    \u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593 \u7576\u524d\u6a39 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6a39 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6a39 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

    \u8acb\u6ce8\u610f\uff0c\u53f3\u5b50\u6a39\u6839\u7bc0\u9ede\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u7fa9\u662f\u201c\u5de6\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u201d\uff0c\u5efa\u8b70\u7d50\u5408\u5716 12-7 \u7406\u89e3\u3002

    \u5716 12-7 \u00a0 \u6839\u7bc0\u9ede\u548c\u5de6\u53f3\u5b50\u6a39\u7684\u7d22\u5f15\u5340\u9593\u8868\u793a

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u70ba\u4e86\u63d0\u5347\u67e5\u8a62 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u5011\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 hmap \u4f86\u5132\u5b58\u9663\u5217 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root = TreeNode(preorder[i])\n    # \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m = inorder_map[preorder[i]]\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\"\"\"\n    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m := inorderMap[preorder[i]]\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u7bc0\u9ede\n  return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    Some(root)\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 12-8 \u5c55\u793a\u4e86\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5404\u500b\u7bc0\u9ede\u662f\u5728\u5411\u4e0b\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u689d\u908a\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

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

    \u5716 12-8 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b

    \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u5167\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u7684\u5283\u5206\u7d50\u679c\u5982\u5716 12-9 \u6240\u793a\u3002

    \u5716 12-9 \u00a0 \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u7684\u5283\u5206\u7d50\u679c

    \u8a2d\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u500b\u7bc0\u9ede\uff08\u57f7\u884c\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u96dc\u6e4a\u8868\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5","text":"

    \u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u7a31\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u7a2e\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u5169\u500b\u6b65\u9a5f\u3002

    1. \u5206\uff08\u5283\u5206\u968e\u6bb5\uff09\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u6216\u591a\u500b\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c\u6642\u7d42\u6b62\u3002
    2. \u6cbb\uff08\u5408\u4f75\u968e\u6bb5\uff09\uff1a\u5f9e\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u554f\u984c\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

    \u5982\u5716 12-1 \u6240\u793a\uff0c\u201c\u5408\u4f75\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\u4e4b\u4e00\u3002

    1. \u5206\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u5230\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u554f\u984c\uff09\u3002
    2. \u6cbb\uff1a\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u6709\u5e8f\u7684\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002

    \u5716 12-1 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65b7\u5206\u6cbb\u554f\u984c","text":"

    \u4e00\u500b\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u6c7a\uff0c\u901a\u5e38\u53ef\u4ee5\u53c3\u8003\u4ee5\u4e0b\u5e7e\u500b\u5224\u65b7\u4f9d\u64da\u3002

    1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u554f\u984c\u53ef\u4ee5\u5206\u89e3\u6210\u898f\u6a21\u66f4\u5c0f\u3001\u985e\u4f3c\u7684\u5b50\u554f\u984c\uff0c\u4ee5\u53ca\u80fd\u5920\u4ee5\u76f8\u540c\u65b9\u5f0f\u905e\u8ff4\u5730\u9032\u884c\u5283\u5206\u3002
    2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5b50\u554f\u984c\u4e4b\u9593\u6c92\u6709\u91cd\u758a\uff0c\u4e92\u4e0d\u4f9d\u8cf4\uff0c\u53ef\u4ee5\u7368\u7acb\u89e3\u6c7a\u3002
    3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u539f\u554f\u984c\u7684\u89e3\u900f\u904e\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\u5f97\u4f86\u3002

    \u986f\u7136\uff0c\u5408\u4f75\u6392\u5e8f\u6eff\u8db3\u4ee5\u4e0a\u4e09\u500b\u5224\u65b7\u4f9d\u64da\u3002

    1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u905e\u8ff4\u5730\u5c07\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\u3002
    2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u53ef\u4ee5\u7368\u7acb\u5730\u9032\u884c\u6392\u5e8f\uff08\u5b50\u554f\u984c\u53ef\u4ee5\u7368\u7acb\u9032\u884c\u6c42\u89e3\uff09\u3002
    3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u5169\u500b\u6709\u5e8f\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002
    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u900f\u904e\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

    \u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u5f80\u5f80\u9084\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u76f8\u8f03\u65bc\u9078\u64c7\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u70ba\u5b83\u5011\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

    \u90a3\u9ebc\uff0c\u6211\u5011\u4e0d\u7981\u767c\u554f\uff1a\u70ba\u4ec0\u9ebc\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c64\u908f\u8f2f\u662f\u4ec0\u9ebc\uff1f\u63db\u53e5\u8a71\u8aaa\uff0c\u5c07\u5927\u554f\u984c\u5206\u89e3\u70ba\u591a\u500b\u5b50\u554f\u984c\u3001\u89e3\u6c7a\u5b50\u554f\u984c\u3001\u5c07\u5b50\u554f\u984c\u7684\u89e3\u5408\u4f75\u70ba\u539f\u554f\u984c\u7684\u89e3\uff0c\u9019\u5e7e\u6b65\u7684\u6548\u7387\u70ba\u4ec0\u9ebc\u6bd4\u76f4\u63a5\u89e3\u6c7a\u539f\u554f\u984c\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u9019\u500b\u554f\u984c\u53ef\u4ee5\u5f9e\u64cd\u4f5c\u6578\u91cf\u548c\u5e73\u884c\u8a08\u7b97\u5169\u65b9\u9762\u4f86\u8a0e\u8ad6\u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6578\u91cf\u6700\u4f73\u5316","text":"

    \u4ee5\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u70ba\u4f8b\uff0c\u5176\u8655\u7406\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u9700\u8981 \\(O(n^2)\\) \u6642\u9593\u3002\u5047\u8a2d\u6211\u5011\u6309\u7167\u5716 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u5247\u5283\u5206\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6bcf\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O((n / 2)^2)\\) \u6642\u9593\uff0c\u5408\u4f75\u5169\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

    \\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

    \u5716 12-2 \u00a0 \u5283\u5206\u9663\u5217\u524d\u5f8c\u7684\u6ce1\u6cab\u6392\u5e8f

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8a08\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u908a\u548c\u53f3\u908a\u5206\u5225\u70ba\u5283\u5206\u524d\u548c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u7e3d\u6578\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} \\]

    \u9019\u610f\u5473\u8457\u7576 \\(n > 4\\) \u6642\uff0c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u6578\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u61c9\u8a72\u66f4\u9ad8\u3002\u8acb\u6ce8\u610f\uff0c\u5283\u5206\u5f8c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u968e \\(O(n^2)\\) \uff0c\u53ea\u662f\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\u4e86\u3002

    \u9032\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u5011\u628a\u5b50\u9663\u5217\u4e0d\u65b7\u5730\u518d\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u505c\u6b62\u5283\u5206\u5462\uff1f\u9019\u7a2e\u601d\u8def\u5be6\u969b\u4e0a\u5c31\u662f\u201c\u5408\u4f75\u6392\u5e8f\u201d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u5011\u591a\u8a2d\u5b9a\u5e7e\u500b\u5283\u5206\u9ede\uff0c\u5c07\u539f\u9663\u5217\u5e73\u5747\u5283\u5206\u70ba \\(k\\) \u500b\u5b50\u9663\u5217\u5462\uff1f\u9019\u7a2e\u60c5\u6cc1\u8207\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u985e\u4f3c\uff0c\u5b83\u975e\u5e38\u9069\u5408\u6392\u5e8f\u6d77\u91cf\u8cc7\u6599\uff0c\u7406\u8ad6\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230 \\(O(n + k)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e73\u884c\u8a08\u7b97\u6700\u4f73\u5316","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u4e26\u884c\u89e3\u6c7a\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u9084\u6709\u5229\u65bc\u4f5c\u696d\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002

    \u4e26\u884c\u6700\u4f73\u5316\u5728\u591a\u6838\u6216\u591a\u8655\u7406\u5668\u7684\u74b0\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u70ba\u7cfb\u7d71\u53ef\u4ee5\u540c\u6642\u8655\u7406\u591a\u500b\u5b50\u554f\u984c\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8a08\u7b97\u8cc7\u6e90\uff0c\u5f9e\u800c\u986f\u8457\u6e1b\u5c11\u7e3d\u9ad4\u7684\u57f7\u884c\u6642\u9593\u3002

    \u6bd4\u5982\u5728\u5716 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u5011\u5c07\u6d77\u91cf\u7684\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u5247\u53ef\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52d9\u5206\u6563\u5230\u5404\u500b\u8a08\u7b97\u55ae\u5143\uff0c\u5b8c\u6210\u5f8c\u518d\u5408\u4f75\u7d50\u679c\u3002

    \u5716 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e73\u884c\u8a08\u7b97

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u898b\u61c9\u7528","text":"

    \u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u4f86\u89e3\u6c7a\u8a31\u591a\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\u3002

    • \u5c0b\u627e\u6700\u8fd1\u9ede\u5c0d\uff1a\u8a72\u6f14\u7b97\u6cd5\u9996\u5148\u5c07\u9ede\u96c6\u5206\u6210\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u5206\u5225\u627e\u51fa\u5169\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u9ede\u5c0d\uff0c\u6700\u5f8c\u627e\u51fa\u8de8\u8d8a\u5169\u90e8\u5206\u7684\u6700\u8fd1\u9ede\u5c0d\u3002
    • \u5927\u6574\u6578\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u6574\u6578\u4e58\u6cd5\u5206\u89e3\u70ba\u5e7e\u500b\u8f03\u5c0f\u7684\u6574\u6578\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u77e9\u9663\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u77e9\u9663\u4e58\u6cd5\u5206\u89e3\u70ba\u591a\u500b\u5c0f\u77e9\u9663\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u6cb3\u5167\u5854\u554f\u984c\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u89e3\u6c7a\uff0c\u9019\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u61c9\u7528\u3002
    • \u6c42\u89e3\u9006\u5e8f\u5c0d\uff1a\u5728\u4e00\u500b\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6578\u5b57\u5927\u65bc\u5f8c\u9762\u7684\u6578\u5b57\uff0c\u90a3\u9ebc\u9019\u5169\u500b\u6578\u5b57\u69cb\u6210\u4e00\u500b\u9006\u5e8f\u5c0d\u3002\u6c42\u89e3\u9006\u5e8f\u5c0d\u554f\u984c\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u85c9\u52a9\u5408\u4f75\u6392\u5e8f\u9032\u884c\u6c42\u89e3\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u8a2d\u8a08\u4e2d\u61c9\u7528\u5f97\u975e\u5e38\u5ee3\u6cdb\u3002

    • \u4e8c\u5206\u641c\u5c0b\uff1a\u4e8c\u5206\u641c\u5c0b\u662f\u5c07\u6709\u5e8f\u9663\u5217\u5f9e\u4e2d\u9ede\u7d22\u5f15\u8655\u5206\u70ba\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u6839\u64da\u76ee\u6a19\u503c\u8207\u4e2d\u9593\u5143\u7d20\u503c\u6bd4\u8f03\u7d50\u679c\uff0c\u6c7a\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u5340\u9593\uff0c\u4e26\u5728\u5269\u9918\u5340\u9593\u57f7\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
    • \u5408\u4f75\u6392\u5e8f\uff1a\u672c\u7bc0\u958b\u982d\u5df2\u4ecb\u7d39\uff0c\u4e0d\u518d\u8d05\u8ff0\u3002
    • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9078\u53d6\u4e00\u500b\u57fa\u6e96\u503c\uff0c\u7136\u5f8c\u628a\u9663\u5217\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u4e00\u500b\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5927\uff0c\u518d\u5c0d\u9019\u5169\u90e8\u5206\u9032\u884c\u76f8\u540c\u7684\u5283\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e0b\u4e00\u500b\u5143\u7d20\u3002
    • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c07\u8cc7\u6599\u5206\u6563\u5230\u591a\u500b\u6876\uff0c\u7136\u5f8c\u5c0d\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u5404\u500b\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u5f9e\u800c\u5f97\u5230\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002
    • \u6a39\uff1a\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u7d05\u9ed1\u6a39\u3001B \u6a39\u3001B+ \u6a39\u7b49\uff0c\u5b83\u5011\u7684\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u8996\u70ba\u5206\u6cbb\u7b56\u7565\u7684\u61c9\u7528\u3002
    • \u5806\u7a4d\uff1a\u5806\u7a4d\u662f\u4e00\u7a2e\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u5176\u5404\u7a2e\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u522a\u9664\u548c\u5806\u7a4d\u5316\uff0c\u5be6\u969b\u4e0a\u90fd\u96b1\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
    • \u96dc\u6e4a\u8868\uff1a\u96d6\u7136\u96dc\u6e4a\u8868\u4e26\u4e0d\u76f4\u63a5\u61c9\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u96dc\u6e4a\u885d\u7a81\u89e3\u6c7a\u65b9\u6848\u9593\u63a5\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u93c8\u5f0f\u4f4d\u5740\u4e2d\u7684\u9577\u93c8\u7d50\u4e32\u5217\u6703\u88ab\u8f49\u5316\u70ba\u7d05\u9ed1\u6a39\uff0c\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002

    \u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u7a2e\u201c\u6f64\u7269\u7d30\u7121\u8072\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\uff0c\u96b1\u542b\u5728\u5404\u7a2e\u6f14\u7b97\u6cd5\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u4e2d\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c","text":"

    \u5728\u5408\u4f75\u6392\u5e8f\u548c\u69cb\u5efa\u4e8c\u5143\u6a39\u4e2d\uff0c\u6211\u5011\u90fd\u662f\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u898f\u6a21\u70ba\u539f\u554f\u984c\u4e00\u534a\u7684\u5b50\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u6cb3\u5167\u5854\u554f\u984c\uff0c\u6211\u5011\u63a1\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

    Question

    \u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8a18\u70ba A\u3001B \u548c C \u3002\u8d77\u59cb\u72c0\u614b\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u8457 \\(n\\) \u500b\u5713\u76e4\uff0c\u5b83\u5011\u5f9e\u4e0a\u5230\u4e0b\u6309\u7167\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u3002\u6211\u5011\u7684\u4efb\u52d9\u662f\u8981\u628a\u9019 \\(n\\) \u500b\u5713\u76e4\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u4e26\u4fdd\u6301\u5b83\u5011\u7684\u539f\u6709\u9806\u5e8f\u4e0d\u8b8a\uff08\u5982\u5716 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52d5\u5713\u76e4\u7684\u904e\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u898f\u5247\u3002

    1. \u5713\u76e4\u53ea\u80fd\u5f9e\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u62ff\u51fa\uff0c\u5f9e\u53e6\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u653e\u5165\u3002
    2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\u3002
    3. \u5c0f\u5713\u76e4\u5fc5\u9808\u6642\u523b\u4f4d\u65bc\u5927\u5713\u76e4\u4e4b\u4e0a\u3002

    \u5716 12-10 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u793a\u4f8b

    \u6211\u5011\u5c07\u898f\u6a21\u70ba \\(i\\) \u7684\u6cb3\u5167\u5854\u554f\u984c\u8a18\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c07 \\(3\\) \u500b\u5713\u76e4\u5f9e A \u79fb\u52d5\u81f3 C \u7684\u6cb3\u5167\u5854\u554f\u984c\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u616e\u57fa\u672c\u60c5\u6cc1","text":"

    \u5982\u5716 12-11 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(1)\\) \uff0c\u5373\u7576\u53ea\u6709\u4e00\u500b\u5713\u76e4\u6642\uff0c\u6211\u5011\u5c07\u5b83\u76f4\u63a5\u5f9e A \u79fb\u52d5\u81f3 C \u5373\u53ef\u3002

    <1><2>

    \u5716 12-11 \u00a0 \u898f\u6a21\u70ba 1 \u7684\u554f\u984c\u7684\u89e3

    \u5982\u5716 12-12 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(2)\\) \uff0c\u5373\u7576\u6709\u5169\u500b\u5713\u76e4\u6642\uff0c\u7531\u65bc\u8981\u6642\u523b\u6eff\u8db3\u5c0f\u5713\u76e4\u5728\u5927\u5713\u76e4\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u85c9\u52a9 B \u4f86\u5b8c\u6210\u79fb\u52d5\u3002

    1. \u5148\u5c07\u4e0a\u9762\u7684\u5c0f\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
    2. \u518d\u5c07\u5927\u5713\u76e4\u5f9e A \u79fb\u81f3 C \u3002
    3. \u6700\u5f8c\u5c07\u5c0f\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u5716 12-12 \u00a0 \u898f\u6a21\u70ba 2 \u7684\u554f\u984c\u7684\u89e3

    \u89e3\u6c7a\u554f\u984c \\(f(2)\\) \u7684\u904e\u7a0b\u53ef\u7e3d\u7d50\u70ba\uff1a\u5c07\u5169\u500b\u5713\u76e4\u85c9\u52a9 B \u5f9e A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u7a31\u70ba\u76ee\u6a19\u67f1\u3001B \u7a31\u70ba\u7de9\u885d\u67f1\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u554f\u984c\u5206\u89e3","text":"

    \u5c0d\u65bc\u554f\u984c \\(f(3)\\) \uff0c\u5373\u7576\u6709\u4e09\u500b\u5713\u76e4\u6642\uff0c\u60c5\u6cc1\u8b8a\u5f97\u7a0d\u5fae\u8907\u96dc\u4e86\u4e00\u4e9b\u3002

    \u56e0\u70ba\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u5011\u53ef\u5f9e\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c07 A \u9802\u90e8\u7684\u5169\u500b\u5713\u76e4\u770b\u4f5c\u4e00\u500b\u6574\u9ad4\uff0c\u57f7\u884c\u5716 12-13 \u6240\u793a\u7684\u6b65\u9a5f\u3002\u9019\u6a23\u4e09\u500b\u5713\u76e4\u5c31\u88ab\u9806\u5229\u5730\u5f9e A \u79fb\u81f3 C \u4e86\u3002

    1. \u4ee4 B \u70ba\u76ee\u6a19\u67f1\u3001C \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
    2. \u5c07 A \u4e2d\u5269\u9918\u7684\u4e00\u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u52d5\u81f3 C \u3002
    3. \u4ee4 C \u70ba\u76ee\u6a19\u67f1\u3001A \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u5716 12-13 \u00a0 \u898f\u6a21\u70ba 3 \u7684\u554f\u984c\u7684\u89e3

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u5c07\u554f\u984c \\(f(3)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(2)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u4e4b\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002\u9019\u8aaa\u660e\u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u4f75\u3002

    \u81f3\u6b64\uff0c\u6211\u5011\u53ef\u7e3d\u7d50\u51fa\u5716 12-14 \u6240\u793a\u7684\u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c07\u539f\u554f\u984c \\(f(n)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \uff0c\u4e26\u6309\u7167\u4ee5\u4e0b\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u3002

    1. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 C \u5f9e A \u79fb\u81f3 B \u3002
    2. \u5c07\u5269\u9918 \\(1\\) \u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u81f3 C \u3002
    3. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 A \u5f9e B \u79fb\u81f3 C \u3002

    \u5c0d\u65bc\u9019\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u900f\u904e\u76f8\u540c\u7684\u65b9\u5f0f\u9032\u884c\u905e\u8ff4\u5283\u5206\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52d5\u64cd\u4f5c\u5373\u53ef\u3002

    \u5716 12-14 \u00a0 \u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c07\u67f1 src \u9802\u90e8\u7684 \\(i\\) \u500b\u5713\u76e4\u85c9\u52a9\u7de9\u885d\u67f1 buf \u79fb\u52d5\u81f3\u76ee\u6a19\u67f1 tar \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
    def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52d5\u4e00\u500b\u5713\u76e4\"\"\"\n    # \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan = src.pop()\n    # \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\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\u6cb3\u5167\u5854\u554f\u984c\"\"\"\n    n = len(A)\n    # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
    hanota.cpp
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src.back();\n    src.pop_back();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.java
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.cs
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
    hanota.go
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src, tar *list.List) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan := src.Back()\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9802\u90e8\u5713\u76e4\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
    hanota.swift
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.popLast()!\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u4e32\u5217\u5c3e\u90e8\u662f\u67f1\u5b50\u9802\u90e8\n    // \u5c07 src \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
    hanota.js
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src, tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.ts
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src: number[], tar: number[]): void {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.dart
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<int> src, List<int> tar) {\n  // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n  int pan = src.removeLast();\n  // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
    hanota.rs
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.remove(src.len() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c 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\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.c
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c 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\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
    hanota.kt
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    val pan = src.removeAt(src.size - 1)\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
    hanota.rb
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 12-15 \u6240\u793a\uff0c\u6cb3\u5167\u5854\u554f\u984c\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5c0d\u61c9\u4e00\u500b\u958b\u555f\u7684 dfs() \u51fd\u5f0f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u5716 12-15 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u7684\u905e\u8ff4\u6a39

    Quote

    \u6cb3\u5167\u5854\u554f\u984c\u6e90\u81ea\u4e00\u500b\u53e4\u8001\u7684\u50b3\u8aaa\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u500b\u5bfa\u5edf\u88e1\uff0c\u50e7\u4fb6\u5011\u6709\u4e09\u6839\u9ad8\u5927\u7684\u947d\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u500b\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5713\u76e4\u3002\u50e7\u4fb6\u5011\u4e0d\u65b7\u5730\u79fb\u52d5\u5713\u76e4\uff0c\u4ed6\u5011\u76f8\u4fe1\u5728\u6700\u5f8c\u4e00\u500b\u5713\u76e4\u88ab\u6b63\u78ba\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u9019\u500b\u4e16\u754c\u5c31\u6703\u7d50\u675f\u3002

    \u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fb6\u5011\u6bcf\u79d2\u9418\u79fb\u52d5\u4e00\u6b21\uff0c\u7e3d\u5171\u9700\u8981\u5927\u7d04 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7d04 \\(5850\\) \u5104\u5e74\uff0c\u9060\u9060\u8d85\u904e\u4e86\u73fe\u5728\u5c0d\u5b87\u5b99\u5e74\u9f61\u7684\u4f30\u8a08\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u9019\u500b\u50b3\u8aaa\u662f\u771f\u7684\uff0c\u6211\u5011\u61c9\u8a72\u4e0d\u9700\u8981\u64d4\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u4f86\u3002

    "},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7d50","text":"
    • \u5206\u6cbb\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u8a2d\u8a08\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5283\u5206\uff09\u548c\u6cbb\uff08\u5408\u4f75\uff09\u5169\u500b\u968e\u6bb5\uff0c\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002
    • \u5224\u65b7\u662f\u5426\u662f\u5206\u6cbb\u6f14\u7b97\u6cd5\u554f\u984c\u7684\u4f9d\u64da\u5305\u62ec\uff1a\u554f\u984c\u80fd\u5426\u5206\u89e3\u3001\u5b50\u554f\u984c\u662f\u5426\u7368\u7acb\u3001\u5b50\u554f\u984c\u80fd\u5426\u5408\u4f75\u3002
    • \u5408\u4f75\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\uff0c\u5176\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5283\u5206\u70ba\u7b49\u9577\u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u958b\u59cb\u9010\u5c64\u5408\u4f75\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002
    • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u6e1b\u5c11\u4e86\u64cd\u4f5c\u6578\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5f8c\u6709\u5229\u65bc\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002
    • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u6c7a\u8a31\u591a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u4e5f\u5ee3\u6cdb\u61c9\u7528\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u8655\u8655\u53ef\u898b\u5176\u8eab\u5f71\u3002
    • \u76f8\u8f03\u65bc\u66b4\u529b\u641c\u5c0b\uff0c\u81ea\u9069\u61c9\u641c\u5c0b\u6548\u7387\u66f4\u9ad8\u3002\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\u3002
    • \u4e8c\u5206\u641c\u5c0b\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u500b\u5178\u578b\u61c9\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u7684\u6b65\u9a5f\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b\u3002
    • \u5728\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u554f\u984c\u4e2d\uff0c\u69cb\u5efa\u6a39\uff08\u539f\u554f\u984c\uff09\u53ef\u4ee5\u5283\u5206\u70ba\u69cb\u5efa\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5283\u5206\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u7684\u7d22\u5f15\u5340\u9593\u4f86\u5be6\u73fe\u3002
    • \u5728\u6cb3\u5167\u5854\u554f\u984c\u4e2d\uff0c\u4e00\u500b\u898f\u6a21\u70ba \\(n\\) \u7684\u554f\u984c\u53ef\u4ee5\u5283\u5206\u70ba\u5169\u500b\u898f\u6a21\u70ba \\(n-1\\) \u7684\u5b50\u554f\u984c\u548c\u4e00\u500b\u898f\u6a21\u70ba \\(1\\) \u7684\u5b50\u554f\u984c\u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002
    "},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52d5\u614b\u898f\u5283","text":"

    Abstract

    \u5c0f\u6eaa\u532f\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u532f\u5165\u5927\u6d77\u3002

    \u52d5\u614b\u898f\u5283\u5c07\u5c0f\u554f\u984c\u7684\u89e3\u5f59\u96c6\u6210\u5927\u554f\u984c\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9818\u6211\u5011\u8d70\u5411\u89e3\u6c7a\u554f\u984c\u7684\u5f7c\u5cb8\u3002

    "},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283
    • 14.2 \u00a0 DP \u554f\u984c\u7279\u6027
    • 14.3 \u00a0 DP \u89e3\u984c\u601d\u8def
    • 14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c
    • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c
    • 14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c
    • 14.7 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52d5\u614b\u898f\u5283\u554f\u984c\u7279\u6027","text":"

    \u5728\u4e0a\u4e00\u7bc0\u4e2d\uff0c\u6211\u5011\u5b78\u7fd2\u4e86\u52d5\u614b\u898f\u5283\u662f\u5982\u4f55\u900f\u904e\u5b50\u554f\u984c\u5206\u89e3\u4f86\u6c42\u89e3\u539f\u554f\u984c\u7684\u3002\u5be6\u969b\u4e0a\uff0c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u7684\u5074\u91cd\u9ede\u4e0d\u540c\u3002

    • \u5206\u6cbb\u6f14\u7b97\u6cd5\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u591a\u500b\u76f8\u4e92\u7368\u7acb\u7684\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u554f\u984c\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\uff0c\u6700\u7d42\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
    • \u52d5\u614b\u898f\u5283\u4e5f\u5c0d\u554f\u984c\u9032\u884c\u905e\u8ff4\u5206\u89e3\uff0c\u4f46\u8207\u5206\u6cbb\u6f14\u7b97\u6cd5\u7684\u4e3b\u8981\u5340\u5225\u662f\uff0c\u52d5\u614b\u898f\u5283\u4e2d\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u4f9d\u8cf4\u7684\uff0c\u5728\u5206\u89e3\u904e\u7a0b\u4e2d\u6703\u51fa\u73fe\u8a31\u591a\u91cd\u758a\u5b50\u554f\u984c\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u5728\u5617\u8a66\u548c\u56de\u9000\u4e2d\u7aae\u8209\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u4e26\u900f\u904e\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\u3002\u539f\u554f\u984c\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\u69cb\u6210\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6bcf\u500b\u6c7a\u7b56\u6b65\u9a5f\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u500b\u5b50\u554f\u984c\u3002

    \u5be6\u969b\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u5e38\u7528\u4f86\u6c42\u89e3\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5b83\u5011\u4e0d\u50c5\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u9084\u5177\u6709\u53e6\u5916\u5169\u5927\u7279\u6027\uff1a\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb","text":"

    \u6211\u5011\u5c0d\u722c\u6a13\u68af\u554f\u984c\u7a0d\u4f5c\u6539\u52d5\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9069\u5408\u5c55\u793a\u6700\u512a\u5b50\u7d50\u69cb\u6982\u5ff5\u3002

    \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9

    \u7d66\u5b9a\u4e00\u500b\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u6bcf\u4e00\u968e\u6a13\u68af\u4e0a\u90fd\u8cbc\u6709\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u4f60\u5728\u8a72\u81fa\u968e\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\u3002\u7d66\u5b9a\u4e00\u500b\u975e\u8ca0\u6574\u6578\u9663\u5217 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u500b\u81fa\u968e\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\\(cost[0]\\) \u70ba\u5730\u9762\uff08\u8d77\u59cb\u9ede\uff09\u3002\u8acb\u8a08\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u50f9\u624d\u80fd\u5230\u9054\u9802\u90e8\uff1f

    \u5982\u5716 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u968e\u7684\u4ee3\u50f9\u5206\u5225\u70ba \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5247\u5f9e\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u968e\u7684\u6700\u5c0f\u4ee3\u50f9\u70ba \\(2\\) \u3002

    \u5716 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u6700\u5c0f\u4ee3\u50f9

    \u8a2d \\(dp[i]\\) \u70ba\u722c\u5230\u7b2c \\(i\\) \u968e\u7d2f\u8a08\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\u7531\u65bc\u7b2c \\(i\\) \u968e\u53ea\u53ef\u80fd\u5f9e \\(i - 1\\) \u968e\u6216 \\(i - 2\\) \u968e\u8d70\u4f86\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u65bc \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u70ba\u4e86\u5118\u53ef\u80fd\u6e1b\u5c11\u4ee3\u50f9\uff0c\u6211\u5011\u61c9\u8a72\u9078\u64c7\u5169\u8005\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\uff1a

    \\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

    \u9019\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u7684\u542b\u7fa9\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u662f\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\u7684\u3002

    \u672c\u984c\u986f\u7136\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6211\u5011\u5f9e\u5169\u500b\u5b50\u554f\u984c\u6700\u512a\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9078\u51fa\u8f03\u512a\u7684\u90a3\u4e00\u500b\uff0c\u4e26\u7528\u5b83\u69cb\u5efa\u51fa\u539f\u554f\u984c \\(dp[i]\\) \u7684\u6700\u512a\u89e3\u3002

    \u90a3\u9ebc\uff0c\u4e0a\u4e00\u7bc0\u7684\u722c\u6a13\u68af\u984c\u76ee\u6709\u6c92\u6709\u6700\u512a\u5b50\u7d50\u69cb\u5462\uff1f\u5b83\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u500b\u8a08\u6578\u554f\u984c\uff0c\u4f46\u5982\u679c\u63db\u4e00\u7a2e\u554f\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6578\u91cf\u201d\u3002\u6211\u5011\u610f\u5916\u5730\u767c\u73fe\uff0c\u96d6\u7136\u984c\u76ee\u4fee\u6539\u524d\u5f8c\u662f\u7b49\u50f9\u7684\uff0c\u4f46\u6700\u512a\u5b50\u7d50\u69cb\u6d6e\u73fe\u51fa\u4f86\u4e86\uff1a\u7b2c \\(n\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u7b49\u65bc\u7b2c \\(n-1\\) \u968e\u548c\u7b2c \\(n-2\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8aaa\uff0c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u89e3\u91cb\u65b9\u5f0f\u6bd4\u8f03\u9748\u6d3b\uff0c\u5728\u4e0d\u540c\u554f\u984c\u4e2d\u6703\u6709\u4e0d\u540c\u7684\u542b\u7fa9\u3002

    \u6839\u64da\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72c0\u614b \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f97\u5230\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{min_cost_climbing_stairs_dp}\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\u3002

    \u5716 14-7 \u00a0 \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u672c\u984c\u4e5f\u53ef\u4ee5\u9032\u884c\u7a7a\u9593\u6700\u4f73\u5316\uff0c\u5c07\u4e00\u7dad\u58d3\u7e2e\u81f3\u96f6\u7dad\uff0c\u4f7f\u5f97\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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
    [class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u7121\u5f8c\u6548\u6027","text":"

    \u7121\u5f8c\u6548\u6027\u662f\u52d5\u614b\u898f\u5283\u80fd\u5920\u6709\u6548\u89e3\u6c7a\u554f\u984c\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u7fa9\u70ba\uff1a\u7d66\u5b9a\u4e00\u500b\u78ba\u5b9a\u7684\u72c0\u614b\uff0c\u5b83\u7684\u672a\u4f86\u767c\u5c55\u53ea\u8207\u7576\u524d\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002

    \u4ee5\u722c\u6a13\u68af\u554f\u984c\u70ba\u4f8b\uff0c\u7d66\u5b9a\u72c0\u614b \\(i\\) \uff0c\u5b83\u6703\u767c\u5c55\u51fa\u72c0\u614b \\(i+1\\) \u548c\u72c0\u614b \\(i+2\\) \uff0c\u5206\u5225\u5c0d\u61c9\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u9019\u5169\u7a2e\u9078\u64c7\u6642\uff0c\u6211\u5011\u7121\u9808\u8003\u616e\u72c0\u614b \\(i\\) \u4e4b\u524d\u7684\u72c0\u614b\uff0c\u5b83\u5011\u5c0d\u72c0\u614b \\(i\\) \u7684\u672a\u4f86\u6c92\u6709\u5f71\u97ff\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u7d66\u722c\u6a13\u68af\u554f\u984c\u65b0\u589e\u4e00\u500b\u7d04\u675f\uff0c\u60c5\u6cc1\u5c31\u4e0d\u4e00\u6a23\u4e86\u3002

    \u5e36\u7d04\u675f\u722c\u6a13\u68af

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u4f46\u4e0d\u80fd\u9023\u7e8c\u5169\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5982\u5716 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u968e\u50c5\u5269 \\(2\\) \u7a2e\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u9023\u7e8c\u4e09\u6b21\u8df3 \\(1\\) \u968e\u7684\u65b9\u6848\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\uff0c\u56e0\u6b64\u88ab\u6368\u68c4\u3002

    \u5716 14-8 \u00a0 \u5e36\u7d04\u675f\u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

    \u5728\u8a72\u554f\u984c\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\uff0c\u90a3\u9ebc\u4e0b\u4e00\u8f2a\u5c31\u5fc5\u9808\u8df3 \\(2\\) \u968e\u3002\u9019\u610f\u5473\u8457\uff0c\u4e0b\u4e00\u6b65\u9078\u64c7\u4e0d\u80fd\u7531\u7576\u524d\u72c0\u614b\uff08\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u7368\u7acb\u6c7a\u5b9a\uff0c\u9084\u548c\u524d\u4e00\u500b\u72c0\u614b\uff08\u4e0a\u4e00\u8f2a\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u6709\u95dc\u3002

    \u4e0d\u96e3\u767c\u73fe\uff0c\u6b64\u554f\u984c\u5df2\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u70ba \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8a31\u591a\u201c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\u201d\u65b9\u6848\uff0c\u800c\u70ba\u4e86\u6eff\u8db3\u7d04\u675f\uff0c\u6211\u5011\u5c31\u4e0d\u80fd\u5c07 \\(dp[i-1]\\) \u76f4\u63a5\u8a08\u5165 \\(dp[i]\\) \u4e2d\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u9700\u8981\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff1a\u72c0\u614b \\([i, j]\\) \u8868\u793a\u8655\u5728\u7b2c \\(i\\) \u968e\u4e26\u4e14\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(j\\) \u968e\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72c0\u614b\u5b9a\u7fa9\u6709\u6548\u5730\u5340\u5206\u4e86\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u9084\u662f \\(2\\) \u968e\uff0c\u6211\u5011\u53ef\u4ee5\u64da\u6b64\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5f9e\u4f55\u800c\u4f86\u7684\u3002

    • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ea\u80fd\u9078\u64c7\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u5f9e \\(dp[i-1, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002
    • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(2\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ef\u9078\u64c7\u8df3 \\(1\\) \u968e\u6216\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u5f9e \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002

    \u5982\u5716 14-9 \u6240\u793a\uff0c\u5728\u8a72\u5b9a\u7fa9\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u65b9\u6848\u6578\u3002\u6b64\u6642\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

    \u5716 14-9 \u00a0 \u8003\u616e\u7d04\u675f\u4e0b\u7684\u905e\u63a8\u95dc\u4fc2

    \u6700\u7d42\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u5169\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\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\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{climbing_stairs_constraint_dp}\n
    climbing_stairs_constraint_dp.zig
    // \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u65bc\u50c5\u9700\u591a\u8003\u616e\u524d\u9762\u4e00\u500b\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u900f\u904e\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff0c\u4f7f\u5f97\u554f\u984c\u91cd\u65b0\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u554f\u984c\u5177\u6709\u975e\u5e38\u56b4\u91cd\u7684\u201c\u6709\u5f8c\u6548\u6027\u201d\u3002

    \u722c\u6a13\u68af\u8207\u969c\u7919\u751f\u6210

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\u3002\u898f\u5b9a\u7576\u722c\u5230\u7b2c \\(i\\) \u968e\u6642\uff0c\u7cfb\u7d71\u81ea\u52d5\u6703\u5728\u7b2c \\(2i\\) \u968e\u4e0a\u653e\u4e0a\u969c\u7919\u7269\uff0c\u4e4b\u5f8c\u6240\u6709\u8f2a\u90fd\u4e0d\u5141\u8a31\u8df3\u5230\u7b2c \\(2i\\) \u968e\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u5169\u8f2a\u5206\u5225\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u968e\u4e0a\uff0c\u5247\u4e4b\u5f8c\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u968e\u4e0a\u3002\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5728\u9019\u500b\u554f\u984c\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8e8d\u4f9d\u8cf4\u904e\u53bb\u6240\u6709\u7684\u72c0\u614b\uff0c\u56e0\u70ba\u6bcf\u4e00\u6b21\u8df3\u8e8d\u90fd\u6703\u5728\u66f4\u9ad8\u7684\u968e\u68af\u4e0a\u8a2d\u5b9a\u969c\u7919\uff0c\u4e26\u5f71\u97ff\u672a\u4f86\u7684\u8df3\u8e8d\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u52d5\u614b\u898f\u5283\u5f80\u5f80\u96e3\u4ee5\u89e3\u6c7a\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u8907\u96dc\u7684\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff08\u4f8b\u5982\u65c5\u884c\u5546\u554f\u984c\uff09\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u555f\u767c\u5f0f\u641c\u5c0b\u3001\u907a\u50b3\u6f14\u7b97\u6cd5\u3001\u5f37\u5316\u5b78\u7fd2\u7b49\uff0c\u5f9e\u800c\u5728\u6709\u9650\u6642\u9593\u5167\u5f97\u5230\u53ef\u7528\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52d5\u614b\u898f\u5283\u89e3\u984c\u601d\u8def","text":"

    \u4e0a\u5169\u7bc0\u4ecb\u7d39\u4e86\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4e3b\u8981\u7279\u5fb5\uff0c\u63a5\u4e0b\u4f86\u6211\u5011\u4e00\u8d77\u63a2\u7a76\u5169\u500b\u66f4\u52a0\u5be6\u7528\u7684\u554f\u984c\u3002

    1. \u5982\u4f55\u5224\u65b7\u4e00\u500b\u554f\u984c\u662f\u4e0d\u662f\u52d5\u614b\u898f\u5283\u554f\u984c\uff1f
    2. \u6c42\u89e3\u52d5\u614b\u898f\u5283\u554f\u984c\u8a72\u5f9e\u4f55\u8655\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9a5f\u662f\u4ec0\u9ebc\uff1f
    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u554f\u984c\u5224\u65b7","text":"

    \u7e3d\u7684\u4f86\u8aaa\uff0c\u5982\u679c\u4e00\u500b\u554f\u984c\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u90a3\u9ebc\u5b83\u901a\u5e38\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u5011\u5f88\u96e3\u5f9e\u554f\u984c\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u9019\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u653e\u5bec\u689d\u4ef6\uff0c\u5148\u89c0\u5bdf\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7aae\u8209\uff09\u89e3\u6c7a\u3002

    \u9069\u5408\u7528\u56de\u6eaf\u89e3\u6c7a\u7684\u554f\u984c\u901a\u5e38\u6eff\u8db3\u201c\u6c7a\u7b56\u6a39\u6a21\u578b\u201d\uff0c\u9019\u7a2e\u554f\u984c\u53ef\u4ee5\u4f7f\u7528\u6a39\u5f62\u7d50\u69cb\u4f86\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\uff0c\u6bcf\u4e00\u689d\u8def\u5f91\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\u3002

    \u63db\u53e5\u8a71\u8aaa\uff0c\u5982\u679c\u554f\u984c\u5305\u542b\u660e\u78ba\u7684\u6c7a\u7b56\u6982\u5ff5\uff0c\u4e26\u4e14\u89e3\u662f\u900f\u904e\u4e00\u7cfb\u5217\u6c7a\u7b56\u7522\u751f\u7684\uff0c\u90a3\u9ebc\u5b83\u5c31\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u4f86\u89e3\u6c7a\u3002

    \u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u554f\u984c\u9084\u6709\u4e00\u4e9b\u5224\u65b7\u7684\u201c\u52a0\u5206\u9805\u201d\u3002

    • \u554f\u984c\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u6700\u4f73\u5316\u63cf\u8ff0\u3002
    • \u554f\u984c\u7684\u72c0\u614b\u80fd\u5920\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u3001\u591a\u7dad\u77e9\u9663\u6216\u6a39\u4f86\u8868\u793a\uff0c\u4e26\u4e14\u4e00\u500b\u72c0\u614b\u8207\u5176\u5468\u570d\u7684\u72c0\u614b\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\u3002

    \u76f8\u61c9\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u6e1b\u5206\u9805\u201d\u3002

    • \u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u512a\u89e3\u3002
    • \u554f\u984c\u63cf\u8ff0\u4e2d\u6709\u660e\u986f\u7684\u6392\u5217\u7d44\u5408\u7684\u7279\u5fb5\uff0c\u9700\u8981\u8fd4\u56de\u5177\u9ad4\u7684\u591a\u500b\u65b9\u6848\u3002

    \u5982\u679c\u4e00\u500b\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u4e26\u5177\u6709\u8f03\u70ba\u660e\u986f\u7684\u201c\u52a0\u5206\u9805\u201d\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5047\u8a2d\u5b83\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\uff0c\u4e26\u5728\u6c42\u89e3\u904e\u7a0b\u4e2d\u9a57\u8b49\u5b83\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u554f\u984c\u6c42\u89e3\u6b65\u9a5f","text":"

    \u52d5\u614b\u898f\u5283\u7684\u89e3\u984c\u6d41\u7a0b\u6703\u56e0\u554f\u984c\u7684\u6027\u8cea\u548c\u96e3\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9a5f\uff1a\u63cf\u8ff0\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5c0e\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u7b49\u3002

    \u70ba\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u984c\u6b65\u9a5f\uff0c\u6211\u5011\u4f7f\u7528\u4e00\u500b\u7d93\u5178\u554f\u984c\u201c\u6700\u5c0f\u8def\u5f91\u548c\u201d\u4f86\u8209\u4f8b\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b \\(n \\times m\\) \u7684\u4e8c\u7dad\u7db2\u683c grid \uff0c\u7db2\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5305\u542b\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u8a72\u55ae\u5143\u683c\u7684\u4ee3\u50f9\u3002\u6a5f\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\u70ba\u8d77\u59cb\u9ede\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52d5\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u9054\u53f3\u4e0b\u89d2\u55ae\u5143\u683c\u3002\u8acb\u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f91\u548c\u3002

    \u5716 14-10 \u5c55\u793a\u4e86\u4e00\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u7db2\u683c\u7684\u6700\u5c0f\u8def\u5f91\u548c\u70ba \\(13\\) \u3002

    \u5716 14-10 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u793a\u4f8b\u8cc7\u6599

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u672c\u984c\u7684\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u5c31\u662f\u5f9e\u7576\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8a2d\u7576\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\([i, j]\\) \uff0c\u5247\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u5f8c\uff0c\u7d22\u5f15\u8b8a\u70ba \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72c0\u614b\u61c9\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u5169\u500b\u8b8a\u6578\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u5f9e\u8d77\u59cb\u9ede \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\uff0c\u89e3\u8a18\u70ba \\(dp[i, j]\\) \u3002

    \u81f3\u6b64\uff0c\u6211\u5011\u5c31\u5f97\u5230\u4e86\u5716 14-11 \u6240\u793a\u7684\u4e8c\u7dad \\(dp\\) \u77e9\u9663\uff0c\u5176\u5c3a\u5bf8\u8207\u8f38\u5165\u7db2\u683c \\(grid\\) \u76f8\u540c\u3002

    \u5716 14-11 \u00a0 \u72c0\u614b\u5b9a\u7fa9\u8207 dp \u8868

    Note

    \u52d5\u614b\u898f\u5283\u548c\u56de\u6eaf\u904e\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u70ba\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\uff0c\u800c\u72c0\u614b\u7531\u6240\u6709\u6c7a\u7b56\u8b8a\u6578\u69cb\u6210\u3002\u5b83\u61c9\u7576\u5305\u542b\u63cf\u8ff0\u89e3\u984c\u9032\u5ea6\u7684\u6240\u6709\u8b8a\u6578\uff0c\u5176\u5305\u542b\u4e86\u8db3\u5920\u7684\u8cc7\u8a0a\uff0c\u80fd\u5920\u7528\u4f86\u63a8\u5c0e\u51fa\u4e0b\u4e00\u500b\u72c0\u614b\u3002

    \u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\uff0c\u6211\u5011\u6703\u5b9a\u7fa9\u4e00\u500b \\(dp\\) \u8868\u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u72c0\u614b\u7684\u6bcf\u500b\u7368\u7acb\u8b8a\u6578\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\u3002\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72c0\u614b\u548c\u5b50\u554f\u984c\u7684\u89e3\u4e4b\u9593\u7684\u5c0d\u6620\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u5c0d\u65bc\u72c0\u614b \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u5f9e\u4e0a\u908a\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u908a\u683c\u5b50 \\([i, j-1]\\) \u8f49\u79fb\u800c\u4f86\u3002\u56e0\u6b64\u6700\u512a\u5b50\u7d50\u69cb\u70ba\uff1a\u5230\u9054 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u8207 \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\u6c7a\u5b9a\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u5716 14-12 \u6240\u793a\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

    \u5716 14-12 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb\u8207\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    Note

    \u6839\u64da\u5b9a\u7fa9\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u554f\u984c\u548c\u5b50\u554f\u984c\u7684\u95dc\u4fc2\uff0c\u627e\u51fa\u900f\u904e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u4f86\u69cb\u9020\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u512a\u5b50\u7d50\u69cb\u3002

    \u4e00\u65e6\u6211\u5011\u627e\u5230\u4e86\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u5728\u672c\u984c\u4e2d\uff0c\u8655\u5728\u9996\u884c\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u5de6\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u8655\u5728\u9996\u5217\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u4e0a\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u908a\u754c\u689d\u4ef6\u3002

    \u5982\u5716 14-13 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u6211\u5011\u4f7f\u7528\u8ff4\u5708\u4f86\u8d70\u8a2a\u77e9\u9663\uff0c\u5916\u8ff4\u5708\u8d70\u8a2a\u5404\u884c\uff0c\u5167\u8ff4\u5708\u8d70\u8a2a\u5404\u5217\u3002

    \u5716 14-13 \u00a0 \u908a\u754c\u689d\u4ef6\u8207\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    Note

    \u908a\u754c\u689d\u4ef6\u5728\u52d5\u614b\u898f\u5283\u4e2d\u7528\u65bc\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u5c0b\u4e2d\u7528\u65bc\u526a\u679d\u3002

    \u72c0\u614b\u8f49\u79fb\u9806\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8b49\u5728\u8a08\u7b97\u7576\u524d\u554f\u984c\u7684\u89e3\u6642\uff0c\u6240\u6709\u5b83\u4f9d\u8cf4\u7684\u66f4\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u90fd\u5df2\u7d93\u88ab\u6b63\u78ba\u5730\u8a08\u7b97\u51fa\u4f86\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u5df2\u7d93\u53ef\u4ee5\u76f4\u63a5\u5beb\u51fa\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\u3002\u7136\u800c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u5c0b \\(\\rightarrow\\) \u8a18\u61b6\u5316\u641c\u5c0b \\(\\rightarrow\\) \u52d5\u614b\u898f\u5283\u201d\u7684\u9806\u5e8f\u5be6\u73fe\u66f4\u52a0\u7b26\u5408\u601d\u7dad\u7fd2\u6163\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u5f9e\u72c0\u614b \\([i, j]\\) \u958b\u59cb\u641c\u5c0b\uff0c\u4e0d\u65b7\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u72c0\u614b \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u905e\u8ff4\u51fd\u5f0f\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, j]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5f9e \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c \\(dp[i, j]\\) \u3002
    • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576 \\(i = 0\\) \u4e14 \\(j = 0\\) \u6642\uff0c\u8fd4\u56de\u4ee3\u50f9 \\(grid[0, 0]\\) \u3002
    • \u526a\u679d\uff1a\u7576 \\(i < 0\\) \u6642\u6216 \\(j < 0\\) \u6642\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u6642\u8fd4\u56de\u4ee3\u50f9 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\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\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.Min(left, up) + grid[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  return min(left, up) + grid[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.rb
    [class]{}-[func]{min_path_sum_dfs}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-14 \u7d66\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u70ba\u6839\u7bc0\u9ede\u7684\u905e\u8ff4\u6a39\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5176\u6578\u91cf\u6703\u96a8\u8457\u7db2\u683c grid \u7684\u5c3a\u5bf8\u8b8a\u5927\u800c\u6025\u5287\u589e\u591a\u3002

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u758a\u5b50\u554f\u984c\u7684\u539f\u56e0\u70ba\uff1a\u5b58\u5728\u591a\u689d\u8def\u5f91\u53ef\u4ee5\u5f9e\u5de6\u4e0a\u89d2\u5230\u9054\u67d0\u4e00\u55ae\u5143\u683c\u3002

    \u5716 14-14 \u00a0 \u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

    \u6bcf\u500b\u72c0\u614b\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u5169\u7a2e\u9078\u64c7\uff0c\u5f9e\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u7e3d\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^{m + n})\\) \u3002\u8acb\u6ce8\u610f\uff0c\u9019\u7a2e\u8a08\u7b97\u65b9\u5f0f\u672a\u8003\u616e\u81e8\u8fd1\u7db2\u683c\u908a\u754c\u7684\u60c5\u6cc1\uff0c\u7576\u5230\u9054\u7db2\u8def\u908a\u754c\u6642\u53ea\u5269\u4e0b\u4e00\u7a2e\u9078\u64c7\uff0c\u56e0\u6b64\u5be6\u969b\u7684\u8def\u5f91\u6578\u91cf\u6703\u5c11\u4e00\u4e9b\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u6211\u5011\u5f15\u5165\u4e00\u500b\u548c\u7db2\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8a18\u61b6\u4e32\u5217 mem \uff0c\u7528\u65bc\u8a18\u9304\u5404\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5c07\u91cd\u758a\u5b50\u554f\u984c\u9032\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    # \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\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\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.rb
    [class]{}-[func]{min_path_sum_dfs_mem}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\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    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8a18\u61b6\u5316\u5f8c\uff0c\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u72c0\u614b\u7e3d\u6578\uff0c\u5373\u7db2\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

    \u5716 14-15 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\u52d5\u614b\u898f\u5283\u89e3\u6cd5\uff0c\u7a0b\u5f0f\u78bc\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    [class]{}-[func]{min_path_sum_dp}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f91\u548c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\uff0c\u5176\u8d70\u8a2a\u4e86\u6574\u500b\u7db2\u683c\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

    \u9663\u5217 dp \u5927\u5c0f\u70ba \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

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

    \u5716 14-16 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u6bcf\u500b\u683c\u5b50\u53ea\u8207\u5176\u5de6\u908a\u548c\u4e0a\u908a\u7684\u683c\u5b50\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u53ea\u7528\u4e00\u500b\u55ae\u884c\u9663\u5217\u4f86\u5be6\u73fe \\(dp\\) \u8868\u3002

    \u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u9663\u5217 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72c0\u614b\uff0c\u6240\u4ee5\u6211\u5011\u7121\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72c0\u614b\uff0c\u800c\u662f\u5728\u8d70\u8a2a\u6bcf\u884c\u6642\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72c0\u614b\u8f49\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ..< n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..<n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    [class]{}-[func]{min_path_sum_dp_comp}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n) |i| {\n        // \u72c0\u614b\u8f49\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c","text":"

    \u7de8\u8f2f\u8ddd\u96e2\uff0c\u4e5f\u7a31 Levenshtein \u8ddd\u96e2\uff0c\u6307\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u4e92\u76f8\u8f49\u63db\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6578\uff0c\u901a\u5e38\u7528\u65bc\u5728\u8cc7\u8a0a\u6aa2\u7d22\u548c\u81ea\u7136\u8a9e\u8a00\u8655\u7406\u4e2d\u5ea6\u91cf\u5169\u500b\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

    Question

    \u8f38\u5165\u5169\u500b\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c07 \\(s\\) \u8f49\u63db\u70ba \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

    \u4f60\u53ef\u4ee5\u5728\u4e00\u500b\u5b57\u4e32\u4e2d\u9032\u884c\u4e09\u7a2e\u7de8\u8f2f\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u500b\u5b57\u5143\u3001\u522a\u9664\u4e00\u500b\u5b57\u5143\u3001\u5c07\u5b57\u5143\u66ff\u63db\u70ba\u4efb\u610f\u4e00\u500b\u5b57\u5143\u3002

    \u5982\u5716 14-27 \u6240\u793a\uff0c\u5c07 kitten \u8f49\u63db\u70ba sitting \u9700\u8981\u7de8\u8f2f 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u8207 1 \u6b21\u65b0\u589e\u64cd\u4f5c\uff1b\u5c07 hello \u8f49\u63db\u70ba algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u548c 1 \u6b21\u522a\u9664\u64cd\u4f5c\u3002

    \u5716 14-27 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u793a\u4f8b\u8cc7\u6599

    \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u6c7a\u7b56\u6a39\u6a21\u578b\u4f86\u89e3\u91cb\u3002\u5b57\u4e32\u5c0d\u61c9\u6a39\u7bc0\u9ede\uff0c\u4e00\u8f2a\u6c7a\u7b56\uff08\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\uff09\u5c0d\u61c9\u6a39\u7684\u4e00\u689d\u908a\u3002

    \u5982\u5716 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u500b\u7bc0\u9ede\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8a31\u591a\u689d\u908a\uff0c\u6bcf\u689d\u908a\u5c0d\u61c9\u4e00\u7a2e\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u5f9e hello \u8f49\u63db\u5230 algo \u6709\u8a31\u591a\u7a2e\u53ef\u80fd\u7684\u8def\u5f91\u3002

    \u5f9e\u6c7a\u7b56\u6a39\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u7bc0\u9ede hello \u548c\u7bc0\u9ede algo \u4e4b\u9593\u7684\u6700\u77ed\u8def\u5f91\u3002

    \u5716 14-28 \u00a0 \u57fa\u65bc\u6c7a\u7b56\u6a39\u6a21\u578b\u8868\u793a\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u662f\u5c0d\u5b57\u4e32 \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\u3002

    \u6211\u5011\u5e0c\u671b\u5728\u7de8\u8f2f\u64cd\u4f5c\u7684\u904e\u7a0b\u4e2d\uff0c\u554f\u984c\u7684\u898f\u6a21\u9010\u6f38\u7e2e\u5c0f\uff0c\u9019\u6a23\u624d\u80fd\u69cb\u5efa\u5b50\u554f\u984c\u3002\u8a2d\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \uff0c\u6211\u5011\u5148\u8003\u616e\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u5011\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u76f4\u63a5\u8003\u616e \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u5011\u9700\u8981\u5c0d \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\uff08\u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\uff09\uff0c\u4f7f\u5f97\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143\u76f8\u540c\uff0c\u5f9e\u800c\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u8003\u616e\u898f\u6a21\u66f4\u5c0f\u7684\u554f\u984c\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u5728\u5b57\u4e32 \\(s\\) \u4e2d\u9032\u884c\u7684\u6bcf\u4e00\u8f2a\u6c7a\u7b56\uff08\u7de8\u8f2f\u64cd\u4f5c\uff09\uff0c\u90fd\u6703\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u9918\u7684\u5f85\u5339\u914d\u5b57\u5143\u767c\u751f\u8b8a\u5316\u3002\u56e0\u6b64\uff0c\u72c0\u614b\u70ba\u7576\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u616e\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u500b\u5b57\u5143\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\uff1a\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

    \u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u500b\u5c3a\u5bf8\u70ba \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u8003\u616e\u5b50\u554f\u984c \\(dp[i, j]\\) \uff0c\u5176\u5c0d\u61c9\u7684\u5169\u500b\u5b57\u4e32\u7684\u5c3e\u90e8\u5b57\u5143\u70ba \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u64da\u4e0d\u540c\u7de8\u8f2f\u64cd\u4f5c\u5206\u70ba\u5716 14-29 \u6240\u793a\u7684\u4e09\u7a2e\u60c5\u6cc1\u3002

    1. \u5728 \\(s[i-1]\\) \u4e4b\u5f8c\u65b0\u589e \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i, j-1]\\) \u3002
    2. \u522a\u9664 \\(s[i-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j]\\) \u3002
    3. \u5c07 \\(s[i-1]\\) \u66ff\u63db\u70ba \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j-1]\\) \u3002

    \u5716 14-29 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u72c0\u614b\u8f49\u79fb

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u512a\u5b50\u7d50\u69cb\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7de8\u8f2f\u6b65\u6578 \\(1\\) \u3002\u5c0d\u61c9\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

    \u8acb\u6ce8\u610f\uff0c\u7576 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\uff0c\u9019\u7a2e\u60c5\u6cc1\u4e0b\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, j] = dp[i-1, j-1] \\]

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u5169\u5b57\u4e32\u90fd\u70ba\u7a7a\u6642\uff0c\u7de8\u8f2f\u6b65\u6578\u70ba \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u7576 \\(s\\) \u70ba\u7a7a\u4f46 \\(t\\) \u4e0d\u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(t\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u7576 \\(s\\) \u4e0d\u70ba\u7a7a\u4f46 \\(t\\) \u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(s\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

    \u89c0\u5bdf\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8cf4\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    edit_distance.kt
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    [class]{}-[func]{edit_distance_dp}\n
    edit_distance.zig
    // \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-30 \u6240\u793a\uff0c\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\u8207\u80cc\u5305\u554f\u984c\u975e\u5e38\u985e\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5beb\u4e00\u500b\u4e8c\u7dad\u7db2\u683c\u7684\u904e\u7a0b\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u5716 14-30 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc \\(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]\\) \u8f49\u79fb\u800c\u4f86\u7684\uff0c\u800c\u6b63\u5e8f\u8d70\u8a2a\u6703\u4e1f\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u8d70\u8a2a\u7121\u6cd5\u63d0\u524d\u69cb\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u5169\u7a2e\u8d70\u8a2a\u9806\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 leftup \u4f86\u66ab\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u5f9e\u800c\u53ea\u9700\u8003\u616e\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u6642\u7684\u60c5\u6cc1\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u8d70\u8a2a\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n + 1):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    return dp[m]\n
    edit_distance.cpp
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.java
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.cs
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.go
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i := 1; i <= n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.swift
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ... n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.js
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.ts
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.dart
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
    edit_distance.rs
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..=n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
    edit_distance.c
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    edit_distance.kt
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.rb
    [class]{}-[func]{edit_distance_dp_comp}\n
    edit_distance.zig
    // \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n + 1) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283","text":"

    \u52d5\u614b\u898f\u5283\uff08dynamic programming\uff09\u662f\u4e00\u500b\u91cd\u8981\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\uff0c\u5b83\u5c07\u4e00\u500b\u554f\u984c\u5206\u89e3\u70ba\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u907f\u514d\u91cd\u8907\u8a08\u7b97\uff0c\u5f9e\u800c\u5927\u5e45\u63d0\u5347\u6642\u9593\u6548\u7387\u3002

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5f9e\u4e00\u500b\u7d93\u5178\u4f8b\u984c\u5165\u624b\uff0c\u5148\u7d66\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c0\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u518d\u9010\u6b65\u5c0e\u51fa\u66f4\u9ad8\u6548\u7684\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

    \u722c\u6a13\u68af

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5982\u5716 14-1 \u6240\u793a\uff0c\u5c0d\u65bc\u4e00\u500b \\(3\\) \u968e\u6a13\u68af\uff0c\u5171\u6709 \\(3\\) \u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\u3002

    \u5716 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

    \u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u900f\u904e\u56de\u6eaf\u4f86\u7aae\u8209\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u5c07\u722c\u6a13\u68af\u60f3\u8c61\u70ba\u4e00\u500b\u591a\u8f2a\u9078\u64c7\u7684\u904e\u7a0b\uff1a\u5f9e\u5730\u9762\u51fa\u767c\uff0c\u6bcf\u8f2a\u9078\u64c7\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u6bcf\u7576\u5230\u9054\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u65b9\u6848\u6578\u91cf\u52a0 \\(1\\) \uff0c\u7576\u8d8a\u904e\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u5176\u526a\u679d\u3002\u7a0b\u5f0f\u78bc\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    # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    state = 0  # \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;                // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state+choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    choices := []int{1, 2}\n    // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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  // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n    if (state + choice > n) continue;\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n  int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;           // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    val state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
    climbing_stairs_backtrack.zig
    // \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u6a13\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    var state: i32 = 0; // \u5f9e\u7b2c 0 \u968e\u958b\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] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u4e26\u4e0d\u986f\u5f0f\u5730\u5c0d\u554f\u984c\u9032\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c07\u6c42\u89e3\u554f\u984c\u770b\u4f5c\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\uff0c\u900f\u904e\u8a66\u63a2\u548c\u526a\u679d\uff0c\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

    \u6211\u5011\u53ef\u4ee5\u5617\u8a66\u5f9e\u554f\u984c\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u9019\u9053\u984c\u3002\u8a2d\u722c\u5230\u7b2c \\(i\\) \u968e\u5171\u6709 \\(dp[i]\\) \u7a2e\u65b9\u6848\uff0c\u90a3\u9ebc \\(dp[i]\\) \u5c31\u662f\u539f\u554f\u984c\uff0c\u5176\u5b50\u554f\u984c\u5305\u62ec\uff1a

    \\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

    \u7531\u65bc\u6bcf\u8f2a\u53ea\u80fd\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u56e0\u6b64\u7576\u6211\u5011\u7ad9\u5728\u7b2c \\(i\\) \u968e\u6a13\u68af\u4e0a\u6642\uff0c\u4e0a\u4e00\u8f2a\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u4e0a\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ea\u80fd\u5f9e\u7b2c \\(i -1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u9081\u5411\u7b2c \\(i\\) \u968e\u3002

    \u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u63a8\u8ad6\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u968e\u7684\u65b9\u6848\u6578\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u968e\u7684\u65b9\u6848\u6578\u5c31\u7b49\u65bc\u722c\u5230\u7b2c \\(i\\) \u968e\u7684\u65b9\u6848\u6578\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

    \\[ dp[i] = dp[i-1] + dp[i-2] \\]

    \u9019\u610f\u5473\u8457\u5728\u722c\u6a13\u68af\u554f\u984c\u4e2d\uff0c\u5404\u500b\u5b50\u554f\u984c\u4e4b\u9593\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\uff0c\u539f\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u554f\u984c\u7684\u89e3\u69cb\u5efa\u5f97\u4f86\u3002\u5716 14-2 \u5c55\u793a\u4e86\u8a72\u905e\u63a8\u95dc\u4fc2\u3002

    \u5716 14-2 \u00a0 \u65b9\u6848\u6578\u91cf\u905e\u63a8\u95dc\u4fc2

    \u6211\u5011\u53ef\u4ee5\u6839\u64da\u905e\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u5c0b\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u905e\u8ff4\u5730\u5c07\u4e00\u500b\u8f03\u5927\u554f\u984c\u62c6\u89e3\u70ba\u5169\u500b\u8f03\u5c0f\u554f\u984c\u7684\u548c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c \\(dp[1]\\) \u548c \\(dp[2]\\) \u6642\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u968e\u5206\u5225\u6709 \\(1\\)\u3001\\(2\\) \u7a2e\u65b9\u6848\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5b83\u548c\u6a19\u6e96\u56de\u6eaf\u7a0b\u5f0f\u78bc\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u4f46\u66f4\u52a0\u7c21\u6f54\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
    def dfs(i: int) -> int:\n    \"\"\"\u641c\u5c0b\"\"\"\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\u6a13\u68af\uff1a\u641c\u5c0b\"\"\"\n    return dfs(n)\n
    climbing_stairs_dfs.cpp
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.java
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.cs
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
    climbing_stairs_dfs.go
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.swift
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
    climbing_stairs_dfs.js
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.ts
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.dart
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
    climbing_stairs_dfs.rs
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
    climbing_stairs_dfs.c
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.kt
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
    climbing_stairs_dfs.zig
    // \u641c\u5c0b\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\u6a13\u68af\uff1a\u641c\u5c0b\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u5c0b\u5f62\u6210\u7684\u905e\u8ff4\u6a39\u3002\u5c0d\u65bc\u554f\u984c \\(dp[n]\\) \uff0c\u5176\u905e\u8ff4\u6a39\u7684\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002\u6307\u6578\u968e\u5c6c\u65bc\u7206\u70b8\u5f0f\u589e\u9577\uff0c\u5982\u679c\u6211\u5011\u8f38\u5165\u4e00\u500b\u6bd4\u8f03\u5927\u7684 \\(n\\) \uff0c\u5247\u6703\u9677\u5165\u6f2b\u9577\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

    \u5716 14-3 \u00a0 \u722c\u6a13\u68af\u5c0d\u61c9\u905e\u8ff4\u6a39

    \u89c0\u5bdf\u5716 14-3 \uff0c\u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u201c\u91cd\u758a\u5b50\u554f\u984c\u201d\u5c0e\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u70ba \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u70ba \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u5169\u8005\u90fd\u5305\u542b\u5b50\u554f\u984c \\(dp[7]\\) \u3002

    \u4ee5\u6b64\u985e\u63a8\uff0c\u5b50\u554f\u984c\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5b50\u5b50\u5b6b\u5b6b\u7121\u7aae\u76e1\u4e5f\u3002\u7d55\u5927\u90e8\u5206\u8a08\u7b97\u8cc7\u6e90\u90fd\u6d6a\u8cbb\u5728\u9019\u4e9b\u91cd\u758a\u7684\u5b50\u554f\u984c\u4e0a\u3002

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u70ba\u4e86\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u5011\u5e0c\u671b\u6240\u6709\u7684\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u9663\u5217 mem \u4f86\u8a18\u9304\u6bcf\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5c07\u91cd\u758a\u5b50\u554f\u984c\u526a\u679d\u3002

    1. \u7576\u9996\u6b21\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u5c07\u5176\u8a18\u9304\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u5f8c\u4f7f\u7528\u3002
    2. \u7576\u518d\u6b21\u9700\u8981\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u4fbf\u53ef\u76f4\u63a5\u5f9e mem[i] \u4e2d\u7372\u53d6\u7d50\u679c\uff0c\u5f9e\u800c\u907f\u514d\u91cd\u8907\u8a08\u7b97\u8a72\u5b50\u554f\u984c\u3002

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\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\u8a18\u9304 dp[i] \uff0c\u5247\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    # \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
    climbing_stairs_dfs_mem.cpp
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.java
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.cs
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
    climbing_stairs_dfs_mem.go
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\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
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
    climbing_stairs_dfs_mem.js
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.ts
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.dart
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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  // \u8a18\u9304 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.rs
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
    climbing_stairs_dfs_mem.c
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\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
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
    climbing_stairs_dfs_mem.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
    climbing_stairs_dfs_mem.zig
    // \u8a18\u61b6\u5316\u641c\u5c0b\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u5716 14-4 \uff0c\u7d93\u904e\u8a18\u61b6\u5316\u8655\u7406\u5f8c\uff0c\u6240\u6709\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u9019\u662f\u4e00\u500b\u5de8\u5927\u7684\u98db\u8e8d\u3002

    \u5716 14-4 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u5c0d\u61c9\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u201c\u5f9e\u9802\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u5011\u5f9e\u539f\u554f\u984c\uff08\u6839\u7bc0\u9ede\uff09\u958b\u59cb\uff0c\u905e\u8ff4\u5730\u5c07\u8f03\u5927\u5b50\u554f\u984c\u5206\u89e3\u70ba\u8f03\u5c0f\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u554f\u984c\uff08\u8449\u7bc0\u9ede\uff09\u3002\u4e4b\u5f8c\uff0c\u900f\u904e\u56de\u6eaf\u9010\u5c64\u6536\u96c6\u5b50\u554f\u984c\u7684\u89e3\uff0c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

    \u8207\u4e4b\u76f8\u53cd\uff0c\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u7684\u65b9\u6cd5\uff1a\u5f9e\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u958b\u59cb\uff0c\u8fed\u4ee3\u5730\u69cb\u5efa\u66f4\u5927\u5b50\u554f\u984c\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002

    \u7531\u65bc\u52d5\u614b\u898f\u5283\u4e0d\u5305\u542b\u56de\u6eaf\u904e\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u8ff4\u5708\u8fed\u4ee3\u5be6\u73fe\uff0c\u7121\u9808\u4f7f\u7528\u905e\u8ff4\u3002\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u521d\u59cb\u5316\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u8207\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u9663\u5217 mem \u76f8\u540c\u7684\u8a18\u9304\u4f5c\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{climbing_stairs_dp}\n
    climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-5 \u6a21\u64ec\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\u3002

    \u5716 14-5 \u00a0 \u722c\u6a13\u68af\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u8207\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u52d5\u614b\u898f\u5283\u4e5f\u4f7f\u7528\u201c\u72c0\u614b\u201d\u6982\u5ff5\u4f86\u8868\u793a\u554f\u984c\u6c42\u89e3\u7684\u7279\u5b9a\u968e\u6bb5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\u4ee5\u53ca\u76f8\u61c9\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u6a13\u68af\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578 \\(i\\) \u3002

    \u6839\u64da\u4ee5\u4e0a\u5167\u5bb9\uff0c\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u52d5\u614b\u898f\u5283\u7684\u5e38\u7528\u8853\u8a9e\u3002

    • \u5c07\u9663\u5217 dp \u7a31\u70ba dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72c0\u614b \\(i\\) \u5c0d\u61c9\u5b50\u554f\u984c\u7684\u89e3\u3002
    • \u5c07\u6700\u5c0f\u5b50\u554f\u984c\u5c0d\u61c9\u7684\u72c0\u614b\uff08\u7b2c \\(1\\) \u968e\u548c\u7b2c \\(2\\) \u968e\u6a13\u68af\uff09\u7a31\u70ba\u521d\u59cb\u72c0\u614b\u3002
    • \u5c07\u905e\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u7a31\u70ba\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002
    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u7531\u65bc \\(dp[i]\\) \u53ea\u8207 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u7121\u9808\u4f7f\u7528\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u800c\u53ea\u9700\u5169\u500b\u8b8a\u6578\u6efe\u52d5\u524d\u9032\u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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
    [class]{}-[func]{climbing_stairs_dp_comp}\n
    climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7531\u65bc\u7701\u53bb\u4e86\u9663\u5217 dp \u4f54\u7528\u7684\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

    \u5728\u52d5\u614b\u898f\u5283\u554f\u984c\u4e2d\uff0c\u7576\u524d\u72c0\u614b\u5f80\u5f80\u50c5\u8207\u524d\u9762\u6709\u9650\u500b\u72c0\u614b\u6709\u95dc\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72c0\u614b\uff0c\u900f\u904e\u201c\u964d\u7dad\u201d\u4f86\u7bc0\u7701\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u9019\u7a2e\u7a7a\u9593\u6700\u4f73\u5316\u6280\u5de7\u88ab\u7a31\u70ba\u201c\u6efe\u52d5\u8b8a\u6578\u201d\u6216\u201c\u6efe\u52d5\u9663\u5217\u201d\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c","text":"

    \u80cc\u5305\u554f\u984c\u662f\u4e00\u500b\u975e\u5e38\u597d\u7684\u52d5\u614b\u898f\u5283\u5165\u9580\u984c\u76ee\uff0c\u662f\u52d5\u614b\u898f\u5283\u4e2d\u6700\u5e38\u898b\u7684\u554f\u984c\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u554f\u984c\u3001\u5b8c\u5168\u80cc\u5305\u554f\u984c\u3001\u591a\u91cd\u80cc\u5305\u554f\u984c\u7b49\u3002

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u4f86\u6c42\u89e3\u6700\u5e38\u898b\u7684 0-1 \u80cc\u5305\u554f\u984c\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002

    \u89c0\u5bdf\u5716 14-17 \uff0c\u7531\u65bc\u7269\u54c1\u7de8\u865f \\(i\\) \u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\uff0c\u9663\u5217\u7d22\u5f15\u5f9e \\(0\\) \u958b\u59cb\u8a08\u6578\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5c0d\u61c9\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u50f9\u503c \\(val[i-1]\\) \u3002

    \u5716 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u8cc7\u6599

    \u6211\u5011\u53ef\u4ee5\u5c07 0-1 \u80cc\u5305\u554f\u984c\u770b\u4f5c\u4e00\u500b\u7531 \\(n\\) \u8f2a\u6c7a\u7b56\u7d44\u6210\u7684\u904e\u7a0b\uff0c\u5c0d\u65bc\u6bcf\u500b\u7269\u9ad4\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u5169\u7a2e\u6c7a\u7b56\uff0c\u56e0\u6b64\u8a72\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\u3002

    \u8a72\u554f\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u201d\uff0c\u56e0\u6b64\u8f03\u5927\u6a5f\u7387\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u5c0d\u65bc\u6bcf\u500b\u7269\u54c1\u4f86\u8aaa\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72c0\u614b\u5b9a\u7fa9\uff1a\u7576\u524d\u7269\u54c1\u7de8\u865f \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8a18\u70ba \\([i, c]\\) \u3002

    \u72c0\u614b \\([i, c]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\uff0c\u8a18\u70ba \\(dp[i, c]\\) \u3002

    \u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u500b\u5c3a\u5bf8\u70ba \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u7576\u6211\u5011\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u6c7a\u7b56\u5f8c\uff0c\u5269\u9918\u7684\u662f\u524d \\(i-1\\) \u500b\u7269\u54c1\u6c7a\u7b56\u7684\u5b50\u554f\u984c\uff0c\u53ef\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c11 \\(wgt[i-1]\\) \uff0c\u50f9\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c-wgt[i-1]]\\) \u3002

    \u4e0a\u8ff0\u5206\u6790\u5411\u6211\u5011\u63ed\u793a\u4e86\u672c\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6700\u5927\u50f9\u503c \\(dp[i, c]\\) \u7b49\u65bc\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\u3002\u7531\u6b64\u53ef\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\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\u7576\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u9918\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u7121\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u70ba \\(0\\) \u6642\u6700\u5927\u50f9\u503c\u70ba \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    \u7576\u524d\u72c0\u614b \\([i, c]\\) \u5f9e\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c-wgt[i-1]]\\) \u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u6309\u9806\u5e8f\u5be6\u73fe\u66b4\u529b\u641c\u5c0b\u3001\u8a18\u61b6\u5316\u641c\u5c0b\u3001\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u641c\u5c0b\u7a0b\u5f0f\u78bc\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, c]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5b50\u554f\u984c\u7684\u89e3 \\(dp[i, c]\\) \u3002
    • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576\u7269\u54c1\u7de8\u865f\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u9918\u5bb9\u91cf\u70ba \\(0\\) \u6642\uff0c\u7d42\u6b62\u905e\u8ff4\u4e26\u8fd4\u56de\u50f9\u503c \\(0\\) \u3002
    • \u526a\u679d\uff1a\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes);\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.Max(no, yes);\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return int(math.Max(float64(no), float64(yes)))\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  return max(no, yes);\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    std::cmp::max(no, yes)\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return myMax(no, yes);\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
    knapsack.rb
    [class]{}-[func]{knapsack_dfs}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return @max(no, yes);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-18 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u7269\u54c1\u90fd\u6703\u7522\u751f\u4e0d\u9078\u548c\u9078\u5169\u689d\u641c\u5c0b\u5206\u652f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002

    \u89c0\u5bdf\u905e\u8ff4\u6a39\uff0c\u5bb9\u6613\u767c\u73fe\u5176\u4e2d\u5b58\u5728\u91cd\u758a\u5b50\u554f\u984c\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u7576\u7269\u54c1\u8f03\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f03\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f03\u591a\u6642\uff0c\u91cd\u758a\u5b50\u554f\u984c\u7684\u6578\u91cf\u5c07\u6703\u5927\u5e45\u589e\u591a\u3002

    \u5716 14-18 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u70ba\u4e86\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\uff0c\u6211\u5011\u85c9\u52a9\u8a18\u61b6\u4e32\u5217 mem \u4f86\u8a18\u9304\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5c0d\u61c9 \\(dp[i, c]\\) \u3002

    \u5f15\u5165\u8a18\u61b6\u5316\u4e4b\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u5b50\u554f\u984c\u6578\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\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\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    # \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\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\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\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\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\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\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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  // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.rb
    [class]{}-[func]{knapsack_dfs_mem}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-19 \u5c55\u793a\u4e86\u5728\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u88ab\u526a\u6389\u7684\u641c\u5c0b\u5206\u652f\u3002

    \u5716 14-19 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u52d5\u614b\u898f\u5283\u5be6\u8cea\u4e0a\u5c31\u662f\u5728\u72c0\u614b\u8f49\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u904e\u7a0b\uff0c\u7a0b\u5f0f\u78bc\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\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{knapsack_dp}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-20 \u6240\u793a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u7531\u9663\u5217 dp \u5927\u5c0f\u6c7a\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

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

    \u5716 14-20 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u6bcf\u500b\u72c0\u614b\u90fd\u53ea\u8207\u5176\u4e0a\u4e00\u884c\u7684\u72c0\u614b\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5169\u500b\u9663\u5217\u6efe\u52d5\u524d\u9032\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

    \u9032\u4e00\u6b65\u601d\u8003\uff0c\u6211\u5011\u80fd\u5426\u50c5\u7528\u4e00\u500b\u9663\u5217\u5be6\u73fe\u7a7a\u9593\u6700\u4f73\u5316\u5462\uff1f\u89c0\u5bdf\u53ef\u77e5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f49\u79fb\u904e\u4f86\u7684\u3002\u5047\u8a2d\u53ea\u6709\u4e00\u500b\u9663\u5217\uff0c\u7576\u958b\u59cb\u8d70\u8a2a\u7b2c \\(i\\) \u884c\u6642\uff0c\u8a72\u9663\u5217\u5132\u5b58\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72c0\u614b\u3002

    • \u5982\u679c\u63a1\u53d6\u6b63\u5e8f\u8d70\u8a2a\uff0c\u90a3\u9ebc\u8d70\u8a2a\u5230 \\(dp[i, j]\\) \u6642\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7d93\u88ab\u8986\u84cb\uff0c\u6b64\u6642\u5c31\u7121\u6cd5\u5f97\u5230\u6b63\u78ba\u7684\u72c0\u614b\u8f49\u79fb\u7d50\u679c\u3002
    • \u5982\u679c\u63a1\u53d6\u5012\u5e8f\u8d70\u8a2a\uff0c\u5247\u4e0d\u6703\u767c\u751f\u8986\u84cb\u554f\u984c\uff0c\u72c0\u614b\u8f49\u79fb\u53ef\u4ee5\u6b63\u78ba\u9032\u884c\u3002

    \u5716 14-21 \u5c55\u793a\u4e86\u5728\u55ae\u500b\u9663\u5217\u4e0b\u5f9e\u7b2c \\(i = 1\\) \u884c\u8f49\u63db\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u904e\u7a0b\u3002\u8acb\u601d\u8003\u6b63\u5e8f\u8d70\u8a2a\u548c\u5012\u5e8f\u8d70\u8a2a\u7684\u5340\u5225\u3002

    <1><2><3><4><5><6>

    \u5716 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad \\(i\\) \u76f4\u63a5\u522a\u9664\uff0c\u4e26\u4e14\u628a\u5167\u8ff4\u5708\u66f4\u6539\u70ba\u5012\u5e8f\u8d70\u8a2a\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u8d70\u8a2a\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u8d70\u8a2a\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{knapsack_dp_comp}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u8d70\u8a2a\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7d50","text":"
    • \u52d5\u614b\u898f\u5283\u5c0d\u554f\u984c\u9032\u884c\u5206\u89e3\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u898f\u907f\u91cd\u8907\u8a08\u7b97\uff0c\u63d0\u9ad8\u8a08\u7b97\u6548\u7387\u3002
    • \u4e0d\u8003\u616e\u6642\u9593\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52d5\u614b\u898f\u5283\u554f\u984c\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u5c0b\uff09\u9032\u884c\u6c42\u89e3\uff0c\u4f46\u905e\u8ff4\u6a39\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u6548\u7387\u6975\u4f4e\u3002\u900f\u904e\u5f15\u5165\u8a18\u61b6\u5316\u4e32\u5217\uff0c\u53ef\u4ee5\u5132\u5b58\u6240\u6709\u8a08\u7b97\u904e\u7684\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5f9e\u800c\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002
    • \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u905e\u8ff4\u5f0f\u89e3\u6cd5\uff0c\u800c\u8207\u4e4b\u5c0d\u61c9\u7684\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u5f9e\u5e95\u81f3\u9802\u7684\u905e\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5beb\u8868\u683c\u201d\u4e00\u6a23\u3002\u7531\u65bc\u7576\u524d\u72c0\u614b\u50c5\u4f9d\u8cf4\u67d0\u4e9b\u5340\u57df\u6027\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\uff0c\u5f9e\u800c\u964d\u4f4e\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8cea\u3002
    • \u52d5\u614b\u898f\u5283\u554f\u984c\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002
    • \u5982\u679c\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u53ef\u4ee5\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\uff0c\u5247\u5b83\u5c31\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\u3002
    • \u7121\u5f8c\u6548\u6027\u6307\u5c0d\u65bc\u4e00\u500b\u72c0\u614b\uff0c\u5176\u672a\u4f86\u767c\u5c55\u53ea\u8207\u8a72\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u4e0d\u5177\u6709\u7121\u5f8c\u6548\u6027\uff0c\u7121\u6cd5\u4f7f\u7528\u52d5\u614b\u898f\u5283\u5feb\u901f\u6c42\u89e3\u3002

    \u80cc\u5305\u554f\u984c

    • \u80cc\u5305\u554f\u984c\u662f\u6700\u5178\u578b\u7684\u52d5\u614b\u898f\u5283\u554f\u984c\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u8b8a\u7a2e\u3002
    • 0-1 \u80cc\u5305\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\u3002\u6839\u64da\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u5169\u7a2e\u6c7a\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\uff0c\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u8d70\u8a2a\u4e32\u5217\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72c0\u614b\u88ab\u8986\u84cb\u3002
    • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u6bcf\u7a2e\u7269\u54c1\u7684\u9078\u53d6\u6578\u91cf\u7121\u9650\u5236\uff0c\u56e0\u6b64\u9078\u64c7\u653e\u5165\u7269\u54c1\u7684\u72c0\u614b\u8f49\u79fb\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\u3002\u7531\u65bc\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\u61c9\u7576\u6b63\u5e8f\u8d70\u8a2a\u3002
    • \u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u500b\u8b8a\u7a2e\u3002\u5b83\u5f9e\u6c42\u201c\u6700\u5927\u201d\u50f9\u503c\u8b8a\u70ba\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e63\u6578\u91cf\uff0c\u56e0\u6b64\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u61c9\u6539\u70ba \\(\\min()\\) \u3002\u5f9e\u8ffd\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u4f86\u8868\u793a\u201c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u201d\u7684\u7121\u6548\u89e3\u3002
    • \u96f6\u9322\u514c\u63db\u554f\u984c II \u5f9e\u6c42\u201c\u6700\u5c11\u786c\u5e63\u6578\u91cf\u201d\u6539\u70ba\u6c42\u201c\u786c\u5e63\u7d44\u5408\u6578\u91cf\u201d\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u76f8\u61c9\u5730\u5f9e \\(\\min()\\) \u6539\u70ba\u6c42\u548c\u904b\u7b97\u5b50\u3002

    \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

    • \u7de8\u8f2f\u8ddd\u96e2\uff08Levenshtein \u8ddd\u96e2\uff09\u7528\u65bc\u8861\u91cf\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u7fa9\u70ba\u5f9e\u4e00\u500b\u5b57\u4e32\u5230\u53e6\u4e00\u500b\u5b57\u4e32\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u7de8\u8f2f\u64cd\u4f5c\u5305\u62ec\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\u3002
    • \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002\u7576 \\(s[i] \\ne t[j]\\) \u6642\uff0c\u5177\u6709\u4e09\u7a2e\u6c7a\u7b56\uff1a\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\uff0c\u5b83\u5011\u90fd\u6709\u76f8\u61c9\u7684\u5269\u9918\u5b50\u554f\u984c\u3002\u64da\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u8207\u69cb\u5efa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u800c\u7576 \\(s[i] = t[j]\\) \u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\u3002
    • \u5728\u7de8\u8f2f\u8ddd\u96e2\u4e2d\uff0c\u72c0\u614b\u4f9d\u8cf4\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u6b63\u5e8f\u6216\u5012\u5e8f\u8d70\u8a2a\u90fd\u7121\u6cd5\u6b63\u78ba\u5730\u9032\u884c\u72c0\u614b\u8f49\u79fb\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u8b8a\u6578\u66ab\u5b58\u5de6\u4e0a\u65b9\u72c0\u614b\uff0c\u5f9e\u800c\u8f49\u5316\u5230\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7b49\u50f9\u7684\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002
    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u6c42\u89e3\u53e6\u4e00\u500b\u5e38\u898b\u7684\u80cc\u5305\u554f\u984c\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u77ad\u89e3\u5b83\u7684\u4e00\u7a2e\u7279\u4f8b\uff1a\u96f6\u9322\u514c\u63db\u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 14-22 \u6240\u793a\u3002

    \u5716 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u5b8c\u5168\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\uff0c\u5340\u5225\u50c5\u5728\u65bc\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9078\u64c7\u6b21\u6578\u3002

    • \u5728 0-1 \u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u53ea\u6709\u4e00\u500b\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u53ea\u80fd\u5f9e\u524d \\(i-1\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002
    • \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u7684\u6578\u91cf\u662f\u7121\u9650\u7684\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5f9e\u524d \\(i\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002

    \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u898f\u5b9a\u4e0b\uff0c\u72c0\u614b \\([i, c]\\) \u7684\u8b8a\u5316\u5206\u70ba\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u8f49\u79fb\u81f3 \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\uff0c\u8f49\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

    \u5f9e\u800c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u8b8a\u70ba\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 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5c0d\u6bd4\u5169\u9053\u984c\u76ee\u7684\u7a0b\u5f0f\u78bc\uff0c\u72c0\u614b\u8f49\u79fb\u4e2d\u6709\u4e00\u8655\u5f9e \\(i-1\\) \u8b8a\u70ba \\(i\\) \uff0c\u5176\u9918\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\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{unbounded_knapsack_dp}\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u7576\u524d\u72c0\u614b\u662f\u5f9e\u5de6\u908a\u548c\u4e0a\u908a\u7684\u72c0\u614b\u8f49\u79fb\u800c\u4f86\u7684\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u61c9\u8a72\u5c0d \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002

    \u9019\u500b\u8d70\u8a2a\u9806\u5e8f\u8207 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8acb\u85c9\u52a9\u5716 14-23 \u4f86\u7406\u89e3\u5169\u8005\u7684\u5340\u5225\u3002

    <1><2><3><4><5><6>

    \u5716 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u7a0b\u5f0f\u78bc\u5be6\u73fe\u6bd4\u8f03\u7c21\u55ae\uff0c\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad\u522a\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{unbounded_knapsack_dp_comp}\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c","text":"

    \u80cc\u5305\u554f\u984c\u662f\u4e00\u5927\u985e\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4ee3\u8868\uff0c\u5176\u64c1\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 14-24 \u6240\u793a\u3002

    \u5716 14-24 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u96f6\u9322\u514c\u63db\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u7a2e\u7279\u6b8a\u60c5\u6cc1\uff0c\u5169\u8005\u5177\u6709\u4ee5\u4e0b\u95dc\u806f\u8207\u4e0d\u540c\u9ede\u3002

    • \u5169\u9053\u984c\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\uff0c\u201c\u7269\u54c1\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5c0d\u61c9\u201c\u76ee\u6a19\u91d1\u984d\u201d\u3002
    • \u6700\u4f73\u5316\u76ee\u6a19\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u50f9\u503c\uff0c\u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e63\u6578\u91cf\u3002
    • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u9322\u514c\u63db\u662f\u6c42\u201c\u6070\u597d\u201d\u6e4a\u5230\u76ee\u6a19\u91d1\u984d\u7684\u89e3\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u72c0\u614b \\([i, a]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\uff0c\u8a18\u70ba \\(dp[i, a]\\) \u3002

    \u4e8c\u7dad \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt+1)\\) \u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u672c\u984c\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u5169\u9ede\u5dee\u7570\u3002

    • \u672c\u984c\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c07\u904b\u7b97\u5b50 \\(\\max()\\) \u66f4\u6539\u70ba \\(\\min()\\) \u3002
    • \u6700\u4f73\u5316\u4e3b\u9ad4\u662f\u786c\u5e63\u6578\u91cf\u800c\u975e\u5546\u54c1\u50f9\u503c\uff0c\u56e0\u6b64\u5728\u9078\u4e2d\u786c\u5e63\u6642\u57f7\u884c \\(+1\\) \u5373\u53ef\u3002
    \\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u6e4a\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u70ba \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    \u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u5373\u662f\u7121\u6548\u89e3\u3002\u70ba\u4f7f\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u5f0f\u80fd\u5920\u8b58\u5225\u4e26\u904e\u6ffe\u7121\u6548\u89e3\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528 \\(+ \\infty\\) \u4f86\u8868\u793a\u5b83\u5011\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(+ \\infty\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e26\u672a\u63d0\u4f9b \\(+ \\infty\\) \u8b8a\u6578\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u4f86\u4ee3\u66ff\u3002\u800c\u9019\u53c8\u6703\u5c0e\u81f4\u5927\u6578\u8d8a\u754c\uff1a\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u767c\u751f\u6ea2\u4f4d\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u6578\u5b57 \\(amt + 1\\) \u4f86\u8868\u793a\u7121\u6548\u89e3\uff0c\u56e0\u70ba\u6e4a\u51fa \\(amt\\) \u7684\u786c\u5e63\u6578\u91cf\u6700\u591a\u70ba \\(amt\\) \u3002\u6700\u5f8c\u8fd4\u56de\u524d\uff0c\u5224\u65b7 \\(dp[n, amt]\\) \u662f\u5426\u7b49\u65bc \\(amt + 1\\) \uff0c\u82e5\u662f\u5247\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{coin_change_dp}\n
    coin_change.zig
    // \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-25 \u5c55\u793a\u4e86\u96f6\u9322\u514c\u63db\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u5716 14-25 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u96f6\u9322\u514c\u63db\u7684\u7a7a\u9593\u6700\u4f73\u5316\u7684\u8655\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{coin_change_dp_comp}\n
    coin_change.zig
    // \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u786c\u5e63\u7d44\u5408\u6578\u91cf\u3002\u793a\u4f8b\u5982\u5716 14-26 \u6240\u793a\u3002

    \u5716 14-26 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II \u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u76f8\u6bd4\u65bc\u4e0a\u4e00\u984c\uff0c\u672c\u984c\u76ee\u6a19\u662f\u6c42\u7d44\u5408\u6578\u91cf\uff0c\u56e0\u6b64\u5b50\u554f\u984c\u8b8a\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u7d44\u5408\u6578\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7dad\u77e9\u9663\u3002

    \u7576\u524d\u72c0\u614b\u7684\u7d44\u5408\u6578\u91cf\u7b49\u65bc\u4e0d\u9078\u7576\u524d\u786c\u5e63\u8207\u9078\u7576\u524d\u786c\u5e63\u9019\u5169\u7a2e\u6c7a\u7b56\u7684\u7d44\u5408\u6578\u91cf\u4e4b\u548c\u3002\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

    \u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u7121\u9808\u9078\u64c7\u4efb\u4f55\u786c\u5e63\u5373\u53ef\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u61c9\u5c07\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u70ba \\(1\\) \u3002\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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
    [class]{}-[func]{coin_change_ii_dp}\n
    coin_change_ii.zig
    // \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7a7a\u9593\u6700\u4f73\u5316\u8655\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u522a\u9664\u786c\u5e63\u7dad\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
    coin_change_ii.cpp
    /* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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
    [class]{}-[func]{coin_change_ii_dp_comp}\n
    coin_change_ii.zig
    // \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u5716","text":"

    Abstract

    \u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u5011\u5c31\u50cf\u662f\u4e00\u500b\u500b\u7bc0\u9ede\uff0c\u88ab\u7121\u6578\u770b\u4e0d\u898b\u7684\u908a\u76f8\u9023\u3002

    \u6bcf\u4e00\u6b21\u7684\u76f8\u8b58\u8207\u76f8\u96e2\uff0c\u90fd\u5728\u9019\u5f35\u5de8\u5927\u7684\u7db2\u8def\u5716\u4e2d\u7559\u4e0b\u7368\u7279\u7684\u5370\u8a18\u3002

    "},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 9.1 \u00a0 \u5716
    • 9.2 \u00a0 \u5716\u57fa\u790e\u64cd\u4f5c
    • 9.3 \u00a0 \u5716\u7684\u8d70\u8a2a
    • 9.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u5716","text":"

    \u5716\uff08graph\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u7531\u9802\u9ede\uff08vertex\uff09\u548c\u908a\uff08edge\uff09\u7d44\u6210\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u5716 \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede \\(V\\) \u548c\u4e00\u7d44\u908a \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u500b\u5305\u542b 5 \u500b\u9802\u9ede\u548c 7 \u689d\u908a\u7684\u5716\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\u5c07\u9802\u9ede\u770b\u4f5c\u7bc0\u9ede\uff0c\u5c07\u908a\u770b\u4f5c\u9023\u7dda\u5404\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5716\u770b\u4f5c\u4e00\u7a2e\u5f9e\u93c8\u7d50\u4e32\u5217\u62d3\u5c55\u800c\u4f86\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5982\u5716 9-1 \u6240\u793a\uff0c\u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002

    \u5716 9-1 \u00a0 \u93c8\u7d50\u4e32\u5217\u3001\u6a39\u3001\u5716\u4e4b\u9593\u7684\u95dc\u4fc2

    "},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u5716\u7684\u5e38\u898b\u578b\u5225\u8207\u8853\u8a9e","text":"

    \u6839\u64da\u908a\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u70ba\u7121\u5411\u5716\uff08undirected graph\uff09\u548c\u6709\u5411\u5716\uff08directed graph\uff09\uff0c\u5982\u5716 9-2 \u6240\u793a\u3002

    • \u5728\u7121\u5411\u5716\u4e2d\uff0c\u908a\u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7684\u201c\u96d9\u5411\u201d\u9023\u7dda\u95dc\u4fc2\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u95dc\u4fc2\u201d\u3002
    • \u5728\u6709\u5411\u5716\u4e2d\uff0c\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u5169\u500b\u65b9\u5411\u7684\u908a\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u95dc\u6ce8\u201d\u8207\u201c\u88ab\u95dc\u6ce8\u201d\u95dc\u4fc2\u3002

    \u5716 9-2 \u00a0 \u6709\u5411\u5716\u8207\u7121\u5411\u5716

    \u6839\u64da\u6240\u6709\u9802\u9ede\u662f\u5426\u9023\u901a\uff0c\u53ef\u5206\u70ba\u9023\u901a\u5716\uff08connected graph\uff09\u548c\u975e\u9023\u901a\u5716\uff08disconnected graph\uff09\uff0c\u5982\u5716 9-3 \u6240\u793a\u3002

    • \u5c0d\u65bc\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u53ef\u4ee5\u5230\u9054\u5176\u9918\u4efb\u610f\u9802\u9ede\u3002
    • \u5c0d\u65bc\u975e\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002

    \u5716 9-3 \u00a0 \u9023\u901a\u5716\u8207\u975e\u9023\u901a\u5716

    \u6211\u5011\u9084\u53ef\u4ee5\u70ba\u908a\u65b0\u589e\u201c\u6b0a\u91cd\u201d\u8b8a\u6578\uff0c\u5f9e\u800c\u5f97\u5230\u5982\u5716 9-4 \u6240\u793a\u7684\u6709\u6b0a\u5716\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u69ae\u8000\u300b\u7b49\u624b\u904a\u4e2d\uff0c\u7cfb\u7d71\u6703\u6839\u64da\u5171\u540c\u904a\u6232\u6642\u9593\u4f86\u8a08\u7b97\u73a9\u5bb6\u4e4b\u9593\u7684\u201c\u89aa\u5bc6\u5ea6\u201d\uff0c\u9019\u7a2e\u89aa\u5bc6\u5ea6\u7db2\u8def\u5c31\u53ef\u4ee5\u7528\u6709\u6b0a\u5716\u4f86\u8868\u793a\u3002

    \u5716 9-4 \u00a0 \u6709\u6b0a\u5716\u8207\u7121\u6b0a\u5716

    \u5716\u8cc7\u6599\u7d50\u69cb\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u8853\u8a9e\u3002

    • \u9130\u63a5\uff08adjacency\uff09\uff1a\u7576\u5169\u9802\u9ede\u4e4b\u9593\u5b58\u5728\u908a\u76f8\u9023\u6642\uff0c\u7a31\u9019\u5169\u9802\u9ede\u201c\u9130\u63a5\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u9802\u9ede 1 \u7684\u9130\u63a5\u9802\u9ede\u70ba\u9802\u9ede 2\u30013\u30015\u3002
    • \u8def\u5f91\uff08path\uff09\uff1a\u5f9e\u9802\u9ede A \u5230\u9802\u9ede B \u7d93\u904e\u7684\u908a\u69cb\u6210\u7684\u5e8f\u5217\u88ab\u7a31\u70ba\u5f9e A \u5230 B \u7684\u201c\u8def\u5f91\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u908a\u5e8f\u5217 1-5-2-4 \u662f\u9802\u9ede 1 \u5230\u9802\u9ede 4 \u7684\u4e00\u689d\u8def\u5f91\u3002
    • \u5ea6\uff08degree\uff09\uff1a\u4e00\u500b\u9802\u9ede\u64c1\u6709\u7684\u908a\u6578\u3002\u5c0d\u65bc\u6709\u5411\u5716\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u6307\u5411\u8a72\u9802\u9ede\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u5f9e\u8a72\u9802\u9ede\u6307\u51fa\u3002
    "},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u5716\u7684\u8868\u793a","text":"

    \u5716\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u7121\u5411\u5716\u9032\u884c\u8209\u4f8b\u3002

    "},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u9130\u63a5\u77e9\u9663","text":"

    \u8a2d\u5716\u7684\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u9130\u63a5\u77e9\u9663\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u662f\u5426\u5b58\u5728\u908a\u3002

    \u5982\u5716 9-5 \u6240\u793a\uff0c\u8a2d\u9130\u63a5\u77e9\u9663\u70ba \\(M\\)\u3001\u9802\u9ede\u4e32\u5217\u70ba \\(V\\) \uff0c\u90a3\u9ebc\u77e9\u9663\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9802\u9ede \\(V[i]\\) \u5230\u9802\u9ede \\(V[j]\\) \u4e4b\u9593\u5b58\u5728\u908a\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7121\u908a\u3002

    \u5716 9-5 \u00a0 \u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a

    \u9130\u63a5\u77e9\u9663\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u56e0\u6b64\u9130\u63a5\u77e9\u9663\u4e3b\u5c0d\u89d2\u7dda\u5143\u7d20\u6c92\u6709\u610f\u7fa9\u3002
    • \u5c0d\u65bc\u7121\u5411\u5716\uff0c\u5169\u500b\u65b9\u5411\u7684\u908a\u7b49\u50f9\uff0c\u6b64\u6642\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\u3002
    • \u5c07\u9130\u63a5\u77e9\u9663\u7684\u5143\u7d20\u5f9e \\(1\\) \u548c \\(0\\) \u66ff\u63db\u70ba\u6b0a\u91cd\uff0c\u5247\u53ef\u8868\u793a\u6709\u6b0a\u5716\u3002

    \u4f7f\u7528\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u8a2a\u554f\u77e9\u9663\u5143\u7d20\u4ee5\u7372\u53d6\u908a\uff0c\u56e0\u6b64\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9663\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u8a18\u61b6\u9ad4\u4f54\u7528\u8f03\u591a\u3002

    "},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u9130\u63a5\u8868","text":"

    \u9130\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u8868\u793a\u9802\u9ede\u3002\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff08\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u9802\u9ede\uff09\u3002\u5716 9-6 \u5c55\u793a\u4e86\u4e00\u500b\u4f7f\u7528\u9130\u63a5\u8868\u5132\u5b58\u7684\u5716\u7684\u793a\u4f8b\u3002

    \u5716 9-6 \u00a0 \u5716\u7684\u9130\u63a5\u8868\u8868\u793a

    \u9130\u63a5\u8868\u50c5\u5132\u5b58\u5be6\u969b\u5b58\u5728\u7684\u908a\uff0c\u800c\u908a\u7684\u7e3d\u6578\u901a\u5e38\u9060\u5c0f\u65bc \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002\u7136\u800c\uff0c\u5728\u9130\u63a5\u8868\u4e2d\u9700\u8981\u900f\u904e\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u5176\u6642\u9593\u6548\u7387\u4e0d\u5982\u9130\u63a5\u77e9\u9663\u3002

    \u89c0\u5bdf\u5716 9-6 \uff0c\u9130\u63a5\u8868\u7d50\u69cb\u8207\u96dc\u6e4a\u8868\u4e2d\u7684\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u5011\u4e5f\u53ef\u4ee5\u63a1\u7528\u985e\u4f3c\u7684\u65b9\u6cd5\u4f86\u6700\u4f73\u5316\u6548\u7387\u3002\u6bd4\u5982\u7576\u93c8\u7d50\u4e32\u5217\u8f03\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u6548\u7387\u5f9e \\(O(n)\\) \u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u9084\u53ef\u4ee5\u628a\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

    "},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u5716\u7684\u5e38\u898b\u61c9\u7528","text":"

    \u5982\u8868 9-1 \u6240\u793a\uff0c\u8a31\u591a\u73fe\u5be6\u7cfb\u7d71\u53ef\u4ee5\u7528\u5716\u4f86\u5efa\u6a21\uff0c\u76f8\u61c9\u7684\u554f\u984c\u4e5f\u53ef\u4ee5\u7d04\u5316\u70ba\u5716\u8a08\u7b97\u554f\u984c\u3002

    \u8868 9-1 \u00a0 \u73fe\u5be6\u751f\u6d3b\u4e2d\u5e38\u898b\u7684\u5716

    \u9802\u9ede \u908a \u5716\u8a08\u7b97\u554f\u984c \u793e\u4ea4\u7db2\u8def \u4f7f\u7528\u8005 \u597d\u53cb\u95dc\u4fc2 \u6f5b\u5728\u597d\u53cb\u63a8\u85a6 \u5730\u9435\u7dda\u8def \u7ad9\u9ede \u7ad9\u9ede\u9593\u7684\u9023\u901a\u6027 \u6700\u77ed\u8def\u7dda\u63a8\u85a6 \u592a\u967d\u7cfb \u661f\u9ad4 \u661f\u9ad4\u9593\u7684\u842c\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8ecc\u9053\u8a08\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u5716\u7684\u57fa\u790e\u64cd\u4f5c","text":"

    \u5716\u7684\u57fa\u790e\u64cd\u4f5c\u53ef\u5206\u70ba\u5c0d\u201c\u908a\u201d\u7684\u64cd\u4f5c\u548c\u5c0d\u201c\u9802\u9ede\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u5169\u7a2e\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5be6\u73fe\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

    "},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u7684\u5be6\u73fe","text":"

    \u7d66\u5b9a\u4e00\u500b\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \u7684\u7121\u5411\u5716\uff0c\u5247\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u5f0f\u5982\u5716 9-7 \u6240\u793a\u3002

    • \u65b0\u589e\u6216\u522a\u9664\u908a\uff1a\u76f4\u63a5\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u800c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u9700\u8981\u540c\u6642\u66f4\u65b0\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u7684\u5c3e\u90e8\u65b0\u589e\u4e00\u884c\u4e00\u5217\uff0c\u4e26\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u522a\u9664\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u4e00\u884c\u4e00\u5217\u3002\u7576\u522a\u9664\u9996\u884c\u9996\u5217\u6642\u9054\u5230\u6700\u5dee\u60c5\u6cc1\uff0c\u9700\u8981\u5c07 \\((n-1)^2\\) \u500b\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52d5\u201d\uff0c\u5f9e\u800c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u521d\u59cb\u5316\uff1a\u50b3\u5165 \\(n\\) \u500b\u9802\u9ede\uff0c\u521d\u59cb\u5316\u9577\u5ea6\u70ba \\(n\\) \u7684\u9802\u9ede\u4e32\u5217 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u9130\u63a5\u77e9\u9663 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    \u521d\u59cb\u5316\u9130\u63a5\u77e9\u9663\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

    \u5716 9-7 \u00a0 \u9130\u63a5\u77e9\u9663\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

    \u4ee5\u4e0b\u662f\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
    class GraphAdjMat:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u65b0\u589e\u9802\u9ede\n        for val in vertices:\n            self.add_vertex(val)\n        # \u65b0\u589e\u908a\n        # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        n = self.size()\n        # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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        \"\"\"\u65b0\u589e\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\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        \"\"\"\u522a\u9664\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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        \"\"\"\u5217\u5370\u9130\u63a5\u77e9\u9663\"\"\"\n        print(\"\u9802\u9ede\u4e32\u5217 =\", self.vertices)\n        print(\"\u9130\u63a5\u77e9\u9663 =\")\n        print_matrix(self.adj_mat)\n
    graph_adjacency_matrix.cpp
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    void print() {\n        cout << \"\u9802\u9ede\u4e32\u5217 = \";\n        printVector(vertices);\n        cout << \"\u9130\u63a5\u77e9\u9663 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
    graph_adjacency_matrix.java
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void print() {\n        System.out.print(\"\u9802\u9ede\u4e32\u5217 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.cs
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void Print() {\n        Console.Write(\"\u9802\u9ede\u4e32\u5217 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.go
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjMat struct {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vertices []int\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u65b0\u589e\u9802\u9ede\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\u5716\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9802\u9ede\u4e32\u5217 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u9130\u63a5\u77e9\u9663 = \\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\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.append(val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    func print() {\n        Swift.print(\"\u9802\u9ede\u4e32\u5217 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u9130\u63a5\u77e9\u9663 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
    graph_adjacency_matrix.js
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print() {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.ts
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices: number[]; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print(): void {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.dart
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9802\u9ede\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u65b0\u589e\u9802\u9ede\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    vertices.add(val);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    vertices.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u65b0\u589e\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u522a\u9664\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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  /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n  void printAdjMat() {\n    print(\"\u9802\u9ede\u4e32\u5217 = $vertices\");\n    print(\"\u9130\u63a5\u77e9\u9663 = \");\n    printMatrix(adjMat);\n  }\n}\n
    graph_adjacency_matrix.rs
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjMat {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u5efa\u69cb\u5b50 */\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        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    pub fn print(&self) {\n        println!(\"\u9802\u9ede\u4e32\u5217 = {:?}\", self.vertices);\n        println!(\"\u9130\u63a5\u77e9\u9663 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
    graph_adjacency_matrix.c
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u5716\u7684\u9802\u9ede\u6578\u91cf\u5df2\u9054\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u65b0\u589e\u7b2c n \u500b\u9802\u9ede\uff0c\u4e26\u5c07\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/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9802\u9ede\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 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, \"\u908a\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/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 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, \"\u908a\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/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9802\u9ede\u4e32\u5217 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u9130\u63a5\u77e9\u9663 =\\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\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u9802\u9ede\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    fun print() {\n        print(\"\u9802\u9ede\u4e32\u5217 = \")\n        println(vertices)\n        println(\"\u9130\u63a5\u77e9\u9663 =\")\n        printMatrix(adjMat)\n    }\n}\n
    graph_adjacency_matrix.rb
    [class]{GraphAdjMat}-[func]{}\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u65bc\u9130\u63a5\u8868\u7684\u5be6\u73fe","text":"

    \u8a2d\u7121\u5411\u5716\u7684\u9802\u9ede\u7e3d\u6578\u70ba \\(n\\)\u3001\u908a\u7e3d\u6578\u70ba \\(m\\) \uff0c\u5247\u53ef\u6839\u64da\u5716 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5be6\u73fe\u5404\u7a2e\u64cd\u4f5c\u3002

    • \u65b0\u589e\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u7684\u672b\u5c3e\u65b0\u589e\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u70ba\u662f\u7121\u5411\u5716\uff0c\u6240\u4ee5\u9700\u8981\u540c\u6642\u65b0\u589e\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u522a\u9664\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u4e26\u522a\u9664\u6307\u5b9a\u908a\uff0c\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\u3002\u5728\u7121\u5411\u5716\u4e2d\uff0c\u9700\u8981\u540c\u6642\u522a\u9664\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u4e26\u5c07\u65b0\u589e\u9802\u9ede\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
    • \u522a\u9664\u9802\u9ede\uff1a\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u522a\u9664\u5305\u542b\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u5efa\u7acb \\(n\\) \u500b\u9802\u9ede\u548c \\(2m\\) \u689d\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
    \u521d\u59cb\u5316\u9130\u63a5\u8868\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

    \u5716 9-8 \u00a0 \u9130\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

    \u4ee5\u4e0b\u662f\u9130\u63a5\u8868\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u6bd4\u5716 9-8 \uff0c\u5be6\u969b\u7a0b\u5f0f\u78bc\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

    • \u70ba\u4e86\u65b9\u4fbf\u65b0\u589e\u8207\u522a\u9664\u9802\u9ede\uff0c\u4ee5\u53ca\u7c21\u5316\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f86\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\u3002
    • \u4f7f\u7528\u96dc\u6e4a\u8868\u4f86\u5132\u5b58\u9130\u63a5\u8868\uff0ckey \u70ba\u9802\u9ede\u4f8b\u9805\uff0cvalue \u70ba\u8a72\u9802\u9ede\u7684\u9130\u63a5\u9802\u9ede\u4e32\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002

    \u53e6\u5916\uff0c\u6211\u5011\u5728\u9130\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u985e\u5225\u4f86\u8868\u793a\u9802\u9ede\uff0c\u9019\u6a23\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u8207\u9130\u63a5\u77e9\u9663\u4e00\u6a23\uff0c\u7528\u4e32\u5217\u7d22\u5f15\u4f86\u5340\u5206\u4e0d\u540c\u9802\u9ede\uff0c\u90a3\u9ebc\u5047\u8a2d\u8981\u522a\u9664\u7d22\u5f15\u70ba \\(i\\) \u7684\u9802\u9ede\uff0c\u5247\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u5c07\u6240\u6709\u5927\u65bc \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u6e1b \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u500b\u9802\u9ede\u90fd\u662f\u552f\u4e00\u7684 Vertex \u4f8b\u9805\uff0c\u522a\u9664\u67d0\u4e00\u9802\u9ede\u4e4b\u5f8c\u5c31\u7121\u9808\u6539\u52d5\u5176\u4ed6\u9802\u9ede\u4e86\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
    class GraphAdjList:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u65b0\u589e\u908a 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        \"\"\"\u522a\u9664\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u522a\u9664\u908a 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        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.pop(vet)\n        # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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        \"\"\"\u5217\u5370\u9130\u63a5\u8868\"\"\"\n        print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  public:\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u522a\u9664\u6307\u5b9a\u7bc0\u9ede */\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    /* \u5efa\u69cb\u5b50 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u522a\u9664\u908a vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.erase(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    void print() {\n        cout << \"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.Add(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.Remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjList struct {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList map[Vertex][]Vertex\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u65b0\u589e\u908a */\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    // \u65b0\u589e\u908a vet1 - vet2, \u65b0\u589e\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u522a\u9664\u908a */\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    // \u522a\u9664\u908a vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    delete(g.adjList, vet)\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u5217\u5370\u9130\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u5efa\u69cb\u5b50 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u65b0\u589e\u908a */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = []\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.removeValue(forKey: vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print() {\n        console.log('\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print(): void {\n        console.log('\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u5efa\u69cb\u5b50 */\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  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u65b0\u589e\u908a */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u65b0\u589e\u908a vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u522a\u9664\u908a */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    adjList[vet] = [];\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    adjList.remove(vet);\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a 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    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\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\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.remove(&vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u9130\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
    /* \u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9802\u9ede\n    struct AdjListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n} AdjListNode;\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\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/* \u65b0\u589e\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u982d\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u522a\u9664\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u641c\u7d22 vet \u5c0d\u61c9\u7bc0\u9ede\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c07 vet \u5c0d\u61c9\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\n    pre->next = cur->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(cur);\n}\n\n/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u7bc0\u9ede\u9663\u5217\n    int size;                     // \u7bc0\u9ede\u6578\u91cf\n} GraphAdjList;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\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/* \u65b0\u589e\u908a */\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    // \u65b0\u589e\u908a vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u522a\u9664\u908a */\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    // \u522a\u9664\u908a vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\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\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    graph->heads[graph->size++] = head;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    // \u5c07\u8a72\u9802\u9ede\u4e4b\u5f8c\u7684\u9802\u9ede\u5411\u524d\u79fb\u52d5\uff0c\u4ee5\u586b\u88dc\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u65b0\u589e\u908a */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    fun print() {\n        println(\"\u9130\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
    [class]{GraphAdjList}-[func]{}\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5c0d\u6bd4","text":"

    \u8a2d\u5716\u4e2d\u5171\u6709 \\(n\\) \u500b\u9802\u9ede\u548c \\(m\\) \u689d\u908a\uff0c\u8868 9-2 \u5c0d\u6bd4\u4e86\u9130\u63a5\u77e9\u9663\u548c\u9130\u63a5\u8868\u7684\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u3002

    \u8868 9-2 \u00a0 \u9130\u63a5\u77e9\u9663\u8207\u9130\u63a5\u8868\u5c0d\u6bd4

    \u9130\u63a5\u77e9\u9663 \u9130\u63a5\u8868\uff08\u93c8\u7d50\u4e32\u5217\uff09 \u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09 \u5224\u65b7\u662f\u5426\u9130\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u908a \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u908a \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u9802\u9ede \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u9802\u9ede \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u8a18\u61b6\u9ad4\u7a7a\u9593\u4f54\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    \u89c0\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09\u7684\u6642\u9593\u6548\u7387\u8207\u7a7a\u9593\u6548\u7387\u6700\u512a\u3002\u4f46\u5be6\u969b\u4e0a\uff0c\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u64cd\u4f5c\u908a\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u9663\u5217\u8a2a\u554f\u6216\u8ce6\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7d9c\u5408\u4f86\u770b\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u7684\u539f\u5247\uff0c\u800c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u7684\u539f\u5247\u3002

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u5716\u7684\u8d70\u8a2a","text":"

    \u6a39\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5c0d\u591a\u201d\u7684\u95dc\u4fc2\uff0c\u800c\u5716\u5247\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5c0d\u591a\u201d\u95dc\u4fc2\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u6a39\u770b\u4f5c\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\u3002\u986f\u7136\uff0c\u6a39\u7684\u8d70\u8a2a\u64cd\u4f5c\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u64cd\u4f5c\u7684\u4e00\u7a2e\u7279\u4f8b\u3002

    \u5716\u548c\u6a39\u90fd\u9700\u8981\u61c9\u7528\u641c\u7d22\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u8d70\u8a2a\u64cd\u4f5c\u3002\u5716\u7684\u8d70\u8a2a\u65b9\u5f0f\u4e5f\u53ef\u5206\u70ba\u5169\u7a2e\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u548c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    "},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u5f9e\u67d0\u500b\u7bc0\u9ede\u51fa\u767c\uff0c\u59cb\u7d42\u512a\u5148\u8a2a\u554f\u8ddd\u96e2\u6700\u8fd1\u7684\u9802\u9ede\uff0c\u4e26\u4e00\u5c64\u5c64\u5411\u5916\u64f4\u5f35\u3002\u5982\u5716 9-9 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u9996\u5148\u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e0b\u4e00\u500b\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8a2a\u554f\u5b8c\u7562\u3002

    \u5716 9-9 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a

    "},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

    BFS \u901a\u5e38\u85c9\u52a9\u4f47\u5217\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\u3002\u4f47\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8cea\uff0c\u9019\u8207 BFS \u7684\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u601d\u60f3\u7570\u66f2\u540c\u5de5\u3002

    1. \u5c07\u8d70\u8a2a\u8d77\u59cb\u9802\u9ede startVet \u52a0\u5165\u5217\u5217\uff0c\u4e26\u958b\u555f\u8ff4\u5708\u3002
    2. \u5728\u8ff4\u5708\u7684\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\uff0c\u5f48\u51fa\u4f47\u5217\u9996\u9802\u9ede\u4e26\u8a18\u9304\u8a2a\u554f\uff0c\u7136\u5f8c\u5c07\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u52a0\u5165\u5230\u4f47\u5217\u5c3e\u90e8\u3002
    3. \u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u76f4\u5230\u6240\u6709\u9802\u9ede\u88ab\u8a2a\u554f\u5b8c\u7562\u5f8c\u7d50\u675f\u3002

    \u70ba\u4e86\u9632\u6b62\u91cd\u8907\u8d70\u8a2a\u9802\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]([start_vet])\n    # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while len(que) > 0:\n        vet = que.popleft()  # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.append(adj_vet)  # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adj_vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n
    graph_bfs.cpp
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited = {startVet};\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push_back(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.push(adjVet);        // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.emplace(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.java
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet);            // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.cs
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [startVet];\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.Add(vet);               // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.Add(adjVet);   // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.go
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS, \u4f7f\u7528\u5207\u7247\u6a21\u64ec\u4f47\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    for len(queue) > 0 {\n        // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        res = append(res, vet)\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.swift
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = [startVet]\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.append(adjVet) // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.insert(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.js
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.ts
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.dart
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      }\n      que.add(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    }\n  }\n  // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  return res;\n}\n
    graph_bfs.rs
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\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\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited.insert(adj_vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res\n}\n
    graph_bfs.c
    /* \u7bc0\u9ede\u4f47\u5217\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u5efa\u69cb\u5b50 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u5217\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\u5217\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/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res[(*resSize)++] = vet;      // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited[(*visitedSize)++] = node->vertex; // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n            node = node->next;\n        }\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(queue);\n}\n
    graph_bfs.kt
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet)         // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet)   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.rb
    [class]{}-[func]{graph_bfs}\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7a0b\u5f0f\u78bc\u76f8\u5c0d\u62bd\u8c61\uff0c\u5efa\u8b70\u5c0d\u7167\u5716 9-10 \u4f86\u52a0\u6df1\u7406\u89e3\u3002

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

    \u5716 9-10 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0d\u552f\u4e00\u3002\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u9806\u5e8f\u8d70\u8a2a\uff0c\u800c\u591a\u500b\u76f8\u540c\u8ddd\u96e2\u7684\u9802\u9ede\u7684\u8d70\u8a2a\u9806\u5e8f\u5141\u8a31\u88ab\u4efb\u610f\u6253\u4e82\u3002\u4ee5\u5716 9-10 \u70ba\u4f8b\uff0c\u9802\u9ede \\(1\\)\u3001\\(3\\) \u7684\u8a2a\u554f\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\uff0c\u9802\u9ede \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8a2a\u554f\u9806\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u63db\u3002

    "},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u5165\u5217\u4e26\u51fa\u968a\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u5728\u8d70\u8a2a\u9130\u63a5\u9802\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u8868 visited \uff0c\u4f47\u5217 que \u4e2d\u7684\u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

    "},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u518d\u56de\u982d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002\u5982\u5716 9-11 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u7576\u524d\u9802\u9ede\u7684\u67d0\u500b\u9130\u63a5\u9802\u9ede\uff0c\u76f4\u5230\u8d70\u5230\u76e1\u982d\u6642\u8fd4\u56de\uff0c\u518d\u7e7c\u7e8c\u8d70\u5230\u76e1\u982d\u4e26\u8fd4\u56de\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8d70\u8a2a\u5b8c\u6210\u3002

    \u5716 9-11 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a

    "},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

    \u9019\u7a2e\u201c\u8d70\u5230\u76e1\u982d\u518d\u8fd4\u56de\u201d\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u5728\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4e2d\uff0c\u6211\u5011\u4e5f\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 visited \u4f86\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\uff0c\u4ee5\u907f\u514d\u91cd\u8907\u8a2a\u554f\u9802\u9ede\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f\"\"\"\n    res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
    graph_dfs.cpp
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.emplace(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.java
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.cs
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.Add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede                             \n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.go
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u6703\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u9808\u8b93\u539f\u5f15\u7528\u91cd\u65b0\u8ce6\u503c\u70ba\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_dfs.swift
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\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\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.ts
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.dart
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    }\n    // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
    graph_dfs.rs
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n                         // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\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\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
    graph_dfs.c
    /* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\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\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    res[(*resSize)++] = vet;\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
    graph_dfs.kt
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
    graph_dfs.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 9-12 \u6240\u793a\u3002

    • \u76f4\u865b\u7dda\u4ee3\u8868\u5411\u4e0b\u905e\u63a8\uff0c\u8868\u793a\u958b\u555f\u4e86\u4e00\u500b\u65b0\u7684\u905e\u8ff4\u65b9\u6cd5\u4f86\u8a2a\u554f\u65b0\u9802\u9ede\u3002
    • \u66f2\u865b\u7dda\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u905e\u8ff4\u65b9\u6cd5\u5df2\u7d93\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u958b\u555f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

    \u70ba\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8b70\u5c07\u5716 9-12 \u8207\u7a0b\u5f0f\u78bc\u7d50\u5408\u8d77\u4f86\uff0c\u5728\u8166\u4e2d\u6a21\u64ec\uff08\u6216\u8005\u7528\u7b46\u756b\u4e0b\u4f86\uff09\u6574\u500b DFS \u904e\u7a0b\uff0c\u5305\u62ec\u6bcf\u500b\u905e\u8ff4\u65b9\u6cd5\u4f55\u6642\u958b\u555f\u3001\u4f55\u6642\u8fd4\u56de\u3002

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

    \u5716 9-12 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5e8f\u5217\u7684\u9806\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7d66\u5b9a\u67d0\u9802\u9ede\uff0c\u5148\u5f80\u54ea\u500b\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u9130\u63a5\u9802\u9ede\u7684\u9806\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e82\uff0c\u90fd\u662f\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    \u4ee5\u6a39\u7684\u8d70\u8a2a\u70ba\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\uff0c\u5b83\u5011\u5c55\u793a\u4e86\u4e09\u7a2e\u8d70\u8a2a\u512a\u5148\u9806\u5e8f\uff0c\u7136\u800c\u9019\u4e09\u8005\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    "},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u88ab\u8a2a\u554f \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u8868 visited \u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u6700\u5927\u70ba \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5716\u7531\u9802\u9ede\u548c\u908a\u7d44\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede\u548c\u4e00\u7d44\u908a\u69cb\u6210\u7684\u96c6\u5408\u3002
    • \u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002
    • \u6709\u5411\u5716\u7684\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u9023\u901a\u5716\u4e2d\u7684\u4efb\u610f\u9802\u9ede\u5747\u53ef\u9054\uff0c\u6709\u6b0a\u5716\u7684\u6bcf\u689d\u908a\u90fd\u5305\u542b\u6b0a\u91cd\u8b8a\u6578\u3002
    • \u9130\u63a5\u77e9\u9663\u5229\u7528\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u6709\u908a\u6216\u7121\u908a\u3002\u9130\u63a5\u77e9\u9663\u5728\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u9593\u4f54\u7528\u8f03\u591a\u3002
    • \u9130\u63a5\u8868\u4f7f\u7528\u591a\u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u3002\u9130\u63a5\u8868\u76f8\u5c0d\u65bc\u9130\u63a5\u77e9\u9663\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\uff0c\u4f46\u7531\u65bc\u9700\u8981\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u6642\u9593\u6548\u7387\u8f03\u4f4e\u3002
    • \u7576\u9130\u63a5\u8868\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u5176\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u6216\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002
    • \u5f9e\u6f14\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff0c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002
    • \u5716\u53ef\u7528\u65bc\u5efa\u6a21\u5404\u985e\u73fe\u5be6\u7cfb\u7d71\uff0c\u5982\u793e\u4ea4\u7db2\u8def\u3001\u5730\u9435\u7dda\u8def\u7b49\u3002
    • \u6a39\u662f\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\uff0c\u6a39\u7684\u8d70\u8a2a\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u7684\u4e00\u7a2e\u7279\u4f8b\u3002
    • \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u3001\u5c64\u5c64\u64f4\u5f35\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u901a\u5e38\u85c9\u52a9\u4f47\u5217\u5be6\u73fe\u3002
    • \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u6642\u518d\u56de\u6eaf\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8def\u5f91\u7684\u5b9a\u7fa9\u662f\u9802\u9ede\u5e8f\u5217\u9084\u662f\u908a\u5e8f\u5217\uff1f

    \u7dad\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8a9e\u8a00\u7248\u672c\u7684\u5b9a\u7fa9\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u908a\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u9802\u9ede\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\u5f91\u88ab\u8996\u70ba\u4e00\u500b\u908a\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u3002\u9019\u662f\u56e0\u70ba\u5169\u500b\u9802\u9ede\u4e4b\u9593\u53ef\u80fd\u5b58\u5728\u591a\u689d\u908a\u9023\u7dda\uff0c\u6b64\u6642\u6bcf\u689d\u908a\u90fd\u5c0d\u61c9\u4e00\u689d\u8def\u5f91\u3002

    Q\uff1a\u975e\u9023\u901a\u5716\u4e2d\u662f\u5426\u6703\u6709\u7121\u6cd5\u8d70\u8a2a\u5230\u7684\u9ede\uff1f

    \u5728\u975e\u9023\u901a\u5716\u4e2d\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002\u8d70\u8a2a\u975e\u9023\u901a\u5716\u9700\u8981\u8a2d\u5b9a\u591a\u500b\u8d77\u9ede\uff0c\u4ee5\u8d70\u8a2a\u5230\u5716\u7684\u6240\u6709\u9023\u901a\u5206\u91cf\u3002

    Q\uff1a\u5728\u9130\u63a5\u8868\u4e2d\uff0c\u201c\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u6240\u6709\u9802\u9ede\u201d\u7684\u9802\u9ede\u9806\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u9806\u5e8f\u3002\u4f46\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u898f\u5247\u4f86\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9802\u9ede\u65b0\u589e\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9802\u9ede\u503c\u5927\u5c0f\u7684\u9806\u5e8f\u7b49\uff0c\u9019\u6a23\u6709\u52a9\u65bc\u5feb\u901f\u67e5\u8a62\u201c\u5e36\u6709\u67d0\u7a2e\u6975\u503c\u201d\u7684\u9802\u9ede\u3002

    "},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8caa\u5a6a","text":"

    Abstract

    \u5411\u65e5\u8475\u671d\u8457\u592a\u967d\u8f49\u52d5\uff0c\u6642\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u9577\u7684\u6700\u5927\u53ef\u80fd\u3002

    \u8caa\u5a6a\u7b56\u7565\u5728\u4e00\u8f2a\u8f2a\u7684\u7c21\u55ae\u9078\u64c7\u4e2d\uff0c\u9010\u6b65\u5c0e\u5411\u6700\u4f73\u7b54\u6848\u3002

    "},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5
    • 15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c
    • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c
    • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c
    • 15.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u50f9\u503c\u6839\u64da\u9078\u64c7\u7684\u91cd\u91cf\u6bd4\u4f8b\u8a08\u7b97\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 15-3 \u6240\u793a\u3002

    \u5716 15-3 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    \u5206\u6578\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u6574\u9ad4\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72c0\u614b\u5305\u542b\u7576\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6a19\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u50f9\u503c\u3002

    \u4e0d\u540c\u9ede\u5728\u65bc\uff0c\u672c\u984c\u5141\u8a31\u53ea\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u5716 15-4 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u7269\u54c1\u4efb\u610f\u5730\u9032\u884c\u5207\u5206\uff0c\u4e26\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u4f86\u8a08\u7b97\u76f8\u61c9\u50f9\u503c\u3002

    1. \u5c0d\u65bc\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c\u70ba \\(val[i-1] / wgt[i-1]\\) \uff0c\u7c21\u7a31\u55ae\u4f4d\u50f9\u503c\u3002
    2. \u5047\u8a2d\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u70ba \\(w\\) \uff0c\u5247\u80cc\u5305\u589e\u52a0\u7684\u50f9\u503c\u70ba \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

    \u5716 15-4 \u00a0 \u7269\u54c1\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u6700\u5927\u5316\u80cc\u5305\u5167\u7269\u54c1\u7e3d\u50f9\u503c\uff0c\u672c\u8cea\u4e0a\u662f\u6700\u5927\u5316\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u50f9\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u5716 15-5 \u6240\u793a\u7684\u8caa\u5a6a\u7b56\u7565\u3002

    1. \u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\u3002
    2. \u8d70\u8a2a\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f2a\u8caa\u5a6a\u5730\u9078\u64c7\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
    3. \u82e5\u5269\u9918\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u4f7f\u7528\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6eff\u80cc\u5305\u3002

    \u5716 15-5 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u6211\u5011\u5efa\u7acb\u4e86\u4e00\u500b\u7269\u54c1\u985e\u5225 Item \uff0c\u4ee5\u4fbf\u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u9032\u884c\u6392\u5e8f\u3002\u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u7576\u80cc\u5305\u5df2\u6eff\u6642\u8df3\u51fa\u4e26\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\u50f9\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a\"\"\"\n    # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n} Item;\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\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\u50f9\u503c\n)\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.rb
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
    fractional_knapsack.zig
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u9700\u8981\u8d70\u8a2a\u6574\u500b\u7269\u54c1\u4e32\u5217\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u7269\u54c1\u6578\u91cf\u3002

    \u7531\u65bc\u521d\u59cb\u5316\u4e86\u4e00\u500b Item \u7269\u4ef6\u4e32\u5217\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u63a1\u7528\u53cd\u8b49\u6cd5\u3002\u5047\u8a2d\u7269\u54c1 \\(x\\) \u662f\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u6f14\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u50f9\u503c\u70ba res \uff0c\u4f46\u8a72\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u73fe\u5728\u5f9e\u80cc\u5305\u4e2d\u62ff\u51fa\u55ae\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u4e26\u66ff\u63db\u70ba\u55ae\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u65bc\u7269\u54c1 \\(x\\) \u7684\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u63db\u5f8c\u7684\u7e3d\u50f9\u503c\u4e00\u5b9a\u5927\u65bc res \u3002\u9019\u8207 res \u662f\u6700\u512a\u89e3\u77db\u76fe\uff0c\u8aaa\u660e\u6700\u512a\u89e3\u4e2d\u5fc5\u9808\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u5c0d\u65bc\u8a72\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u69cb\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u7e3d\u800c\u8a00\u4e4b\uff0c\u55ae\u4f4d\u50f9\u503c\u66f4\u5927\u7684\u7269\u54c1\u7e3d\u662f\u66f4\u512a\u9078\u64c7\uff0c\u9019\u8aaa\u660e\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    \u5982\u5716 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c07\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u55ae\u4f4d\u50f9\u503c\u5206\u5225\u770b\u4f5c\u4e00\u5f35\u4e8c\u7dad\u5716\u8868\u7684\u6a6b\u8ef8\u548c\u7e31\u8ef8\uff0c\u5247\u5206\u6578\u80cc\u5305\u554f\u984c\u53ef\u8f49\u5316\u70ba\u201c\u6c42\u5728\u6709\u9650\u6a6b\u8ef8\u5340\u9593\u4e0b\u570d\u6210\u7684\u6700\u5927\u9762\u7a4d\u201d\u3002\u9019\u500b\u985e\u6bd4\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u5f9e\u5e7e\u4f55\u89d2\u5ea6\u7406\u89e3\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

    \u5716 15-6 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u5e7e\u4f55\u8868\u793a

    "},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u7684\u6f14\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u554f\u984c\u7684\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\uff0c\u90fd\u9078\u64c7\u7576\u524d\u770b\u8d77\u4f86\u6700\u512a\u7684\u9078\u64c7\uff0c\u5373\u8caa\u5a6a\u5730\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7c21\u6f54\u4e14\u9ad8\u6548\uff0c\u5728\u8a31\u591a\u5be6\u969b\u554f\u984c\u4e2d\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\u3002

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u548c\u52d5\u614b\u898f\u5283\u90fd\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u3002\u5b83\u5011\u4e4b\u9593\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u8655\uff0c\u6bd4\u5982\u90fd\u4f9d\u8cf4\u6700\u512a\u5b50\u7d50\u69cb\u6027\u8cea\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

    • \u52d5\u614b\u898f\u5283\u6703\u6839\u64da\u4e4b\u524d\u968e\u6bb5\u7684\u6240\u6709\u6c7a\u7b56\u4f86\u8003\u616e\u7576\u524d\u6c7a\u7b56\uff0c\u4e26\u4f7f\u7528\u904e\u53bb\u5b50\u554f\u984c\u7684\u89e3\u4f86\u69cb\u5efa\u7576\u524d\u5b50\u554f\u984c\u7684\u89e3\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u6703\u8003\u616e\u904e\u53bb\u7684\u6c7a\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u4e0d\u65b7\u7e2e\u5c0f\u554f\u984c\u7bc4\u570d\uff0c\u76f4\u81f3\u554f\u984c\u88ab\u89e3\u6c7a\u3002

    \u6211\u5011\u5148\u900f\u904e\u4f8b\u984c\u201c\u96f6\u9322\u514c\u63db\u201d\u77ad\u89e3\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u9019\u9053\u984c\u5df2\u7d93\u5728\u201c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u76f8\u4fe1\u4f60\u5c0d\u5b83\u4e26\u4e0d\u964c\u751f\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

    \u672c\u984c\u63a1\u53d6\u7684\u8caa\u5a6a\u7b56\u7565\u5982\u5716 15-1 \u6240\u793a\u3002\u7d66\u5b9a\u76ee\u6a19\u91d1\u984d\uff0c\u6211\u5011\u8caa\u5a6a\u5730\u9078\u64c7\u4e0d\u5927\u65bc\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e63\uff0c\u4e0d\u65b7\u8ff4\u5708\u8a72\u6b65\u9a5f\uff0c\u76f4\u81f3\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u70ba\u6b62\u3002

    \u5716 15-1 \u00a0 \u96f6\u9322\u514c\u63db\u7684\u8caa\u5a6a\u7b56\u7565

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a\"\"\"\n    # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
    coin_change_greedy.cpp
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.java
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.cs
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.go
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
    coin_change_greedy.swift
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
    coin_change_greedy.js
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.ts
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.dart
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9078\u64c7 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.rs
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
    coin_change_greedy.c
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.kt
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
    coin_change_greedy.rb
    [class]{}-[func]{coin_change_greedy}\n
    coin_change_greedy.zig
    [class]{}-[func]{coinChangeGreedy}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u4f60\u53ef\u80fd\u6703\u4e0d\u7531\u5730\u767c\u51fa\u611f\u5606\uff1aSo clean \uff01\u8caa\u5a6a\u6f14\u7b97\u6cd5\u50c5\u7528\u7d04\u5341\u884c\u7a0b\u5f0f\u78bc\u5c31\u89e3\u6c7a\u4e86\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u64cd\u4f5c\u76f4\u63a5\u3001\u5be6\u73fe\u7c21\u55ae\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8a18\u786c\u5e63\u6700\u5c0f\u9762\u503c\u70ba \\(\\min(coins)\\) \uff0c\u5247\u8caa\u5a6a\u9078\u64c7\u6700\u591a\u8ff4\u5708 \\(amt / \\min(coins)\\) \u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(amt / \\min(coins))\\) \u3002\u9019\u6bd4\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u500b\u6578\u91cf\u7d1a\u3002

    \u7136\u800c\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u9762\u503c\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u80fd\u627e\u5230\u6700\u512a\u89e3\u3002\u5716 15-2 \u7d66\u51fa\u4e86\u5169\u500b\u793a\u4f8b\u3002

    • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8a72\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u7d66\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3\u3002
    • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8a2d \\(amt = 60\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(11\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(20 + 20 + 20\\) \uff0c\u50c5\u9700 \\(3\\) \u679a\u786c\u5e63\u3002
    • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8a2d \\(amt = 98\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(49\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(49 + 49\\) \uff0c\u50c5\u9700 \\(2\\) \u679a\u786c\u5e63\u3002

    \u5716 15-2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u627e\u51fa\u6700\u512a\u89e3\u7684\u793a\u4f8b

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5c0d\u65bc\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u4fdd\u8b49\u627e\u5230\u5168\u57df\u6027\u6700\u512a\u89e3\uff0c\u4e26\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\u3002

    \u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u9069\u7528\u60c5\u6cc1\u5206\u4ee5\u4e0b\u5169\u7a2e\u3002

    1. \u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u5f80\u5f80\u662f\u6700\u512a\u9078\u64c7\uff0c\u56e0\u70ba\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u66f4\u9ad8\u6548\u3002
    2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5c0d\u65bc\u5f88\u591a\u8907\u96dc\u554f\u984c\u4f86\u8aaa\uff0c\u5c0b\u627e\u5168\u57df\u6027\u6700\u512a\u89e3\u975e\u5e38\u56f0\u96e3\uff0c\u80fd\u4ee5\u8f03\u9ad8\u6548\u7387\u627e\u5230\u6b21\u512a\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u932f\u7684\u3002
    "},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u90a3\u9ebc\u554f\u984c\u4f86\u4e86\uff0c\u4ec0\u9ebc\u6a23\u7684\u554f\u984c\u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8aaa\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1f

    \u76f8\u8f03\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u4f7f\u7528\u689d\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u95dc\u6ce8\u554f\u984c\u7684\u5169\u500b\u6027\u8cea\u3002

    • \u8caa\u5a6a\u9078\u64c7\u6027\u8cea\uff1a\u53ea\u6709\u7576\u5c40\u90e8\u6700\u512a\u9078\u64c7\u59cb\u7d42\u53ef\u4ee5\u5c0e\u81f4\u5168\u57df\u6027\u6700\u512a\u89e3\u6642\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u624d\u80fd\u4fdd\u8b49\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u6700\u512a\u5b50\u7d50\u69cb\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u5305\u542b\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u3002

    \u6700\u512a\u5b50\u7d50\u69cb\u5df2\u7d93\u5728\u201c\u52d5\u614b\u898f\u5283\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u9019\u88e1\u4e0d\u518d\u8d05\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u554f\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\u4e26\u4e0d\u660e\u986f\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u6c7a\u3002

    \u6211\u5011\u4e3b\u8981\u63a2\u7a76\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u5224\u65b7\u65b9\u6cd5\u3002\u96d6\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f03\u7c21\u55ae\uff0c\u4f46\u5be6\u969b\u4e0a\u5c0d\u65bc\u8a31\u591a\u554f\u984c\uff0c\u8b49\u660e\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4e26\u975e\u6613\u4e8b\u3002

    \u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u6211\u5011\u96d6\u7136\u80fd\u5920\u5bb9\u6613\u5730\u8209\u51fa\u53cd\u4f8b\uff0c\u5c0d\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u9032\u884c\u8b49\u507d\uff0c\u4f46\u8b49\u5be6\u7684\u96e3\u5ea6\u8f03\u5927\u3002\u5982\u679c\u554f\uff1a\u6eff\u8db3\u4ec0\u9ebc\u689d\u4ef6\u7684\u786c\u5e63\u7d44\u5408\u53ef\u4ee5\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u5011\u5f80\u5f80\u53ea\u80fd\u6191\u85c9\u76f4\u89ba\u6216\u8209\u4f8b\u5b50\u4f86\u7d66\u51fa\u4e00\u500b\u6a21\u7a1c\u5169\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96e3\u4ee5\u7d66\u51fa\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\u3002

    Quote

    \u6709\u4e00\u7bc7\u8ad6\u6587\u7d66\u51fa\u4e86\u4e00\u500b \\(O(n^3)\\) \u6642\u9593\u8907\u96dc\u5ea6\u7684\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u5224\u65b7\u4e00\u500b\u786c\u5e63\u7d44\u5408\u80fd\u5426\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u984d\u7684\u6700\u512a\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 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u984c\u6b65\u9a5f","text":"

    \u8caa\u5a6a\u554f\u984c\u7684\u89e3\u6c7a\u6d41\u7a0b\u5927\u9ad4\u53ef\u5206\u70ba\u4ee5\u4e0b\u4e09\u6b65\u3002

    1. \u554f\u984c\u5206\u6790\uff1a\u68b3\u7406\u8207\u7406\u89e3\u554f\u984c\u7279\u6027\uff0c\u5305\u62ec\u72c0\u614b\u5b9a\u7fa9\u3001\u6700\u4f73\u5316\u76ee\u6a19\u548c\u7d04\u675f\u689d\u4ef6\u7b49\u3002\u9019\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52d5\u614b\u898f\u5283\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
    2. \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\uff1a\u78ba\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8caa\u5a6a\u9078\u64c7\u3002\u9019\u500b\u7b56\u7565\u80fd\u5920\u5728\u6bcf\u4e00\u6b65\u6e1b\u5c0f\u554f\u984c\u7684\u898f\u6a21\uff0c\u4e26\u6700\u7d42\u89e3\u6c7a\u6574\u500b\u554f\u984c\u3002
    3. \u6b63\u78ba\u6027\u8b49\u660e\uff1a\u901a\u5e38\u9700\u8981\u8b49\u660e\u554f\u984c\u5177\u6709\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u9019\u500b\u6b65\u9a5f\u53ef\u80fd\u9700\u8981\u7528\u5230\u6578\u5b78\u8b49\u660e\uff0c\u4f8b\u5982\u6b78\u7d0d\u6cd5\u6216\u53cd\u8b49\u6cd5\u7b49\u3002

    \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6c42\u89e3\u554f\u984c\u7684\u6838\u5fc3\u6b65\u9a5f\uff0c\u4f46\u5be6\u65bd\u8d77\u4f86\u53ef\u80fd\u4e26\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e0d\u540c\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565\u7684\u5dee\u7570\u8f03\u5927\u3002\u5c0d\u65bc\u8a31\u591a\u554f\u984c\u4f86\u8aaa\uff0c\u8caa\u5a6a\u7b56\u7565\u6bd4\u8f03\u6dfa\u986f\uff0c\u6211\u5011\u900f\u904e\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u8207\u5617\u8a66\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5c0d\u65bc\u4e00\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u96b1\u853d\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u975e\u5e38\u8003\u9a57\u500b\u4eba\u7684\u89e3\u984c\u7d93\u9a57\u8207\u6f14\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
    • \u67d0\u4e9b\u8caa\u5a6a\u7b56\u7565\u5177\u6709\u8f03\u5f37\u7684\u8ff7\u60d1\u6027\u3002\u7576\u6211\u5011\u6eff\u61f7\u4fe1\u5fc3\u8a2d\u8a08\u597d\u8caa\u5a6a\u7b56\u7565\uff0c\u5beb\u51fa\u89e3\u984c\u7a0b\u5f0f\u78bc\u4e26\u63d0\u4ea4\u57f7\u884c\uff0c\u5f88\u53ef\u80fd\u767c\u73fe\u90e8\u5206\u6e2c\u8a66\u6a23\u4f8b\u7121\u6cd5\u900f\u904e\u3002\u9019\u662f\u56e0\u70ba\u8a2d\u8a08\u7684\u8caa\u5a6a\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u78ba\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7d39\u7684\u96f6\u9322\u514c\u63db\u5c31\u662f\u4e00\u500b\u5178\u578b\u6848\u4f8b\u3002

    \u70ba\u4e86\u4fdd\u8b49\u6b63\u78ba\u6027\uff0c\u6211\u5011\u61c9\u8a72\u5c0d\u8caa\u5a6a\u7b56\u7565\u9032\u884c\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8b49\u6cd5\u6216\u6578\u5b78\u6b78\u7d0d\u6cd5\u3002

    \u7136\u800c\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6c92\u6709\u982d\u7dd2\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u9762\u5411\u6e2c\u8a66\u7528\u4f8b\u9032\u884c\u7a0b\u5f0f\u78bc\u9664\u932f\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u8207\u9a57\u8b49\u8caa\u5a6a\u7b56\u7565\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5178\u578b\u4f8b\u984c","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5e38\u5e38\u61c9\u7528\u5728\u6eff\u8db3\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u6700\u4f73\u5316\u554f\u984c\u4e2d\uff0c\u4ee5\u4e0b\u5217\u8209\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u554f\u984c\u3002

    • \u786c\u5e63\u627e\u96f6\u554f\u984c\uff1a\u5728\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7e3d\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u5340\u9593\u6392\u7a0b\u554f\u984c\uff1a\u5047\u8a2d\u4f60\u6709\u4e00\u4e9b\u4efb\u52d9\uff0c\u6bcf\u500b\u4efb\u52d9\u5728\u4e00\u6bb5\u6642\u9593\u5167\u9032\u884c\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u5b8c\u6210\u5118\u53ef\u80fd\u591a\u7684\u4efb\u52d9\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u7d50\u675f\u6642\u9593\u6700\u65e9\u7684\u4efb\u52d9\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u5206\u6578\u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u8f09\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u9078\u64c7\u4e00\u7d44\u7269\u54c1\uff0c\u4f7f\u5f97\u7e3d\u91cd\u91cf\u4e0d\u8d85\u904e\u8f09\u91cd\u91cf\uff0c\u4e14\u7e3d\u50f9\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u50f9\u6548\u6bd4\u6700\u9ad8\uff08\u50f9\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u80a1\u7968\u8cb7\u8ce3\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u80a1\u7968\u7684\u6b77\u53f2\u50f9\u683c\uff0c\u4f60\u53ef\u4ee5\u9032\u884c\u591a\u6b21\u8cb7\u8ce3\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7d93\u6301\u6709\u80a1\u7968\uff0c\u90a3\u9ebc\u5728\u8ce3\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u8cb7\uff0c\u76ee\u6a19\u662f\u7372\u53d6\u6700\u5927\u5229\u6f64\u3002
    • \u970d\u592b\u66fc\u7de8\u78bc\uff1a\u970d\u592b\u66fc\u7de8\u78bc\u662f\u4e00\u7a2e\u7528\u65bc\u7121\u640d\u8cc7\u6599\u58d3\u7e2e\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002\u900f\u904e\u69cb\u5efa\u970d\u592b\u66fc\u6a39\uff0c\u6bcf\u6b21\u9078\u64c7\u51fa\u73fe\u983b\u7387\u6700\u4f4e\u7684\u5169\u500b\u7bc0\u9ede\u5408\u4f75\uff0c\u6700\u5f8c\u5f97\u5230\u7684\u970d\u592b\u66fc\u6a39\u7684\u5e36\u6b0a\u8def\u5f91\u9577\u5ea6\uff08\u7de8\u78bc\u9577\u5ea6\uff09\u6700\u5c0f\u3002
    • Dijkstra \u6f14\u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u7a2e\u89e3\u6c7a\u7d66\u5b9a\u6e90\u9802\u9ede\u5230\u5176\u9918\u5404\u9802\u9ede\u7684\u6700\u77ed\u8def\u5f91\u554f\u984c\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002
    "},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c","text":"

    Question

    \u8f38\u5165\u4e00\u500b\u9663\u5217 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u4ee3\u8868\u4e00\u500b\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u5011\u4e4b\u9593\u7684\u7a7a\u9593\u53ef\u4ee5\u7d44\u6210\u4e00\u500b\u5bb9\u5668\u3002

    \u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u548c\u5bec\u5ea6\u7684\u4e58\u7a4d\uff08\u9762\u7a4d\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f03\u77ed\u7684\u9694\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u500b\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002

    \u8acb\u5728\u9663\u5217\u4e2d\u9078\u64c7\u5169\u500b\u9694\u677f\uff0c\u4f7f\u5f97\u7d44\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u5716 15-7 \u6240\u793a\u3002

    \u5716 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    \u5bb9\u5668\u7531\u4efb\u610f\u5169\u500b\u9694\u677f\u570d\u6210\uff0c\u56e0\u6b64\u672c\u984c\u7684\u72c0\u614b\u70ba\u5169\u500b\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u6839\u64da\u984c\u610f\uff0c\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u4e58\u4ee5\u5bec\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002\u8a2d\u5bb9\u91cf\u70ba \\(cap[i, j]\\) \uff0c\u5247\u53ef\u5f97\u8a08\u7b97\u516c\u5f0f\uff1a

    \\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

    \u8a2d\u9663\u5217\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5169\u500b\u9694\u677f\u7684\u7d44\u5408\u6578\u91cf\uff08\u72c0\u614b\u7e3d\u6578\uff09\u70ba \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u500b\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u7aae\u8209\u6240\u6709\u72c0\u614b\uff0c\u5f9e\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u9019\u9053\u984c\u9084\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u5716 15-8 \u6240\u793a\uff0c\u73fe\u9078\u53d6\u4e00\u500b\u72c0\u614b \\([i, j]\\) \uff0c\u5176\u6eff\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002

    \u5716 15-8 \u00a0 \u521d\u59cb\u72c0\u614b

    \u5982\u5716 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u6642\u5c07\u9577\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5247\u5bb9\u91cf\u4e00\u5b9a\u8b8a\u5c0f\u3002

    \u9019\u662f\u56e0\u70ba\u5728\u79fb\u52d5\u9577\u677f \\(j\\) \u5f8c\uff0c\u5bec\u5ea6 \\(j-i\\) \u80af\u5b9a\u8b8a\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u8b8a\uff08 \\(i\\) \u4ecd\u70ba\u77ed\u677f\uff09\u6216\u8b8a\u5c0f\uff08\u79fb\u52d5\u5f8c\u7684 \\(j\\) \u6210\u70ba\u77ed\u677f\uff09\u3002

    \u5716 15-9 \u00a0 \u5411\u5167\u79fb\u52d5\u9577\u677f\u5f8c\u7684\u72c0\u614b

    \u53cd\u5411\u601d\u8003\uff0c\u6211\u5011\u53ea\u6709\u5411\u5167\u6536\u7e2e\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u8b8a\u5927\u3002\u56e0\u70ba\u96d6\u7136\u5bec\u5ea6\u4e00\u5b9a\u8b8a\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u6703\u8b8a\u5927\uff08\u79fb\u52d5\u5f8c\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u6703\u8b8a\u9577\uff09\u3002\u4f8b\u5982\u5728\u5716 15-10 \u4e2d\uff0c\u79fb\u52d5\u77ed\u677f\u5f8c\u9762\u7a4d\u8b8a\u5927\u3002

    \u5716 15-10 \u00a0 \u5411\u5167\u79fb\u52d5\u77ed\u677f\u5f8c\u7684\u72c0\u614b

    \u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u984c\u7684\u8caa\u5a6a\u7b56\u7565\uff1a\u521d\u59cb\u5316\u5169\u6307\u6a19\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u5169\u7aef\uff0c\u6bcf\u8f2a\u5411\u5167\u6536\u7e2e\u77ed\u677f\u5c0d\u61c9\u7684\u6307\u6a19\uff0c\u76f4\u81f3\u5169\u6307\u6a19\u76f8\u9047\u3002

    \u5716 15-11 \u5c55\u793a\u4e86\u8caa\u5a6a\u7b56\u7565\u7684\u57f7\u884c\u904e\u7a0b\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5217\u9663\u5217\u5169\u7aef\u3002
    2. \u8a08\u7b97\u7576\u524d\u72c0\u614b\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u4e26\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
    3. \u6bd4\u8f03\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u4e26\u5c07\u77ed\u677f\u5411\u5167\u79fb\u52d5\u4e00\u683c\u3002
    4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u6642\u7d50\u675f\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u8caa\u5a6a\u904e\u7a0b

    "},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u7a0b\u5f0f\u78bc\u8ff4\u5708\u6700\u591a \\(n\\) \u8f2a\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u8b8a\u6578 \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
    def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res = 0\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res := 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  int res = 0;\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let mut res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.rb
    [class]{}-[func]{max_capacity}\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u4e4b\u6240\u4ee5\u8caa\u5a6a\u6bd4\u7aae\u8209\u66f4\u5feb\uff0c\u662f\u56e0\u70ba\u6bcf\u8f2a\u7684\u8caa\u5a6a\u9078\u64c7\u90fd\u6703\u201c\u8df3\u904e\u201d\u4e00\u4e9b\u72c0\u614b\u3002

    \u6bd4\u5982\u5728\u72c0\u614b \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002\u82e5\u8caa\u5a6a\u5730\u5c07\u77ed\u677f \\(i\\) \u5411\u5167\u79fb\u52d5\u4e00\u683c\uff0c\u6703\u5c0e\u81f4\u5716 15-12 \u6240\u793a\u7684\u72c0\u614b\u88ab\u201c\u8df3\u904e\u201d\u3002\u9019\u610f\u5473\u8457\u4e4b\u5f8c\u7121\u6cd5\u9a57\u8b49\u9019\u4e9b\u72c0\u614b\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

    \\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

    \u5716 15-12 \u00a0 \u79fb\u52d5\u77ed\u677f\u5c0e\u81f4\u88ab\u8df3\u904e\u7684\u72c0\u614b

    \u89c0\u5bdf\u767c\u73fe\uff0c\u9019\u4e9b\u88ab\u8df3\u904e\u7684\u72c0\u614b\u5be6\u969b\u4e0a\u5c31\u662f\u5c07\u9577\u677f \\(j\\) \u5411\u5167\u79fb\u52d5\u7684\u6240\u6709\u72c0\u614b\u3002\u524d\u9762\u6211\u5011\u5df2\u7d93\u8b49\u660e\u5167\u79fb\u9577\u677f\u4e00\u5b9a\u6703\u5c0e\u81f4\u5bb9\u91cf\u8b8a\u5c0f\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u88ab\u8df3\u904e\u7684\u72c0\u614b\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u512a\u89e3\uff0c\u8df3\u904e\u5b83\u5011\u4e0d\u6703\u5c0e\u81f4\u932f\u904e\u6700\u512a\u89e3\u3002

    \u4ee5\u4e0a\u5206\u6790\u8aaa\u660e\uff0c\u79fb\u52d5\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5c07\u5176\u5207\u5206\u70ba\u81f3\u5c11\u5169\u500b\u6b63\u6574\u6578\u7684\u548c\uff0c\u6c42\u5207\u5206\u5f8c\u6240\u6709\u6574\u6578\u7684\u4e58\u7a4d\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u5716 15-13 \u6240\u793a\u3002

    \u5716 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u554f\u984c\u5b9a\u7fa9

    \u5047\u8a2d\u6211\u5011\u5c07 \\(n\\) \u5207\u5206\u70ba \\(m\\) \u500b\u6574\u6578\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u500b\u56e0\u5b50\u8a18\u70ba \\(n_i\\) \uff0c\u5373

    \\[ n = \\sum_{i=1}^{m}n_i \\]

    \u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u5f97\u6240\u6709\u6574\u6578\u56e0\u5b50\u7684\u6700\u5927\u4e58\u7a4d\uff0c\u5373

    \\[ \\max(\\prod_{i=1}^{m}n_i) \\]

    \u6211\u5011\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6578\u91cf \\(m\\) \u61c9\u8a72\u591a\u5927\uff0c\u6bcf\u500b \\(n_i\\) \u61c9\u8a72\u662f\u591a\u5c11\uff1f

    "},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u6839\u64da\u7d93\u9a57\uff0c\u5169\u500b\u6574\u6578\u7684\u4e58\u7a4d\u5f80\u5f80\u6bd4\u5b83\u5011\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8a2d\u5f9e \\(n\\) \u4e2d\u5206\u51fa\u4e00\u500b\u56e0\u5b50 \\(2\\) \uff0c\u5247\u5b83\u5011\u7684\u4e58\u7a4d\u70ba \\(2(n-2)\\) \u3002\u6211\u5011\u5c07\u8a72\u4e58\u7a4d\u8207 \\(n\\) \u4f5c\u6bd4\u8f03\uff1a

    \\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

    \u5982\u5716 15-14 \u6240\u793a\uff0c\u7576 \\(n \\geq 4\\) \u6642\uff0c\u5207\u5206\u51fa\u4e00\u500b \\(2\\) \u5f8c\u4e58\u7a4d\u6703\u8b8a\u5927\uff0c\u9019\u8aaa\u660e\u5927\u65bc\u7b49\u65bc \\(4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u88ab\u5207\u5206\u3002

    \u8caa\u5a6a\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u9ebc\u5b83\u5c31\u61c9\u8a72\u88ab\u7e7c\u7e8c\u5207\u5206\u3002\u6700\u7d42\u7684\u5207\u5206\u65b9\u6848\u53ea\u61c9\u51fa\u73fe \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u7a2e\u56e0\u5b50\u3002

    \u5716 15-14 \u00a0 \u5207\u5206\u5c0e\u81f4\u4e58\u7a4d\u8b8a\u5927

    \u63a5\u4e0b\u4f86\u601d\u8003\u54ea\u500b\u56e0\u5b50\u662f\u6700\u512a\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u500b\u56e0\u5b50\u4e2d\uff0c\u986f\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u70ba \\(1 \\times (n-1) < n\\) \u6046\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u6703\u5c0e\u81f4\u4e58\u7a4d\u6e1b\u5c0f\u3002

    \u5982\u5716 15-15 \u6240\u793a\uff0c\u7576 \\(n = 6\\) \u6642\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u9019\u610f\u5473\u8457\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u512a\u3002

    \u8caa\u5a6a\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u96bb\u61c9\u5b58\u5728\u5169\u500b \\(2\\) \u3002\u56e0\u70ba\u4e09\u500b \\(2\\) \u7e3d\u662f\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002

    \u5716 15-15 \u00a0 \u6700\u512a\u5207\u5206\u56e0\u5b50

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8caa\u5a6a\u7b56\u7565\u3002

    1. \u8f38\u5165\u6574\u6578 \\(n\\) \uff0c\u5f9e\u5176\u4e0d\u65b7\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u9918\u6578\u70ba \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
    2. \u7576\u9918\u6578\u70ba \\(0\\) \u6642\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6578\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u8655\u7406\u3002
    3. \u7576\u9918\u6578\u70ba \\(2\\) \u6642\uff0c\u4e0d\u7e7c\u7e8c\u5283\u5206\uff0c\u4fdd\u7559\u3002
    4. \u7576\u9918\u6578\u70ba \\(1\\) \u6642\uff0c\u7531\u65bc \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u61c9\u5c07\u6700\u5f8c\u4e00\u500b \\(3\\) \u66ff\u63db\u70ba \\(2\\) \u3002
    "},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5982\u5716 15-16 \u6240\u793a\uff0c\u6211\u5011\u7121\u9808\u900f\u904e\u8ff4\u5708\u4f86\u5207\u5206\u6574\u6578\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u904b\u7b97\u5f97\u5230 \\(3\\) \u7684\u500b\u6578 \\(a\\) \uff0c\u7528\u53d6\u6a21\u904b\u7b97\u5f97\u5230\u9918\u6578 \\(b\\) \uff0c\u6b64\u6642\u6709\uff1a

    \\[ n = 3 a + b \\]

    \u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc \\(n \\leq 3\\) \u7684\u908a\u754c\u60c5\u6cc1\uff0c\u5fc5\u9808\u62c6\u5206\u51fa\u4e00\u500b \\(1\\) \uff0c\u4e58\u7a4d\u70ba \\(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\u7a4d\uff1a\u8caa\u5a6a\"\"\"\n    # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.pow(3, a)) * 2\n    # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.pow(3, a))\n
    max_product_cutting.cpp
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)pow(3, a);\n}\n
    max_product_cutting.java
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int) Math.pow(3, a);\n}\n
    max_product_cutting.cs
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint MaxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)Math.Pow(3, a);\n}\n
    max_product_cutting.go
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n int) int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
    max_product_cutting.swift
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a)\n}\n
    max_product_cutting.js
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.ts
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n: number): number {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.dart
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n  // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return pow(3, a).toInt();\n}\n
    max_product_cutting.rs
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
    max_product_cutting.c
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a);\n}\n
    max_product_cutting.kt
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfun maxProductCutting(n: Int): Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return 3.0.pow(a).toInt()\n}\n
    max_product_cutting.rb
    [class]{}-[func]{max_product_cutting}\n
    max_product_cutting.zig
    [class]{}-[func]{maxProductCutting}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u8a08\u7b97\u65b9\u6cd5

    \u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u51aa\u904b\u7b97\u7684\u5be6\u73fe\u65b9\u6cd5\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5e38\u7528\u7684\u51aa\u8a08\u7b97\u51fd\u5f0f\u6709\u4e09\u7a2e\u3002

    • \u904b\u7b97\u5b50 ** \u548c\u51fd\u5f0f pow() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log\u2061 a)\\) \u3002
    • \u51fd\u5f0f math.pow() \u5167\u90e8\u547c\u53eb C \u8a9e\u8a00\u5eab\u7684 pow() \u51fd\u5f0f\uff0c\u5176\u57f7\u884c\u6d6e\u9ede\u53d6\u51aa\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    \u8b8a\u6578 \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u4f7f\u7528\u53cd\u8b49\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u6cc1\u3002

    1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u5c07\u5176\u7e7c\u7e8c\u5283\u5206\u70ba \\(2(x-2)\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u500b\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u9ebc\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u4f75\u5165\u53e6\u5916\u4e00\u500b\u56e0\u5b50\u4e2d\uff0c\u4ee5\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u5169\u500b \\(2\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u500b \\(2\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u4e58\u7a4d\u66f4\u5927\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    "},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7d50","text":"
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u901a\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\u90fd\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u6703\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u500b\u53c8\u4e00\u500b\u7684\u8caa\u5a6a\u9078\u64c7\uff0c\u6bcf\u8f2a\u90fd\u5c07\u554f\u984c\u8f49\u5316\u6210\u4e00\u500b\u898f\u6a21\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u554f\u984c\u88ab\u89e3\u6c7a\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u5be6\u73fe\u7c21\u55ae\uff0c\u9084\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u984c\u6548\u7387\u3002\u76f8\u6bd4\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
    • \u5728\u96f6\u9322\u514c\u63db\u554f\u984c\u4e2d\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1b\u5c0d\u65bc\u53e6\u5916\u4e00\u4e9b\u786c\u5e63\u7d44\u5408\u5247\u4e0d\u7136\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
    • \u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u7684\u554f\u984c\u5177\u6709\u5169\u5927\u6027\u8cea\uff1a\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4ee3\u8868\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
    • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u8b49\u660e\u4e26\u4e0d\u7c21\u55ae\u3002\u76f8\u5c0d\u4f86\u8aaa\uff0c\u8b49\u507d\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002
    • \u6c42\u89e3\u8caa\u5a6a\u554f\u984c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\uff1a\u554f\u984c\u5206\u6790\u3001\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u3001\u6b63\u78ba\u6027\u8b49\u660e\u3002\u5176\u4e2d\uff0c\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9a5f\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u5f80\u5f80\u662f\u96e3\u9ede\u3002
    • \u5206\u6578\u80cc\u5305\u554f\u984c\u5728 0-1 \u80cc\u5305\u7684\u57fa\u790e\u4e0a\uff0c\u5141\u8a31\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u3002\u8caa\u5a6a\u7b56\u7565\u7684\u6b63\u78ba\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\u3002
    • \u6700\u5927\u5bb9\u91cf\u554f\u984c\u53ef\u4f7f\u7528\u7aae\u8209\u6cd5\u6c42\u89e3\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u900f\u904e\u8a2d\u8a08\u8caa\u5a6a\u7b56\u7565\uff0c\u6bcf\u8f2a\u5411\u5167\u79fb\u52d5\u77ed\u677f\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \u3002
    • \u5728\u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u63a8\u7406\u51fa\u5169\u500b\u8caa\u5a6a\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u7e7c\u7e8c\u5207\u5206\uff0c\u6700\u512a\u5207\u5206\u56e0\u5b50\u70ba \\(3\\) \u3002\u7a0b\u5f0f\u78bc\u4e2d\u5305\u542b\u51aa\u904b\u7b97\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u51aa\u904b\u7b97\u5be6\u73fe\u65b9\u6cd5\uff0c\u901a\u5e38\u70ba \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
    "},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u96dc\u6e4a\u8868","text":"

    Abstract

    \u5728\u8a08\u7b97\u6a5f\u4e16\u754c\u4e2d\uff0c\u96dc\u6e4a\u8868\u5982\u540c\u4e00\u4f4d\u8070\u6167\u7684\u5716\u66f8\u7ba1\u7406\u54e1\u3002

    \u4ed6\u77e5\u9053\u5982\u4f55\u8a08\u7b97\u7d22\u66f8\u865f\uff0c\u5f9e\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6a19\u5716\u66f8\u3002

    "},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 6.1 \u00a0 \u96dc\u6e4a\u8868
    • 6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81
    • 6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5
    • 6.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

    \u524d\u5169\u7bc0\u4ecb\u7d39\u4e86\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u96dc\u6e4a\u885d\u7a81\u7684\u8655\u7406\u65b9\u6cd5\u3002\u7136\u800c\u7121\u8ad6\u662f\u958b\u653e\u5b9a\u5740\u9084\u662f\u93c8\u5f0f\u4f4d\u5740\uff0c\u5b83\u5011\u53ea\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u767c\u751f\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u7121\u6cd5\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u3002

    \u5982\u679c\u96dc\u6e4a\u885d\u7a81\u904e\u65bc\u983b\u7e41\uff0c\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u5247\u6703\u6025\u5287\u52a3\u5316\u3002\u5982\u5716 6-8 \u6240\u793a\uff0c\u5c0d\u65bc\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\uff0c\u7406\u60f3\u60c5\u6cc1\u4e0b\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u5404\u500b\u6876\u4e2d\uff0c\u9054\u5230\u6700\u4f73\u67e5\u8a62\u6548\u7387\uff1b\u6700\u5dee\u60c5\u6cc1\u4e0b\u6240\u6709\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5230\u540c\u4e00\u500b\u6876\u4e2d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u5716 6-8 \u00a0 \u96dc\u6e4a\u885d\u7a81\u7684\u6700\u4f73\u60c5\u6cc1\u8207\u6700\u5dee\u60c5\u6cc1

    \u9375\u503c\u5c0d\u7684\u5206\u4f48\u60c5\u6cc1\u7531\u96dc\u6e4a\u51fd\u5f0f\u6c7a\u5b9a\u3002\u56de\u61b6\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u6b65\u9a5f\uff0c\u5148\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u518d\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\uff1a

    index = hash(key) % capacity\n

    \u89c0\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u7576\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u6642\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u6c7a\u5b9a\u4e86\u8f38\u51fa\u503c\uff0c\u9032\u800c\u6c7a\u5b9a\u4e86\u9375\u503c\u5c0d\u5728\u96dc\u6e4a\u8868\u4e2d\u7684\u5206\u4f48\u60c5\u6cc1\u3002

    \u9019\u610f\u5473\u8457\uff0c\u70ba\u4e86\u964d\u4f4e\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u6a5f\u7387\uff0c\u6211\u5011\u61c9\u7576\u5c07\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u7684\u8a2d\u8a08\u4e0a\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u76ee\u6a19","text":"

    \u70ba\u4e86\u5be6\u73fe\u201c\u65e2\u5feb\u53c8\u7a69\u201d\u7684\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u5177\u5099\u4ee5\u4e0b\u7279\u9ede\u3002

    • \u78ba\u5b9a\u6027\uff1a\u5c0d\u65bc\u76f8\u540c\u7684\u8f38\u5165\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u59cb\u7d42\u7522\u751f\u76f8\u540c\u7684\u8f38\u51fa\u3002\u9019\u6a23\u624d\u80fd\u78ba\u4fdd\u96dc\u6e4a\u8868\u662f\u53ef\u9760\u7684\u3002
    • \u6548\u7387\u9ad8\uff1a\u8a08\u7b97\u96dc\u6e4a\u503c\u7684\u904e\u7a0b\u61c9\u8a72\u8db3\u5920\u5feb\u3002\u8a08\u7b97\u958b\u92b7\u8d8a\u5c0f\uff0c\u96dc\u6e4a\u8868\u7684\u5be6\u7528\u6027\u8d8a\u9ad8\u3002
    • \u5747\u52fb\u5206\u4f48\uff1a\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u4f7f\u5f97\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u96dc\u6e4a\u8868\u4e2d\u3002\u5206\u4f48\u8d8a\u5747\u52fb\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002

    \u5be6\u969b\u4e0a\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u96dc\u6e4a\u8868\uff0c\u9084\u5ee3\u6cdb\u61c9\u7528\u65bc\u5176\u4ed6\u9818\u57df\u4e2d\u3002

    • \u5bc6\u78bc\u5132\u5b58\uff1a\u70ba\u4e86\u4fdd\u8b77\u4f7f\u7528\u8005\u5bc6\u78bc\u7684\u5b89\u5168\uff0c\u7cfb\u7d71\u901a\u5e38\u4e0d\u6703\u76f4\u63a5\u5132\u5b58\u4f7f\u7528\u8005\u7684\u660e\u6587\u5bc6\u78bc\uff0c\u800c\u662f\u5132\u5b58\u5bc6\u78bc\u7684\u96dc\u6e4a\u503c\u3002\u7576\u7528\u6236\u8f38\u5165\u5bc6\u78bc\u6642\uff0c\u7cfb\u7d71\u6703\u5c0d\u8f38\u5165\u7684\u5bc6\u78bc\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u7136\u5f8c\u8207\u5132\u5b58\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u5bc6\u78bc\u5c31\u88ab\u8996\u70ba\u6b63\u78ba\u3002
    • \u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5\uff1a\u8cc7\u6599\u50b3\u9001\u65b9\u53ef\u4ee5\u8a08\u7b97\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\u4e26\u5c07\u5176\u4e00\u540c\u50b3\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8a08\u7b97\u63a5\u6536\u5230\u7684\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\uff0c\u4e26\u8207\u63a5\u6536\u5230\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u8cc7\u6599\u5c31\u88ab\u8996\u70ba\u5b8c\u6574\u3002

    \u5c0d\u65bc\u5bc6\u78bc\u5b78\u7684\u76f8\u95dc\u61c9\u7528\uff0c\u70ba\u4e86\u9632\u6b62\u5f9e\u96dc\u6e4a\u503c\u63a8\u5c0e\u51fa\u539f\u59cb\u5bc6\u78bc\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9700\u8981\u5177\u5099\u66f4\u9ad8\u7b49\u7d1a\u7684\u5b89\u5168\u7279\u6027\u3002

    • \u55ae\u5411\u6027\uff1a\u7121\u6cd5\u900f\u904e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u7684\u4efb\u4f55\u8cc7\u8a0a\u3002
    • \u6297\u78b0\u649e\u6027\uff1a\u61c9\u7576\u6975\u96e3\u627e\u5230\u5169\u500b\u4e0d\u540c\u7684\u8f38\u5165\uff0c\u4f7f\u5f97\u5b83\u5011\u7684\u96dc\u6e4a\u503c\u76f8\u540c\u3002
    • \u96ea\u5d29\u6548\u61c9\uff1a\u8f38\u5165\u7684\u5fae\u5c0f\u8b8a\u5316\u61c9\u7576\u5c0e\u81f4\u8f38\u51fa\u7684\u986f\u8457\u4e14\u4e0d\u53ef\u9810\u6e2c\u7684\u8b8a\u5316\u3002

    \u8acb\u6ce8\u610f\uff0c\u201c\u5747\u52fb\u5206\u4f48\u201d\u8207\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u5169\u500b\u7368\u7acb\u7684\u6982\u5ff5\uff0c\u6eff\u8db3\u5747\u52fb\u5206\u4f48\u4e0d\u4e00\u5b9a\u6eff\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u96a8\u6a5f\u8f38\u5165 key \u4e0b\uff0c\u96dc\u6e4a\u51fd\u5f0f key % 100 \u53ef\u4ee5\u7522\u751f\u5747\u52fb\u5206\u4f48\u7684\u8f38\u51fa\u3002\u7136\u800c\u8a72\u96dc\u6e4a\u6f14\u7b97\u6cd5\u904e\u65bc\u7c21\u55ae\uff0c\u6240\u6709\u5f8c\u5169\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f38\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u5f9e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u5f9e\u800c\u7834\u89e3\u5bc6\u78bc\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08","text":"

    \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u662f\u4e00\u500b\u9700\u8981\u8003\u616e\u8a31\u591a\u56e0\u7d20\u7684\u8907\u96dc\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u5834\u666f\uff0c\u6211\u5011\u4e5f\u80fd\u8a2d\u8a08\u4e00\u4e9b\u7c21\u55ae\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

    • \u52a0\u6cd5\u96dc\u6e4a\uff1a\u5c0d\u8f38\u5165\u7684\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u9032\u884c\u76f8\u52a0\uff0c\u5c07\u5f97\u5230\u7684\u7e3d\u548c\u4f5c\u70ba\u96dc\u6e4a\u503c\u3002
    • \u4e58\u6cd5\u96dc\u6e4a\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u95dc\u6027\uff0c\u6bcf\u8f2a\u4e58\u4ee5\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5404\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u96dc\u6e4a\u503c\u4e2d\u3002
    • \u4e92\u65a5\u6216\u96dc\u6e4a\uff1a\u5c07\u8f38\u5165\u8cc7\u6599\u7684\u6bcf\u500b\u5143\u7d20\u900f\u904e\u4e92\u65a5\u6216\u64cd\u4f5c\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\u3002
    • \u65cb\u8f49\u96dc\u6e4a\uff1a\u5c07\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u7a4d\u4e4b\u524d\u90fd\u6703\u5c0d\u96dc\u6e4a\u503c\u9032\u884c\u65cb\u8f49\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
    def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u96dc\u6e4a\"\"\"\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\u96dc\u6e4a\"\"\"\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    \"\"\"\u4e92\u65a5\u6216\u96dc\u6e4a\"\"\"\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\u8f49\u96dc\u6e4a\"\"\"\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a ###\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\u96dc\u6e4a ###\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### \u4e92\u65a5\u6216\u96dc\u6e4a ###\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\u8f49\u96dc\u6e4a ###\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u767c\u73fe\uff0c\u6bcf\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6700\u5f8c\u4e00\u6b65\u90fd\u662f\u5c0d\u5927\u8cea\u6578 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u78ba\u4fdd\u96dc\u6e4a\u503c\u5728\u5408\u9069\u7684\u7bc4\u570d\u5167\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u70ba\u4ec0\u9ebc\u8981\u5f37\u8abf\u5c0d\u8cea\u6578\u53d6\u6a21\uff0c\u6216\u8005\u8aaa\u5c0d\u5408\u6578\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u9ebc\uff1f\u9019\u662f\u4e00\u500b\u6709\u8da3\u7684\u554f\u984c\u3002

    \u5148\u4e1f\u64f2\u7d50\u8ad6\uff1a\u4f7f\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u5206\u4f48\u3002\u56e0\u70ba\u8cea\u6578\u4e0d\u8207\u5176\u4ed6\u6578\u5b57\u5b58\u5728\u516c\u7d04\u6578\uff0c\u53ef\u4ee5\u6e1b\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u7522\u751f\u7684\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u5f9e\u800c\u907f\u514d\u96dc\u6e4a\u885d\u7a81\u3002

    \u8209\u500b\u4f8b\u5b50\uff0c\u5047\u8a2d\u6211\u5011\u9078\u64c7\u5408\u6578 \\(9\\) \u4f5c\u70ba\u6a21\u6578\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u9ebc\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u9019\u4e09\u500b\u96dc\u6e4a\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\u8f38\u5165 key \u6070\u597d\u6eff\u8db3\u9019\u7a2e\u7b49\u5dee\u6578\u5217\u7684\u8cc7\u6599\u5206\u4f48\uff0c\u90a3\u9ebc\u96dc\u6e4a\u503c\u5c31\u6703\u51fa\u73fe\u805a\u5806\u7a4d\uff0c\u5f9e\u800c\u52a0\u91cd\u96dc\u6e4a\u885d\u7a81\u3002\u73fe\u5728\uff0c\u5047\u8a2d\u5c07 modulus \u66ff\u63db\u70ba\u8cea\u6578 \\(13\\) \uff0c\u7531\u65bc key \u548c modulus \u4e4b\u9593\u4e0d\u5b58\u5728\u516c\u7d04\u6578\uff0c\u56e0\u6b64\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u6027\u6703\u660e\u986f\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\u8aaa\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u5920\u4fdd\u8b49 key \u662f\u96a8\u6a5f\u5747\u52fb\u5206\u4f48\u7684\uff0c\u90a3\u9ebc\u9078\u64c7\u8cea\u6578\u6216\u8005\u5408\u6578\u4f5c\u70ba\u6a21\u6578\u90fd\u53ef\u4ee5\uff0c\u5b83\u5011\u90fd\u80fd\u8f38\u51fa\u5747\u52fb\u5206\u4f48\u7684\u96dc\u6e4a\u503c\u3002\u800c\u7576 key \u7684\u5206\u4f48\u5b58\u5728\u67d0\u7a2e\u9031\u671f\u6027\u6642\uff0c\u5c0d\u5408\u6578\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73fe\u805a\u96c6\u73fe\u8c61\u3002

    \u7e3d\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u901a\u5e38\u9078\u53d6\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4e26\u4e14\u9019\u500b\u8cea\u6578\u6700\u597d\u8db3\u5920\u5927\uff0c\u4ee5\u5118\u53ef\u80fd\u6d88\u9664\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u898b\u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

    \u4e0d\u96e3\u767c\u73fe\uff0c\u4ee5\u4e0a\u4ecb\u7d39\u7684\u7c21\u55ae\u96dc\u6e4a\u6f14\u7b97\u6cd5\u90fd\u6bd4\u8f03\u201c\u8106\u5f31\u201d\uff0c\u9060\u9060\u6c92\u6709\u9054\u5230\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u76ee\u6a19\u3002\u4f8b\u5982\uff0c\u7531\u65bc\u52a0\u6cd5\u548c\u4e92\u65a5\u6216\u6eff\u8db3\u4ea4\u63db\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u96dc\u6e4a\u548c\u4e92\u65a5\u6216\u96dc\u6e4a\u7121\u6cd5\u5340\u5206\u5167\u5bb9\u76f8\u540c\u4f46\u9806\u5e8f\u4e0d\u540c\u7684\u5b57\u4e32\uff0c\u9019\u53ef\u80fd\u6703\u52a0\u5287\u96dc\u6e4a\u885d\u7a81\uff0c\u4e26\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u554f\u984c\u3002

    \u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u7528\u4e00\u4e9b\u6a19\u6e96\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u5011\u53ef\u4ee5\u5c07\u4efb\u610f\u9577\u5ea6\u7684\u8f38\u5165\u8cc7\u6599\u5c0d\u6620\u5230\u6046\u5b9a\u9577\u5ea6\u7684\u96dc\u6e4a\u503c\u3002

    \u8fd1\u4e00\u500b\u4e16\u7d00\u4ee5\u4f86\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u8655\u5728\u4e0d\u65b7\u5347\u7d1a\u8207\u6700\u4f73\u5316\u7684\u904e\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u52aa\u529b\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u548c\u99ed\u5ba2\u5247\u81f4\u529b\u65bc\u5c0b\u627e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u554f\u984c\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5be6\u969b\u61c9\u7528\u4e2d\u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

    • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u64ca\uff0c\u56e0\u6b64\u5b83\u5011\u88ab\u5404\u985e\u5b89\u5168\u61c9\u7528\u68c4\u7528\u3002
    • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73fe\u6210\u529f\u7684\u653b\u64ca\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u985e\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u4e2d\u3002
    • SHA-3 \u76f8\u8f03 SHA-2 \u7684\u5be6\u73fe\u958b\u92b7\u66f4\u4f4e\u3001\u8a08\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u84cb\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

    \u8868 6-2 \u00a0 \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5

    MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u6642\u9593 1992 1995 2002 2008 \u8f38\u51fa\u9577\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u96dc\u6e4a\u885d\u7a81 \u8f03\u591a \u8f03\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7d1a \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u9ad8 \u9ad8 \u61c9\u7528 \u5df2\u88ab\u68c4\u7528\uff0c\u4ecd\u7528\u65bc\u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5 \u5df2\u88ab\u68c4\u7528 \u52a0\u5bc6\u8ca8\u5e63\u4ea4\u6613\u9a57\u8b49\u3001\u6578\u5b57\u7c3d\u540d\u7b49 \u53ef\u7528\u65bc\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u96dc\u6e4a\u503c","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u96dc\u6e4a\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6578\u3001\u5c0f\u6578\u6216\u5b57\u4e32\u7b49\u8cc7\u6599\u578b\u5225\u3002\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u9019\u4e9b\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u547c\u53eb hash() \u51fd\u5f0f\u4f86\u8a08\u7b97\u5404\u7a2e\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u3002

    • \u6574\u6578\u548c\u5e03\u6797\u91cf\u7684\u96dc\u6e4a\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
    • \u6d6e\u9ede\u6578\u548c\u5b57\u4e32\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u8f03\u70ba\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u8acb\u81ea\u884c\u5b78\u7fd2\u3002
    • \u5143\u7d44\u7684\u96dc\u6e4a\u503c\u662f\u5c0d\u5176\u4e2d\u6bcf\u4e00\u500b\u5143\u7d20\u9032\u884c\u96dc\u6e4a\uff0c\u7136\u5f8c\u5c07\u9019\u4e9b\u96dc\u6e4a\u503c\u7d44\u5408\u8d77\u4f86\uff0c\u5f97\u5230\u55ae\u4e00\u7684\u96dc\u6e4a\u503c\u3002
    • \u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u57fa\u65bc\u5176\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u3002\u900f\u904e\u91cd\u5beb\u7269\u4ef6\u7684\u96dc\u6e4a\u65b9\u6cd5\uff0c\u53ef\u5be6\u73fe\u57fa\u65bc\u5167\u5bb9\u751f\u6210\u96dc\u6e4a\u503c\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u96dc\u6e4a\u503c\u8a08\u7b97\u51fd\u5f0f\u7684\u5b9a\u7fa9\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u6797\u91cf True \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 326484311674566659\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u7bc0\u9ede\u7269\u4ef6 <ListNode object at 0x1058fd810> \u7684\u96dc\u6e4a\u503c\u70ba 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u6797\u91cf 1 \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 4614256650576692846\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5167\u5efa std:hash() \u50c5\u63d0\u4f9b\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\n// \u9663\u5217\u3001\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u9700\u8981\u81ea\u884c\u5be6\u73fe\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@7dc5e7b4 \u7684\u96dc\u6e4a\u503c\u70ba 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729;\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u7bc0\u9ede\u7269\u4ef6 0 \u7684\u96dc\u6e4a\u503c\u70ba 39053774;\n
    built_in_hash.go
    // Go \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -2465384235396674631\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u9663\u5217 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u96dc\u6e4a\u503c\u70ba -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode \u7684\u96dc\u6e4a\u503c\u70ba -2434780518035996159\n
    built_in_hash.js
    // JavaScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.ts
    // TypeScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u6797\u503c true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2570631074981783\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u7bc0\u9ede\u7269\u4ef6 Instance of 'ListNode' \u7684\u96dc\u6e4a\u503c\u70ba 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\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 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\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2566941990314602357\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 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\u7d44 (12836, \"\u5c0f\u54c8\") \u7684\u96dc\u6e4a\u503c\u70ba 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u7bc0\u9ede\u7269\u4ef6 RefCell { value: ListNode { val: 42, next: None } } \u7684\u96dc\u6e4a\u503c\u70ba15387811073369036852\n
    built_in_hash.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.kt
    val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nval str = \"Hello \u6f14\u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@1d81eb93 \u7684\u96dc\u6e4a\u503c\u70ba 495053715\n
    built_in_hash.rb
    num = 3\nhash_num = num.hash\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1479186995943067893\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u7bc0\u9ede\u7269\u4ef6 #<ListNode:0x000078133140ab70> \u7684\u96dc\u6e4a\u503c\u70ba 4302940560806366381\n
    built_in_hash.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u624d\u53ef\u4f5c\u70ba\u96dc\u6e4a\u8868\u7684 key \u3002\u5047\u5982\u6211\u5011\u5c07\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f5c\u70ba key \uff0c\u7576\u4e32\u5217\u7684\u5167\u5bb9\u767c\u751f\u8b8a\u5316\u6642\uff0c\u5b83\u7684\u96dc\u6e4a\u503c\u4e5f\u96a8\u4e4b\u6539\u8b8a\uff0c\u6211\u5011\u5c31\u7121\u6cd5\u5728\u96dc\u6e4a\u8868\u4e2d\u67e5\u8a62\u5230\u539f\u5148\u7684 value \u4e86\u3002

    \u96d6\u7136\u81ea\u5b9a\u7fa9\u7269\u4ef6\uff08\u6bd4\u5982\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff09\u7684\u6210\u54e1\u8b8a\u6578\u662f\u53ef\u8b8a\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u96dc\u6e4a\u7684\u3002\u9019\u662f\u56e0\u70ba\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u901a\u5e38\u662f\u57fa\u65bc\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u7269\u4ef6\u7684\u5167\u5bb9\u767c\u751f\u4e86\u8b8a\u5316\uff0c\u4f46\u5b83\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u4e0d\u8b8a\uff0c\u96dc\u6e4a\u503c\u4ecd\u7136\u662f\u4e0d\u8b8a\u7684\u3002

    \u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u767c\u73fe\u5728\u4e0d\u540c\u63a7\u5236\u6aaf\u4e2d\u57f7\u884c\u7a0b\u5f0f\u6642\uff0c\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u662f\u4e0d\u540c\u7684\u3002\u9019\u662f\u56e0\u70ba Python \u76f4\u8b6f\u5668\u5728\u6bcf\u6b21\u555f\u52d5\u6642\uff0c\u90fd\u6703\u70ba\u5b57\u4e32\u96dc\u6e4a\u51fd\u5f0f\u52a0\u5165\u4e00\u500b\u96a8\u6a5f\u7684\u9e7d\uff08salt\uff09\u503c\u3002\u9019\u7a2e\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u64ca\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81","text":"

    \u4e0a\u4e00\u7bc0\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u5165\u7a7a\u9593\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff0c\u56e0\u6b64\u7406\u8ad6\u4e0a\u96dc\u6e4a\u885d\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f38\u5165\u7a7a\u9593\u70ba\u5168\u9ad4\u6574\u6578\uff0c\u8f38\u51fa\u7a7a\u9593\u70ba\u9663\u5217\u5bb9\u91cf\u5927\u5c0f\uff0c\u5247\u5fc5\u7136\u6709\u591a\u500b\u6574\u6578\u5c0d\u6620\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

    \u96dc\u6e4a\u885d\u7a81\u6703\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u932f\u8aa4\uff0c\u56b4\u91cd\u5f71\u97ff\u96dc\u6e4a\u8868\u7684\u53ef\u7528\u6027\u3002\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6bcf\u7576\u9047\u5230\u96dc\u6e4a\u885d\u7a81\u6642\uff0c\u6211\u5011\u5c31\u9032\u884c\u96dc\u6e4a\u8868\u64f4\u5bb9\uff0c\u76f4\u81f3\u885d\u7a81\u6d88\u5931\u70ba\u6b62\u3002\u6b64\u65b9\u6cd5\u7c21\u55ae\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u8981\u9032\u884c\u5927\u91cf\u7684\u8cc7\u6599\u642c\u904b\u8207\u96dc\u6e4a\u503c\u8a08\u7b97\u3002\u70ba\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

    1. \u6539\u826f\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u4f7f\u5f97\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\u3002
    2. \u50c5\u5728\u5fc5\u8981\u6642\uff0c\u5373\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u624d\u57f7\u884c\u64f4\u5bb9\u64cd\u4f5c\u3002

    \u96dc\u6e4a\u8868\u7684\u7d50\u69cb\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u548c\u201c\u958b\u653e\u5b9a\u5740\u201d\u3002

    "},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u93c8\u5f0f\u4f4d\u5740","text":"

    \u5728\u539f\u59cb\u96dc\u6e4a\u8868\u4e2d\uff0c\u6bcf\u500b\u6876\u50c5\u80fd\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u93c8\u5f0f\u4f4d\u5740\uff08separate chaining\uff09\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u63db\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u9375\u503c\u5c0d\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff0c\u5c07\u6240\u6709\u767c\u751f\u885d\u7a81\u7684\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5728\u540c\u4e00\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u5716 6-5 \u5c55\u793a\u4e86\u4e00\u500b\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u4f8b\u5b50\u3002

    \u5716 6-5 \u00a0 \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868

    \u57fa\u65bc\u93c8\u5f0f\u4f4d\u5740\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u767c\u751f\u4e86\u4ee5\u4e0b\u8b8a\u5316\u3002

    • \u67e5\u8a62\u5143\u7d20\uff1a\u8f38\u5165 key \uff0c\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4e26\u5c0d\u6bd4 key \u4ee5\u67e5\u8a62\u76ee\u6a19\u9375\u503c\u5c0d\u3002
    • \u65b0\u589e\u5143\u7d20\uff1a\u9996\u5148\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u5c07\u7bc0\u9ede\uff08\u9375\u503c\u5c0d\uff09\u65b0\u589e\u5230\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
    • \u522a\u9664\u5143\u7d20\uff1a\u6839\u64da\u96dc\u6e4a\u51fd\u5f0f\u7684\u7d50\u679c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u63a5\u8457\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4ee5\u67e5\u8a62\u76ee\u6a19\u7bc0\u9ede\u4e26\u5c07\u5176\u522a\u9664\u3002

    \u93c8\u5f0f\u4f4d\u5740\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

    • \u4f54\u7528\u7a7a\u9593\u589e\u5927\uff1a\u93c8\u7d50\u4e32\u5217\u5305\u542b\u7bc0\u9ede\u6307\u6a19\uff0c\u5b83\u76f8\u6bd4\u9663\u5217\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u67e5\u8a62\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u70ba\u9700\u8981\u7dda\u6027\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u5c0d\u61c9\u5143\u7d20\u3002

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u7d66\u51fa\u4e86\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u7c21\u55ae\u5be6\u73fe\uff0c\u9700\u8981\u6ce8\u610f\u5169\u9ede\u3002

    • \u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\uff0c\u5f9e\u800c\u7c21\u5316\u7a0b\u5f0f\u78bc\u3002\u5728\u9019\u7a2e\u8a2d\u5b9a\u4e0b\uff0c\u96dc\u6e4a\u8868\uff08\u9663\u5217\uff09\u5305\u542b\u591a\u500b\u6876\uff0c\u6bcf\u500b\u6876\u90fd\u662f\u4e00\u500b\u4e32\u5217\u3002
    • \u4ee5\u4e0b\u5be6\u73fe\u5305\u542b\u96dc\u6e4a\u8868\u64f4\u5bb9\u65b9\u6cd5\u3002\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(\\frac{2}{3}\\) \u6642\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
    class HashMapChaining:\n    \"\"\"\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u9663\u5217\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;                   // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres;               // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;                // \u64f4\u5bb9\u500d\u6578\n    vector<vector<Pair *>> buckets; // \u6876\u9663\u5217\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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); // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n                delete tmp;                       // \u91cb\u653e\u8a18\u61b6\u9ad4\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int      // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int      // \u64f4\u5bb9\u500d\u6578\n    buckets     [][]pair // \u6876\u9663\u5217\n}\n\n/* \u5efa\u69cb\u5b50 */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\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/* \u522a\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u522a\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\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\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [[Pair]] // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    #buckets: Pair[][]; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  late int size; // \u9375\u503c\u5c0d\u6578\u91cf\n  late int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  late double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  late int extendRatio; // \u64f4\u5bb9\u500d\u6578\n  late List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n  /* \u5efa\u69cb\u5b50 */\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  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\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    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u522a\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        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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\u5247\u8fd4\u56de None\n        None\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\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        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8a62\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        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de None\n        None\n    }\n}\n
    hash_map_chaining.c
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Node **buckets;   // \u6876\u9663\u5217\n} HashMapChaining;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u522a\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            // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    val extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        // mutablelist \u7121\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u9375\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapChaining\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) { [] } # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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  ### \u5217\u5370\u96dc\u6e4a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u5f88\u9577\u6642\uff0c\u67e5\u8a62\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u6642\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u201cAVL \u6a39\u201d\u6216\u201c\u7d05\u9ed1\u6a39\u201d\uff0c\u5f9e\u800c\u5c07\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u958b\u653e\u5b9a\u5740","text":"

    \u958b\u653e\u5b9a\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u800c\u662f\u900f\u904e\u201c\u591a\u6b21\u63a2\u6e2c\u201d\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\uff0c\u63a2\u6e2c\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\u7b49\u3002

    \u4e0b\u9762\u4ee5\u7dda\u6027\u63a2\u67e5\u70ba\u4f8b\uff0c\u4ecb\u7d39\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u6a5f\u5236\u3002

    "},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7dda\u6027\u63a2\u67e5","text":"

    \u7dda\u6027\u63a2\u67e5\u63a1\u7528\u56fa\u5b9a\u6b65\u9577\u7684\u7dda\u6027\u641c\u5c0b\u4f86\u9032\u884c\u63a2\u6e2c\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u8207\u666e\u901a\u96dc\u6e4a\u8868\u6709\u6240\u4e0d\u540c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u767c\u73fe\u6876\u5167\u5df2\u6709\u5143\u7d20\uff0c\u5247\u5f9e\u885d\u7a81\u4f4d\u7f6e\u5411\u5f8c\u7dda\u6027\u8d70\u8a2a\uff08\u6b65\u9577\u901a\u5e38\u70ba \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c07\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u82e5\u767c\u73fe\u96dc\u6e4a\u885d\u7a81\uff0c\u5247\u4f7f\u7528\u76f8\u540c\u6b65\u9577\u5411\u5f8c\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u76f4\u5230\u627e\u5230\u5c0d\u61c9\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8aaa\u660e\u76ee\u6a19\u5143\u7d20\u4e0d\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

    \u5716 6-6 \u5c55\u793a\u4e86\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48\u3002\u6839\u64da\u6b64\u96dc\u6e4a\u51fd\u5f0f\uff0c\u6700\u5f8c\u5169\u4f4d\u76f8\u540c\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u900f\u904e\u7dda\u6027\u63a2\u67e5\uff0c\u5b83\u5011\u88ab\u4f9d\u6b21\u5132\u5b58\u5728\u8a72\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

    \u5716 6-6 \u00a0 \u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48

    \u7136\u800c\uff0c\u7dda\u6027\u63a2\u67e5\u5bb9\u6613\u7522\u751f\u201c\u805a\u96c6\u73fe\u8c61\u201d\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u9663\u5217\u4e2d\u9023\u7e8c\u88ab\u4f54\u7528\u7684\u4f4d\u7f6e\u8d8a\u9577\uff0c\u9019\u4e9b\u9023\u7e8c\u4f4d\u7f6e\u767c\u751f\u96dc\u6e4a\u885d\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u5f9e\u800c\u9032\u4e00\u6b65\u4fc3\u4f7f\u8a72\u4f4d\u7f6e\u7684\u805a\u5806\u7a4d\u751f\u9577\uff0c\u5f62\u6210\u60e1\u6027\u8ff4\u5708\uff0c\u6700\u7d42\u5c0e\u81f4\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u5011\u4e0d\u80fd\u5728\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u4e2d\u76f4\u63a5\u522a\u9664\u5143\u7d20\u3002\u9019\u662f\u56e0\u70ba\u522a\u9664\u5143\u7d20\u6703\u5728\u9663\u5217\u5167\u7522\u751f\u4e00\u500b\u7a7a\u6876 None \uff0c\u800c\u7576\u67e5\u8a62\u5143\u7d20\u6642\uff0c\u7dda\u6027\u63a2\u67e5\u5230\u8a72\u7a7a\u6876\u5c31\u6703\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8a72\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u7121\u6cd5\u518d\u88ab\u8a2a\u554f\u5230\uff0c\u7a0b\u5f0f\u53ef\u80fd\u8aa4\u5224\u9019\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u5716 6-7 \u6240\u793a\u3002

    \u5716 6-7 \u00a0 \u5728\u958b\u653e\u5b9a\u5740\u4e2d\u522a\u9664\u5143\u7d20\u5c0e\u81f4\u7684\u67e5\u8a62\u554f\u984c

    \u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u61f6\u522a\u9664\uff08lazy deletion\uff09\u6a5f\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u5f9e\u96dc\u6e4a\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u500b\u5e38\u6578 TOMBSTONE \u4f86\u6a19\u8a18\u9019\u500b\u6876\u3002\u5728\u8a72\u6a5f\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u9375\u503c\u5c0d\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7dda\u6027\u63a2\u67e5\u5230 TOMBSTONE \u6642\u61c9\u8a72\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u56e0\u70ba\u5176\u4e4b\u4e0b\u53ef\u80fd\u9084\u5b58\u5728\u9375\u503c\u5c0d\u3002

    \u7136\u800c\uff0c\u61f6\u522a\u9664\u53ef\u80fd\u6703\u52a0\u901f\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u9000\u5316\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u6b21\u522a\u9664\u64cd\u4f5c\u90fd\u6703\u7522\u751f\u4e00\u500b\u522a\u9664\u6a19\u8a18\uff0c\u96a8\u8457 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u5c0b\u6642\u9593\u4e5f\u6703\u589e\u52a0\uff0c\u56e0\u70ba\u7dda\u6027\u63a2\u67e5\u53ef\u80fd\u9700\u8981\u8df3\u904e\u591a\u500b TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6a19\u5143\u7d20\u3002

    \u70ba\u6b64\uff0c\u8003\u616e\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\u8a18\u9304\u9047\u5230\u7684\u9996\u500b TOMBSTONE \u7684\u7d22\u5f15\uff0c\u4e26\u5c07\u641c\u5c0b\u5230\u7684\u76ee\u6a19\u5143\u7d20\u8207\u8a72 TOMBSTONE \u4ea4\u63db\u4f4d\u7f6e\u3002\u9019\u6a23\u505a\u7684\u597d\u8655\u662f\u7576\u6bcf\u6b21\u67e5\u8a62\u6216\u65b0\u589e\u5143\u7d20\u6642\uff0c\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u81f3\u8ddd\u96e2\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6e2c\u8d77\u59cb\u9ede\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u5f9e\u800c\u6700\u4f73\u5316\u67e5\u8a62\u6548\u7387\u3002

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u5305\u542b\u61f6\u522a\u9664\u7684\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u3002\u70ba\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u770b\u4f5c\u4e00\u500b\u201c\u74b0\u5f62\u9663\u5217\u201d\uff0c\u7576\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
    class HashMapOpenAddressing:\n    \"\"\"\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u9663\u5217\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u522a\u9664\u6a19\u8a18\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\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\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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        \"\"\"\u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4;                     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    const int extendRatio = 2;            // \u64f4\u5bb9\u500d\u6578\n    vector<Pair *> buckets;               // \u6876\u9663\u5217\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u69cb\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    private int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private final int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    private Pair[] buckets; // \u6876\u9663\u5217\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    Pair[] buckets; // \u6876\u9663\u5217\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int     // \u64f4\u5bb9\u500d\u6578\n    buckets     []*pair // \u6876\u9663\u5217\n    TOMBSTONE   *pair   // \u522a\u9664\u6a19\u8a18\n}\n\n/* \u5efa\u69cb\u5b50 */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u64da\u9375\u8a08\u7b97\u96dc\u6e4a\u503c\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8a08\u7b97\u7576\u524d\u8ca0\u8f09\u56e0\u5b50\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u7372\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8a18\u9304\u9047\u5230\u7684\u7b2c\u4e00\u500bTOMBSTONE\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\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\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 // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7dda\u6027\u63a2\u67e5\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    }\n    return \"\" // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val\n    }\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        h.size--\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [Pair?] // \u6876\u9663\u5217\n    var TOMBSTONE: Pair // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n    #TOMBSTONE; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.#capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.#extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u9663\u5217\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    private capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    private buckets: Array<Pair | null>; // \u6876\u9663\u5217\n    private TOMBSTONE: Pair; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u9663\u5217\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u9375\u503c\u5c0d\u6578\u91cf\n  int _capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  int _extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n  late List<Pair?> _buckets; // \u6876\u9663\u5217\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity: usize,            // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extend_ratio: usize,        // \u64f4\u5bb9\u500d\u6578\n    buckets: Vec<Option<Pair>>, // \u6876\u9663\u5217\n    TOMBSTONE: Option<Pair>,    // \u522a\u9664\u6a19\u8a18\n}\n\nimpl HashMapOpenAddressing {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\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        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u5efa\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\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\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        None\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Pair **buckets;   // \u6876\u9663\u5217\n    Pair *TOMBSTONE;  // \u522a\u9664\u6a19\u8a18\n} HashMapOpenAddressing;\n\n/* \u5efa\u69cb\u5b50 */\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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\u69cb\u51fd\u5f0f */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\";\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\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/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u9375\u503c\u5c0d\u6578\u91cf\n    private var capacity: Int           // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private val extendRatio: Int        // \u64f4\u5bb9\u500d\u6578\n    private var buckets: Array<Pair?>   // \u6876\u9663\u5217\n    private val TOMBSTONE: Pair         // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u522a\u9664\u6a19\u8a18\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u958b\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\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\u6e2c","text":"

    \u5e73\u65b9\u63a2\u6e2c\u8207\u7dda\u6027\u63a2\u67e5\u985e\u4f3c\uff0c\u90fd\u662f\u958b\u653e\u5b9a\u5740\u7684\u5e38\u898b\u7b56\u7565\u4e4b\u4e00\u3002\u7576\u767c\u751f\u885d\u7a81\u6642\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e0d\u662f\u7c21\u55ae\u5730\u8df3\u904e\u4e00\u500b\u56fa\u5b9a\u7684\u6b65\u6578\uff0c\u800c\u662f\u8df3\u904e\u201c\u63a2\u6e2c\u6b21\u6578\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6578\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

    \u5e73\u65b9\u63a2\u6e2c\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u512a\u52e2\u3002

    • \u5e73\u65b9\u63a2\u6e2c\u900f\u904e\u8df3\u904e\u63a2\u6e2c\u6b21\u6578\u5e73\u65b9\u7684\u8ddd\u96e2\uff0c\u8a66\u5716\u7de9\u89e3\u7dda\u6027\u63a2\u67e5\u7684\u805a\u96c6\u6548\u61c9\u3002
    • \u5e73\u65b9\u63a2\u6e2c\u6703\u8df3\u904e\u66f4\u5927\u7684\u8ddd\u96e2\u4f86\u5c0b\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u65bc\u8cc7\u6599\u5206\u4f48\u5f97\u66f4\u52a0\u5747\u52fb\u3002

    \u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e26\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

    • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73fe\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u4f54\u7528\u3002
    • \u7531\u65bc\u5e73\u65b9\u7684\u589e\u9577\uff0c\u5e73\u65b9\u63a2\u6e2c\u53ef\u80fd\u4e0d\u6703\u63a2\u6e2c\u6574\u500b\u96dc\u6e4a\u8868\uff0c\u9019\u610f\u5473\u8457\u5373\u4f7f\u96dc\u6e4a\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e5f\u53ef\u80fd\u7121\u6cd5\u8a2a\u554f\u5230\u5b83\u3002
    "},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u96dc\u6e4a","text":"

    \u9867\u540d\u601d\u7fa9\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u9032\u884c\u63a2\u6e2c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\) \u51fa\u73fe\u885d\u7a81\uff0c\u5247\u5617\u8a66 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u5f8c\u63d2\u5165\u5143\u7d20\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u96dc\u6e4a\u51fd\u5f0f\u9806\u5e8f\u4e0b\u9032\u884c\u67e5\u8a62\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6642\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5617\u8a66\u6240\u6709\u96dc\u6e4a\u51fd\u5f0f\uff0c\u8aaa\u660e\u96dc\u6e4a\u8868\u4e2d\u4e0d\u5b58\u5728\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de None \u3002

    \u8207\u7dda\u6027\u63a2\u67e5\u76f8\u6bd4\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u6703\u5e36\u4f86\u984d\u5916\u7684\u8a08\u7b97\u91cf\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\uff09\u96dc\u6e4a\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u201d\u7684\u554f\u984c\u3002

    "},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u9078\u64c7","text":"

    \u5404\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u7b56\u7565\uff0c\u4e0b\u9762\u8209\u5e7e\u500b\u4f8b\u5b50\u3002

    • Python \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u507d\u96a8\u6a5f\u6578\u9032\u884c\u63a2\u6e2c\u3002
    • Java \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002\u81ea JDK 1.8 \u4ee5\u4f86\uff0c\u7576 HashMap \u5167\u9663\u5217\u9577\u5ea6\u9054\u5230 64 \u4e14\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u9054\u5230 8 \u6642\uff0c\u93c8\u7d50\u4e32\u5217\u6703\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u80fd\u3002
    • Go \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002Go \u898f\u5b9a\u6bcf\u500b\u6876\u6700\u591a\u5132\u5b58 8 \u500b\u9375\u503c\u5c0d\uff0c\u8d85\u51fa\u5bb9\u91cf\u5247\u9023\u7dda\u4e00\u500b\u6ea2\u4f4d\u6876\uff1b\u7576\u6ea2\u4f4d\u6876\u904e\u591a\u6642\uff0c\u6703\u57f7\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u64f4\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u78ba\u4fdd\u6548\u80fd\u3002
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u96dc\u6e4a\u8868","text":"

    \u96dc\u6e4a\u8868\uff08hash table\uff09\uff0c\u53c8\u7a31\u6563\u5217\u8868\uff0c\u5b83\u900f\u904e\u5efa\u7acb\u9375 key \u8207\u503c value \u4e4b\u9593\u7684\u5c0d\u6620\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u3002\u5177\u9ad4\u800c\u8a00\uff0c\u6211\u5011\u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u4e00\u500b\u9375 key \uff0c\u5247\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u5c0d\u61c9\u7684\u503c value \u3002

    \u5982\u5716 6-1 \u6240\u793a\uff0c\u7d66\u5b9a \\(n\\) \u500b\u5b78\u751f\uff0c\u6bcf\u500b\u5b78\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b78\u865f\u201d\u5169\u9805\u8cc7\u6599\u3002\u5047\u5982\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u201c\u8f38\u5165\u4e00\u500b\u5b78\u865f\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u59d3\u540d\u201d\u7684\u67e5\u8a62\u529f\u80fd\uff0c\u5247\u53ef\u4ee5\u63a1\u7528\u5716 6-1 \u6240\u793a\u7684\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002

    \u5716 6-1 \u00a0 \u96dc\u6e4a\u8868\u7684\u62bd\u8c61\u8868\u793a

    \u9664\u96dc\u6e4a\u8868\u5916\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e5f\u53ef\u4ee5\u5be6\u73fe\u67e5\u8a62\u529f\u80fd\uff0c\u5b83\u5011\u7684\u6548\u7387\u5c0d\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

    • \u65b0\u589e\u5143\u7d20\uff1a\u50c5\u9700\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u662f\u4e82\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u8d70\u8a2a\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u522a\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8a62\u5230\u5143\u7d20\uff0c\u518d\u5f9e\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u4e2d\u522a\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002

    \u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8a62\u6548\u7387\u5c0d\u6bd4

    \u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u96dc\u6e4a\u8868 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u65b0\u589e\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    \u89c0\u5bdf\u767c\u73fe\uff0c\u5728\u96dc\u6e4a\u8868\u4e2d\u9032\u884c\u589e\u522a\u67e5\u6539\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u96dc\u6e4a\u8868\u5e38\u7528\u64cd\u4f5c","text":"

    \u96dc\u6e4a\u8868\u7684\u5e38\u898b\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8a62\u64cd\u4f5c\u3001\u65b0\u589e\u9375\u503c\u5c0d\u548c\u522a\u9664\u9375\u503c\u5c0d\u7b49\uff0c\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap: dict = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.pop(10583)\n
    hash_map.cpp
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nunordered_map<int, string> map;\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.erase(10583);\n
    hash_map.java
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u56c9\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9d28\");\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
    hash_map.cs
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nDictionary<int, string> map = new() {\n    /* \u65b0\u589e\u64cd\u4f5c */\n    // \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u56c9\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9d28\" }\n};\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.Remove(10583);\n
    hash_map_test.go
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nhmap := make(map[int]string)\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\ndelete(hmap, 10583)\n
    hash_map.swift
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\n
    hash_map.ts
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map<number, string>();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\nconsole.info('\\n\u65b0\u589e\u5b8c\u6210\u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f38\u5165\u5b78\u865f 15937 \uff0c\u67e5\u8a62\u5230\u59d3\u540d ' + name);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\nconsole.info('\\n\u522a\u9664 10583 \u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<int, String> map = {};\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u56c9\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9d28\".to_string());\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
    hash_map.kt
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583)\n
    hash_map.rb
    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.delete(10583)\n
    hash_map.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u96dc\u6e4a\u8868\u6709\u4e09\u7a2e\u5e38\u7528\u7684\u8d70\u8a2a\u65b9\u5f0f\uff1a\u8d70\u8a2a\u9375\u503c\u5c0d\u3001\u8d70\u8a2a\u9375\u548c\u8d70\u8a2a\u503c\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key in hmap.keys():\n    print(key)\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u8d70\u8a2a key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys {\n    print(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
    hash_map.rs
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
    hash_map.kt
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (key in map.keys) {\n    println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
    hash_map.rb
    # \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nhmap.keys.each { |key| puts key }\n\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nhmap.values.each { |val| puts val }\n
    hash_map.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u96dc\u6e4a\u8868\u7c21\u55ae\u5be6\u73fe","text":"

    \u6211\u5011\u5148\u8003\u616e\u6700\u7c21\u55ae\u7684\u60c5\u6cc1\uff0c\u50c5\u7528\u4e00\u500b\u9663\u5217\u4f86\u5be6\u73fe\u96dc\u6e4a\u8868\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5c07\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u7a7a\u4f4d\u7a31\u70ba\u6876\uff08bucket\uff09\uff0c\u6bcf\u500b\u6876\u53ef\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u56e0\u6b64\uff0c\u67e5\u8a62\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5c0d\u61c9\u7684\u6876\uff0c\u4e26\u5728\u6876\u4e2d\u7372\u53d6 value \u3002

    \u90a3\u9ebc\uff0c\u5982\u4f55\u57fa\u65bc key \u5b9a\u4f4d\u5c0d\u61c9\u7684\u6876\u5462\uff1f\u9019\u662f\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\uff08hash function\uff09\u5be6\u73fe\u7684\u3002\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u8f38\u51fa\u7a7a\u9593\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8f38\u5165\u7a7a\u9593\u662f\u6240\u6709 key \uff0c\u8f38\u51fa\u7a7a\u9593\u662f\u6240\u6709\u6876\uff08\u9663\u5217\u7d22\u5f15\uff09\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u8f38\u5165\u4e00\u500b key \uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u8a72 key \u5c0d\u61c9\u7684\u9375\u503c\u5c0d\u5728\u9663\u5217\u4e2d\u7684\u5132\u5b58\u4f4d\u7f6e\u3002

    \u8f38\u5165\u4e00\u500b key \uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u904e\u7a0b\u5206\u70ba\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u900f\u904e\u67d0\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u8a08\u7b97\u5f97\u5230\u96dc\u6e4a\u503c\u3002
    2. \u5c07\u96dc\u6e4a\u503c\u5c0d\u6876\u6578\u91cf\uff08\u9663\u5217\u9577\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u5f9e\u800c\u7372\u53d6\u8a72 key \u5c0d\u61c9\u7684\u9663\u5217\u7d22\u5f15 index \u3002
    index = hash(key) % capacity\n

    \u96a8\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u96dc\u6e4a\u8868\u4e2d\u8a2a\u554f\u5c0d\u61c9\u7684\u6876\uff0c\u5f9e\u800c\u7372\u53d6 value \u3002

    \u8a2d\u9663\u5217\u9577\u5ea6 capacity = 100\u3001\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u96dc\u6e4a\u51fd\u5f0f\u70ba key % 100 \u3002\u5716 6-2 \u4ee5 key \u5b78\u865f\u548c value \u59d3\u540d\u70ba\u4f8b\uff0c\u5c55\u793a\u4e86\u96dc\u6e4a\u51fd\u5f0f\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u5716 6-2 \u00a0 \u96dc\u6e4a\u51fd\u5f0f\u5de5\u4f5c\u539f\u7406

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u7c21\u55ae\u96dc\u6e4a\u8868\u3002\u5176\u4e2d\uff0c\u6211\u5011\u5c07 key \u548c value \u5c01\u88dd\u6210\u4e00\u500b\u985e\u5225 Pair \uff0c\u4ee5\u8868\u793a\u9375\u503c\u5c0d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
    class Pair:\n    \"\"\"\u9375\u503c\u5c0d\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\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        \"\"\"\u65b0\u589e\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        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\"\"\"\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        \"\"\"\u7372\u53d6\u6240\u6709\u9375\"\"\"\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        \"\"\"\u7372\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        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
    array_hash_map.cpp
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\u4e26\u7f6e\u70ba nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
    array_hash_map.java
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8a62\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/* \u65b0\u589e\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/* \u522a\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    a.buckets[index] = nil\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u5c0d */\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/* \u7372\u53d6\u6240\u6709\u9375 */\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/* \u7372\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = nil\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
    array_hash_map.js
    /* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d 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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8a62\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  /* \u65b0\u589e\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  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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  /* \u7372\u53d6\u6240\u6709\u9375 */\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  /* \u7372\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  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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/* \u65b0\u589e\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/* \u522a\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/* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u7372\u53d6\u6240\u6709\u9375 */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u7372\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u9375\u503c\u5c0d ###\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 ###\nclass ArrayHashMap\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8a62\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  ### \u65b0\u589e\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  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375 ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u7372\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  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
    array_hash_map.zig
    // \u9375\u503c\u5c0d\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\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        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u500b\u9577\u5ea6\u70ba 100 \u7684\u6876\uff08\u9663\u5217\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\u69cb\u51fd\u5f0f\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u96dc\u6e4a\u51fd\u5f0f\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8a62\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        // \u65b0\u589e\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        // \u522a\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\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        // \u7372\u53d6\u6240\u6709\u9375\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        // \u7372\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        // \u5217\u5370\u96dc\u6e4a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u8207\u64f4\u5bb9","text":"

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u6240\u6709 key \u69cb\u6210\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u9663\u5217\u6240\u6709\u7d22\u5f15\u69cb\u6210\u7684\u8f38\u51fa\u7a7a\u9593\uff0c\u800c\u8f38\u5165\u7a7a\u9593\u5f80\u5f80\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7406\u8ad6\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u76f8\u540c\u8f38\u51fa\u201d\u7684\u60c5\u6cc1\u3002

    \u5c0d\u65bc\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u96dc\u6e4a\u51fd\u5f0f\uff0c\u7576\u8f38\u5165\u7684 key \u5f8c\u5169\u4f4d\u76f8\u540c\u6642\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u51fa\u7d50\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8a62\u5b78\u865f\u70ba 12836 \u548c 20336 \u7684\u5169\u500b\u5b78\u751f\u6642\uff0c\u6211\u5011\u5f97\u5230\uff1a

    12836 % 100 = 36\n20336 % 100 = 36\n

    \u5982\u5716 6-3 \u6240\u793a\uff0c\u5169\u500b\u5b78\u865f\u6307\u5411\u4e86\u540c\u4e00\u500b\u59d3\u540d\uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002\u6211\u5011\u5c07\u9019\u7a2e\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u540c\u4e00\u8f38\u51fa\u7684\u60c5\u6cc1\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\uff08hash collision\uff09\u3002

    \u5716 6-3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u793a\u4f8b

    \u5bb9\u6613\u60f3\u5230\uff0c\u96dc\u6e4a\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u500b key \u88ab\u5206\u914d\u5230\u540c\u4e00\u500b\u6876\u4e2d\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\uff0c\u885d\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002

    \u5982\u5716 6-4 \u6240\u793a\uff0c\u64f4\u5bb9\u524d\u9375\u503c\u5c0d (136, A) \u548c (236, D) \u767c\u751f\u885d\u7a81\uff0c\u64f4\u5bb9\u5f8c\u885d\u7a81\u6d88\u5931\u3002

    \u5716 6-4 \u00a0 \u96dc\u6e4a\u8868\u64f4\u5bb9

    \u985e\u4f3c\u65bc\u9663\u5217\u64f4\u5bb9\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u5c07\u6240\u6709\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u9077\u79fb\u81f3\u65b0\u96dc\u6e4a\u8868\uff0c\u975e\u5e38\u8017\u6642\uff1b\u4e26\u4e14\u7531\u65bc\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u6539\u8b8a\uff0c\u6211\u5011\u9700\u8981\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u4f86\u91cd\u65b0\u8a08\u7b97\u6240\u6709\u9375\u503c\u5c0d\u7684\u5132\u5b58\u4f4d\u7f6e\uff0c\u9019\u9032\u4e00\u6b65\u589e\u52a0\u4e86\u64f4\u5bb9\u904e\u7a0b\u7684\u8a08\u7b97\u958b\u92b7\u3002\u70ba\u6b64\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u9810\u7559\u8db3\u5920\u5927\u7684\u96dc\u6e4a\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\u3002

    \u8ca0\u8f09\u56e0\u5b50\uff08load factor\uff09\u662f\u96dc\u6e4a\u8868\u7684\u4e00\u500b\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u7684\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u7528\u65bc\u8861\u91cf\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u89f8\u767c\u689d\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(0.75\\) \u6642\uff0c\u7cfb\u7d71\u6703\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u8f38\u5165 key \uff0c\u96dc\u6e4a\u8868\u80fd\u5920\u5728 \\(O(1)\\) \u6642\u9593\u5167\u67e5\u8a62\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
    • \u5e38\u898b\u7684\u96dc\u6e4a\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8a62\u3001\u65b0\u589e\u9375\u503c\u5c0d\u3001\u522a\u9664\u9375\u503c\u5c0d\u548c\u8d70\u8a2a\u96dc\u6e4a\u8868\u7b49\u3002
    • \u96dc\u6e4a\u51fd\u5f0f\u5c07 key \u5c0d\u6620\u70ba\u9663\u5217\u7d22\u5f15\uff0c\u5f9e\u800c\u8a2a\u554f\u5c0d\u61c9\u6876\u4e26\u7372\u53d6 value \u3002
    • \u5169\u500b\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f8c\u5f97\u5230\u76f8\u540c\u7684\u9663\u5217\u7d22\u5f15\uff0c\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u51fa\u932f\uff0c\u9019\u7a2e\u73fe\u8c61\u88ab\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\u3002
    • \u96dc\u6e4a\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\u3002\u8207\u9663\u5217\u64f4\u5bb9\u985e\u4f3c\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u64cd\u4f5c\u7684\u958b\u92b7\u5f88\u5927\u3002
    • \u8ca0\u8f09\u56e0\u5b50\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u4e2d\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u53cd\u6620\u4e86\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89f8\u767c\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u689d\u4ef6\u3002
    • \u93c8\u5f0f\u4f4d\u5740\u900f\u904e\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u5316\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u6240\u6709\u885d\u7a81\u5143\u7d20\u5132\u5b58\u5728\u540c\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6703\u964d\u4f4e\u67e5\u8a62\u6548\u7387\uff0c\u53ef\u4ee5\u900f\u904e\u9032\u4e00\u6b65\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4f86\u63d0\u9ad8\u6548\u7387\u3002
    • \u958b\u653e\u5b9a\u5740\u900f\u904e\u591a\u6b21\u63a2\u6e2c\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\u3002\u7dda\u6027\u63a2\u67e5\u4f7f\u7528\u56fa\u5b9a\u6b65\u9577\uff0c\u7f3a\u9ede\u662f\u4e0d\u80fd\u522a\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u7522\u751f\u805a\u96c6\u3002\u591a\u6b21\u96dc\u6e4a\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u9032\u884c\u63a2\u6e2c\uff0c\u76f8\u8f03\u7dda\u6027\u63a2\u67e5\u66f4\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u589e\u52a0\u4e86\u8a08\u7b97\u91cf\u3002
    • \u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u93c8\u5f0f\u4f4d\u5740\uff0c\u800c Python \u7684 Dict \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002
    • \u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5e0c\u671b\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5177\u6709\u78ba\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u52fb\u5206\u4f48\u7684\u7279\u9ede\u3002\u5728\u5bc6\u78bc\u5b78\u4e2d\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9084\u61c9\u8a72\u5177\u5099\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u61c9\u3002
    • \u96dc\u6e4a\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u5747\u52fb\u5206\u4f48\uff0c\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002
    • \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u65bc\u6821\u9a57\u6a94\u6848\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u65bc\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u3002
    • \u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u662f\u53ef\u96dc\u6e4a\u7684\u3002
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f \\(O(n)\\) \uff1f

    \u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u7576\u96dc\u6e4a\u51fd\u5f0f\u8a2d\u8a08\u5f97\u6bd4\u8f03\u597d\u3001\u5bb9\u91cf\u8a2d\u5b9a\u6bd4\u8f03\u5408\u7406\u3001\u885d\u7a81\u6bd4\u8f03\u5e73\u5747\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u5011\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u96dc\u6e4a\u8868\u6642\uff0c\u901a\u5e38\u8a8d\u70ba\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u4e0d\u4f7f\u7528\u96dc\u6e4a\u51fd\u5f0f \\(f(x) = x\\) \u5462\uff1f\u9019\u6a23\u5c31\u4e0d\u6703\u6709\u885d\u7a81\u4e86\u3002

    \u5728 \\(f(x) = x\\) \u96dc\u6e4a\u51fd\u5f0f\u4e0b\uff0c\u6bcf\u500b\u5143\u7d20\u5c0d\u61c9\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u9019\u8207\u9663\u5217\u7b49\u50f9\u3002\u7136\u800c\uff0c\u8f38\u5165\u7a7a\u9593\u901a\u5e38\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff08\u9663\u5217\u9577\u5ea6\uff09\uff0c\u56e0\u6b64\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96dc\u6e4a\u8868\u7684\u76ee\u6a19\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u72c0\u614b\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u7a7a\u9593\uff0c\u4e26\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8a62\u6548\u7387\u3002

    Q\uff1a\u96dc\u6e4a\u8868\u5e95\u5c64\u5be6\u73fe\u662f\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u4e8c\u5143\u6a39\uff0c\u4f46\u70ba\u4ec0\u9ebc\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u5011\u66f4\u9ad8\u5462\uff1f

    \u9996\u5148\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u6548\u7387\u8b8a\u9ad8\uff0c\u4f46\u7a7a\u9593\u6548\u7387\u8b8a\u4f4e\u4e86\u3002\u96dc\u6e4a\u8868\u6709\u76f8\u7576\u4e00\u90e8\u5206\u8a18\u61b6\u9ad4\u672a\u4f7f\u7528\u3002

    \u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u5834\u666f\u4e0b\u6642\u9593\u6548\u7387\u8b8a\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u500b\u529f\u80fd\u80fd\u5920\u5728\u76f8\u540c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u4f7f\u7528\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u90a3\u9ebc\u901a\u5e38\u6bd4\u96dc\u6e4a\u8868\u66f4\u5feb\u3002\u9019\u662f\u56e0\u70ba\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u9700\u8981\u958b\u92b7\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u7684\u5e38\u6578\u9805\u66f4\u5927\u3002

    \u6700\u5f8c\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u80fd\u767c\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u93c8\u5f0f\u4f4d\u5740\u4e2d\uff0c\u6211\u5011\u63a1\u53d6\u5728\u93c8\u7d50\u4e32\u5217\u6216\u7d05\u9ed1\u6a39\u4e2d\u57f7\u884c\u67e5\u8a62\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u6642\u9593\u7684\u98a8\u96aa\u3002

    Q\uff1a\u591a\u6b21\u96dc\u6e4a\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\u55ce\uff1f\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u9084\u80fd\u518d\u6b21\u4f7f\u7528\u55ce\uff1f

    \u591a\u6b21\u96dc\u6e4a\u662f\u958b\u653e\u5b9a\u5740\u7684\u4e00\u7a2e\uff0c\u958b\u653e\u5b9a\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u900f\u904e\u6a19\u8a18\u522a\u9664\u3002\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u7576\u5c07\u65b0\u5143\u7d20\u63d2\u5165\u96dc\u6e4a\u8868\uff0c\u4e26\u4e14\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u4f4d\u7f6e\u6642\uff0c\u8a72\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u9019\u6a23\u505a\u65e2\u80fd\u4fdd\u6301\u96dc\u6e4a\u8868\u7684\u63a2\u6e2c\u5e8f\u5217\u4e0d\u8b8a\uff0c\u53c8\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\u4f7f\u7528\u7387\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\uff0c\u67e5\u8a62\u5143\u7d20\u7684\u6642\u5019\u6703\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u5462\uff1f

    \u67e5\u8a62\u7684\u6642\u5019\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u5c0d\u61c9\u7684\u6876\u548c\u9375\u503c\u5c0d\uff0c\u767c\u73fe key \u4e0d\u5339\u914d\uff0c\u9019\u5c31\u4ee3\u8868\u6709\u96dc\u6e4a\u885d\u7a81\u3002\u56e0\u6b64\uff0c\u7dda\u6027\u63a2\u67e5\u6cd5\u6703\u6839\u64da\u9810\u5148\u8a2d\u5b9a\u7684\u6b65\u9577\u4f9d\u6b21\u5411\u4e0b\u67e5\u8a62\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u78ba\u7684\u9375\u503c\u5c0d\u6216\u7121\u6cd5\u627e\u5230\u8df3\u51fa\u70ba\u6b62\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u64f4\u5bb9\u80fd\u5920\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\uff1f

    \u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\uff0c\u8b93\u8f38\u51fa\u503c\u843d\u5728\u9663\u5217\u7d22\u5f15\u7bc4\u570d\u5167\uff1b\u5728\u64f4\u5bb9\u5f8c\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u767c\u751f\u8b8a\u5316\uff0c\u800c key \u5c0d\u61c9\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u500b\u6876\u7684\u591a\u500b key \uff0c\u5728\u64f4\u5bb9\u5f8c\u53ef\u80fd\u6703\u88ab\u5206\u914d\u5230\u591a\u500b\u6876\u4e2d\uff0c\u5f9e\u800c\u5be6\u73fe\u96dc\u6e4a\u885d\u7a81\u7684\u7de9\u89e3\u3002

    "},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806\u7a4d","text":"

    Abstract

    \u5806\u7a4d\u5c31\u50cf\u662f\u5c71\u5dbd\u5cf0\u5dd2\uff0c\u5c64\u758a\u8d77\u4f0f\u3001\u5f62\u614b\u5404\u7570\u3002

    \u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u932f\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u7e3d\u662f\u6700\u5148\u6620\u5165\u773c\u7c3e\u3002

    "},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 8.1 \u00a0 \u5806\u7a4d
    • 8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c
    • 8.3 \u00a0 Top-k \u554f\u984c
    • 8.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c","text":"

    \u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u4f86\u69cb\u5efa\u4e00\u500b\u5806\u7a4d\uff0c\u9019\u500b\u904e\u7a0b\u88ab\u7a31\u70ba\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u3002

    "},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u85c9\u52a9\u5165\u5806\u7a4d\u64cd\u4f5c\u5be6\u73fe","text":"

    \u6211\u5011\u9996\u5148\u5efa\u7acb\u4e00\u500b\u7a7a\u5806\u7a4d\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e32\u5217\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u5143\u7d20\u57f7\u884c\u201c\u5165\u5806\u7a4d\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u5806\u7a4d\u7684\u5c3e\u90e8\uff0c\u518d\u5c0d\u8a72\u5143\u7d20\u57f7\u884c\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u5806\u7a4d\u5316\u3002

    \u6bcf\u7576\u4e00\u500b\u5143\u7d20\u5165\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u65bc\u7bc0\u9ede\u662f\u5f9e\u9802\u5230\u5e95\u4f9d\u6b21\u88ab\u65b0\u589e\u9032\u4e8c\u5143\u6a39\u7684\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u69cb\u5efa\u7684\u3002

    \u8a2d\u5143\u7d20\u6578\u91cf\u70ba \\(n\\) \uff0c\u6bcf\u500b\u5143\u7d20\u7684\u5165\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u6642\u9593\uff0c\u56e0\u6b64\u8a72\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    "},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u900f\u904e\u8d70\u8a2a\u5806\u7a4d\u5316\u5be6\u73fe","text":"

    \u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5be6\u73fe\u4e00\u7a2e\u66f4\u70ba\u9ad8\u6548\u7684\u5efa\u5806\u7a4d\u65b9\u6cd5\uff0c\u5171\u5206\u70ba\u5169\u6b65\u3002

    1. \u5c07\u4e32\u5217\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u5730\u65b0\u589e\u5230\u5806\u7a4d\u4e2d\uff0c\u6b64\u6642\u5806\u7a4d\u7684\u6027\u8cea\u5c1a\u672a\u5f97\u5230\u6eff\u8db3\u3002
    2. \u5012\u5e8f\u8d70\u8a2a\u5806\u7a4d\uff08\u5c64\u5e8f\u8d70\u8a2a\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u975e\u8449\u7bc0\u9ede\u57f7\u884c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u3002

    \u6bcf\u7576\u5806\u7a4d\u5316\u4e00\u500b\u7bc0\u9ede\u5f8c\uff0c\u4ee5\u8a72\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\u5c31\u5f62\u6210\u4e00\u500b\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\u3002\u800c\u7531\u65bc\u662f\u5012\u5e8f\u8d70\u8a2a\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u69cb\u5efa\u7684\u3002

    \u4e4b\u6240\u4ee5\u9078\u64c7\u5012\u5e8f\u8d70\u8a2a\uff0c\u662f\u56e0\u70ba\u9019\u6a23\u80fd\u5920\u4fdd\u8b49\u7576\u524d\u7bc0\u9ede\u4e4b\u4e0b\u7684\u5b50\u6a39\u5df2\u7d93\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u9019\u6a23\u5806\u7a4d\u5316\u7576\u524d\u7bc0\u9ede\u624d\u662f\u6709\u6548\u7684\u3002

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u7531\u65bc\u8449\u7bc0\u9ede\u6c92\u6709\u5b50\u7bc0\u9ede\uff0c\u56e0\u6b64\u5b83\u5011\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u7121\u9808\u5806\u7a4d\u5316\u3002\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u6700\u5f8c\u4e00\u500b\u975e\u8449\u7bc0\u9ede\u662f\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u6211\u5011\u5f9e\u5b83\u958b\u59cb\u5012\u5e8f\u8d70\u8a2a\u4e26\u57f7\u884c\u5806\u7a4d\u5316\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def __init__(self, nums: list[int]):\n    \"\"\"\u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\"\"\"\n    # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    self.max_heap = nums\n    # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
    my_heap.cpp
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(vector<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums;\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.java
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<Integer> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.cs
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new List<int>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
    my_heap.go
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        h.siftDown(i)\n    }\n    return h\n}\n
    my_heap.swift
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\ninit(nums: [Int]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
    my_heap.js
    /* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
    my_heap.ts
    /* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums?: number[]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
    my_heap.dart
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<int> nums) {\n  // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  _maxHeap = nums;\n  // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
    my_heap.rs
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
    my_heap.c
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
    my_heap.kt
    /* \u5927\u9802\u5806\u7a4d */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u4e32\u5217\u800c\u975e\u9663\u5217\uff0c\u9019\u6a23\u7121\u9808\u8003\u616e\u64f4\u5bb9\u554f\u984c\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\n    init {\n        // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n        maxHeap.addAll(nums!!)\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u63db\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    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    fun push(_val: Int) {\n        // \u65b0\u589e\u7bc0\u9ede\n        maxHeap.add(_val)\n        // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n            val p = parent(i)\n            // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, p)\n            // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806\u7a4d */\n    fun pop(): Int {\n        // \u5224\u7a7a\u8655\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u522a\u9664\u7bc0\u9ede\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n        return _val\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, ma)\n            // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n            i = ma\n        }\n    }\n\n    /* \u5217\u5370\u5806\u7a4d\uff08\u4e8c\u5143\u6a39\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
    [class]{MaxHeap}-[func]{__init__}\n
    my_heap.zig
    // \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\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    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u4e0b\u9762\uff0c\u6211\u5011\u4f86\u5617\u8a66\u63a8\u7b97\u7b2c\u4e8c\u7a2e\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

    • \u5047\u8a2d\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u5247\u8449\u7bc0\u9ede\u6578\u91cf\u70ba \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u70ba\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u7a4d\u5316\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\((n - 1) / 2\\) \u3002
    • \u5728\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u7684\u904e\u7a0b\u4e2d\uff0c\u6bcf\u500b\u7bc0\u9ede\u6700\u591a\u5806\u7a4d\u5316\u5230\u8449\u7bc0\u9ede\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u70ba\u4e8c\u5143\u6a39\u9ad8\u5ea6 \\(\\log n\\) \u3002

    \u5c07\u4e0a\u8ff0\u5169\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u7a4d\u904e\u7a0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u4f46\u9019\u500b\u4f30\u7b97\u7d50\u679c\u4e26\u4e0d\u6e96\u78ba\uff0c\u56e0\u70ba\u6211\u5011\u6c92\u6709\u8003\u616e\u5230\u4e8c\u5143\u6a39\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf\u9060\u591a\u65bc\u9802\u5c64\u7bc0\u9ede\u7684\u6027\u8cea\u3002

    \u63a5\u4e0b\u4f86\u6211\u5011\u4f86\u9032\u884c\u66f4\u70ba\u6e96\u78ba\u7684\u8a08\u7b97\u3002\u70ba\u4e86\u964d\u4f4e\u8a08\u7b97\u96e3\u5ea6\uff0c\u5047\u8a2d\u7d66\u5b9a\u4e00\u500b\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \u3001\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff0c\u8a72\u5047\u8a2d\u4e0d\u6703\u5f71\u97ff\u8a08\u7b97\u7d50\u679c\u7684\u6b63\u78ba\u6027\u3002

    \u5716 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u5404\u5c64\u7bc0\u9ede\u6578\u91cf

    \u5982\u5716 8-5 \u6240\u793a\uff0c\u7bc0\u9ede\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u7b49\u65bc\u8a72\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u800c\u8a72\u8ddd\u96e2\u6b63\u662f\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u5404\u5c64\u7684\u201c\u7bc0\u9ede\u6578\u91cf \\(\\times\\) \u7bc0\u9ede\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u7bc0\u9ede\u7684\u5806\u7a4d\u5316\u8fed\u4ee3\u6b21\u6578\u7684\u7e3d\u548c\u3002

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    \u5316\u7c21\u4e0a\u5f0f\u9700\u8981\u85c9\u52a9\u4e2d\u5b78\u7684\u6578\u5217\u77e5\u8b58\uff0c\u5148\u5c07 \\(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\u932f\u4f4d\u76f8\u6e1b\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u6e1b\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 \\]

    \u89c0\u5bdf\u4e0a\u5f0f\uff0c\u767c\u73fe \\(T(h)\\) \u662f\u4e00\u500b\u7b49\u6bd4\u6578\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6\u70ba\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} \\]

    \u9032\u4e00\u6b65\uff0c\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u8907\u96dc\u5ea6\u70ba \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806\u7a4d","text":"

    \u5806\u7a4d\uff08heap\uff09\u662f\u4e00\u7a2e\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u4e3b\u8981\u53ef\u5206\u70ba\u5169\u7a2e\u578b\u5225\uff0c\u5982\u5716 8-1 \u6240\u793a\u3002

    • \u5c0f\u9802\u5806\u7a4d\uff08min heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\leq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002
    • \u5927\u9802\u5806\u7a4d\uff08max heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\geq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002

    \u5716 8-1 \u00a0 \u5c0f\u9802\u5806\u7a4d\u8207\u5927\u9802\u5806\u7a4d

    \u5806\u7a4d\u4f5c\u70ba\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u6700\u5e95\u5c64\u7bc0\u9ede\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u3002
    • \u6211\u5011\u5c07\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u9802\u201d\uff0c\u5c07\u5e95\u5c64\u6700\u9760\u53f3\u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u5e95\u201d\u3002
    • \u5c0d\u65bc\u5927\u9802\u5806\u7a4d\uff08\u5c0f\u9802\u5806\u7a4d\uff09\uff0c\u5806\u7a4d\u9802\u5143\u7d20\uff08\u6839\u7bc0\u9ede\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
    "},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u662f\u512a\u5148\u4f47\u5217\uff08priority queue\uff09\uff0c\u9019\u662f\u4e00\u7a2e\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b9a\u7fa9\u70ba\u5177\u6709\u512a\u5148\u9806\u5e8f\u6392\u5e8f\u7684\u4f47\u5217\u3002

    \u5be6\u969b\u4e0a\uff0c\u5806\u7a4d\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u512a\u5148\u4f47\u5217\uff0c\u5927\u9802\u5806\u7a4d\u76f8\u7576\u65bc\u5143\u7d20\u6309\u5f9e\u5927\u5230\u5c0f\u7684\u9806\u5e8f\u51fa\u5217\u7684\u512a\u5148\u4f47\u5217\u3002\u5f9e\u4f7f\u7528\u89d2\u5ea6\u4f86\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u201c\u512a\u5148\u4f47\u5217\u201d\u548c\u201c\u5806\u7a4d\u201d\u770b\u4f5c\u7b49\u50f9\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u56e0\u6b64\uff0c\u672c\u66f8\u5c0d\u5169\u8005\u4e0d\u505a\u7279\u5225\u5340\u5206\uff0c\u7d71\u4e00\u7a31\u4f5c\u201c\u5806\u7a4d\u201d\u3002

    \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u898b\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

    \u8868 8-1 \u00a0 \u5806\u7a4d\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\) pop() \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) peek() \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\uff08\u5c0d\u65bc\u5927 / \u5c0f\u9802\u5806\u7a4d\u5206\u5225\u70ba\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u7372\u53d6\u5806\u7a4d\u7684\u5143\u7d20\u6578\u91cf \\(O(1)\\) isEmpty() \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a \\(O(1)\\)

    \u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u5806\u7a4d\u985e\u5225\uff08\u6216\u512a\u5148\u4f47\u5217\u985e\u5225\uff09\u3002

    \u985e\u4f3c\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u201c\u5f9e\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u5f9e\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u8a2d\u5b9a\u4e00\u500b flag \u6216\u4fee\u6539 Comparator \u5be6\u73fe\u201c\u5c0f\u9802\u5806\u7a4d\u201d\u8207\u201c\u5927\u9802\u5806\u7a4d\u201d\u4e4b\u9593\u7684\u8f49\u63db\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u7d44\u9810\u8a2d\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n# \u8003\u616e\u5c07\u201c\u5143\u7d20\u53d6\u8ca0\u201d\u5f8c\u518d\u5165\u5806\u7a4d\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5c07\u5927\u5c0f\u95dc\u4fc2\u985b\u5012\uff0c\u5f9e\u800c\u5be6\u73fe\u5927\u9802\u5806\u7a4d\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u6642\u5c0d\u61c9\u5c0f\u9802\u5806\u7a4d\uff0cflag = -1 \u6642\u5c0d\u61c9\u5927\u9802\u5806\u7a4d\n\n# \u5143\u7d20\u5165\u5806\u7a4d\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# \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\n# \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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# \u7372\u53d6\u5806\u7a4d\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
    heap.cpp
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\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\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
    heap.cs
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\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\u7a4d */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
    heap.go
    // Go \u8a9e\u8a00\u4e2d\u53ef\u4ee5\u900f\u904e\u5be6\u73fe heap.Interface \u4f86\u69cb\u5efa\u6574\u6578\u5927\u9802\u5806\u7a4d\n// \u5be6\u73fe heap.Interface \u9700\u8981\u540c\u6642\u5be6\u73fe sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u63a8\u5165\u5143\u7d20\u5230\u5806\u7a4d\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u70ba\u53c3\u6578\n    // \u56e0\u70ba\u5b83\u5011\u4e0d\u50c5\u6703\u5c0d\u5207\u7247\u7684\u5167\u5bb9\u9032\u884c\u8abf\u6574\uff0c\u9084\u6703\u4fee\u6539\u5207\u7247\u7684\u9577\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u5f48\u51fa\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u7a4d\u5143\u7d20\u5b58\u653e\u5728\u6700\u5f8c\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\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\uff0c\u5247\u9700\u8981\u8abf\u6574\u70ba\u5c0f\u65bc\u865f\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 \u7372\u53d6\u5806\u7a4d\u9802\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\u7a4d */\n    // \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u65b0\u589e\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    /* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u7a4d\u9802\u5143\u7d20\u70ba %d\\n\", top)\n\n    /* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\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    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u7a4d\u5143\u7d20\u6578\u91cf\u70ba %d\\n\", size)\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u7a4d\u662f\u5426\u70ba\u7a7a %t\\n\", isEmpty)\n}\n
    heap.swift
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// Swift \u7684 Heap \u578b\u5225\u540c\u6642\u652f\u6301\u6700\u5927\u5806\u7a4d\u548c\u6700\u5c0f\u5806\u7a4d\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
    heap.js
    // JavaScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.ts
    // TypeScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.dart
    // Dart \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.rs
    use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
    heap.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.kt
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
    heap.rb
    \n
    heap.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7a4d\u7684\u5be6\u73fe","text":"

    \u4e0b\u6587\u5be6\u73fe\u7684\u662f\u5927\u9802\u5806\u7a4d\u3002\u82e5\u8981\u5c07\u5176\u8f49\u63db\u70ba\u5c0f\u9802\u5806\u7a4d\uff0c\u53ea\u9700\u5c07\u6240\u6709\u5927\u5c0f\u908f\u8f2f\u5224\u65b7\u53d6\u9006\uff08\u4f8b\u5982\uff0c\u5c07 \\(\\geq\\) \u66ff\u63db\u70ba \\(\\leq\\) \uff09\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

    "},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7a4d\u7684\u5132\u5b58\u8207\u8868\u793a","text":"

    \u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u8b1b\u904e\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u7531\u65bc\u5806\u7a4d\u6b63\u662f\u4e00\u7a2e\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u56e0\u6b64\u6211\u5011\u5c07\u63a1\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002

    \u7576\u4f7f\u7528\u9663\u5217\u8868\u793a\u4e8c\u5143\u6a39\u6642\uff0c\u5143\u7d20\u4ee3\u8868\u7bc0\u9ede\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u7bc0\u9ede\u5728\u4e8c\u5143\u6a39\u4e2d\u7684\u4f4d\u7f6e\u3002\u7bc0\u9ede\u6307\u6a19\u900f\u904e\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u4f86\u5be6\u73fe\u3002

    \u5982\u5716 8-2 \u6240\u793a\uff0c\u7d66\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 2\\) \uff0c\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u7576\u7d22\u5f15\u8d8a\u754c\u6642\uff0c\u8868\u793a\u7a7a\u7bc0\u9ede\u6216\u7bc0\u9ede\u4e0d\u5b58\u5728\u3002

    \u5716 8-2 \u00a0 \u5806\u7a4d\u7684\u8868\u793a\u8207\u5132\u5b58

    \u6211\u5011\u53ef\u4ee5\u5c07\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def left(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
    my_heap.cpp
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.java
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.cs
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.go
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\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
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.js
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.ts
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.dart
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rs
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.c
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
    my_heap.kt
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\n
    my_heap.zig
    // \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u7372\u53d6\u7236\u7bc0\u9ede\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 \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20","text":"

    \u5806\u7a4d\u9802\u5143\u7d20\u5373\u70ba\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u4e5f\u5c31\u662f\u4e32\u5217\u7684\u9996\u500b\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def peek(self) -> int:\n    \"\"\"\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
    my_heap.cpp
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
    my_heap.java
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
    my_heap.cs
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
    my_heap.go
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
    my_heap.swift
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
    my_heap.js
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
    my_heap.ts
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
    my_heap.dart
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
    my_heap.rs
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
    my_heap.c
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
    my_heap.kt
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{peek}\n
    my_heap.zig
    // \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806\u7a4d","text":"

    \u7d66\u5b9a\u5143\u7d20 val \uff0c\u6211\u5011\u9996\u5148\u5c07\u5176\u65b0\u589e\u5230\u5806\u7a4d\u5e95\u3002\u65b0\u589e\u4e4b\u5f8c\uff0c\u7531\u65bc val \u53ef\u80fd\u5927\u65bc\u5806\u7a4d\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7a4d\u7684\u6210\u7acb\u689d\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u58de\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u5fa9\u5f9e\u63d2\u5165\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u9019\u500b\u64cd\u4f5c\u88ab\u7a31\u70ba\u5806\u7a4d\u5316\uff08heapify\uff09\u3002

    \u8003\u616e\u5f9e\u5165\u5806\u7a4d\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u5806\u7a4d\u5316\u3002\u5982\u5716 8-3 \u6240\u793a\uff0c\u6211\u5011\u6bd4\u8f03\u63d2\u5165\u7bc0\u9ede\u8207\u5176\u7236\u7bc0\u9ede\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u7bc0\u9ede\u66f4\u5927\uff0c\u5247\u5c07\u5b83\u5011\u4ea4\u63db\u3002\u7136\u5f8c\u7e7c\u7e8c\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u5f9e\u5e95\u81f3\u9802\u4fee\u5fa9\u5806\u7a4d\u4e2d\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u76f4\u81f3\u8d8a\u904e\u6839\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

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

    \u5716 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u7a4d\u6b65\u9a5f

    \u8a2d\u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \uff0c\u5247\u6a39\u7684\u9ad8\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u7a4d\u5316\u64cd\u4f5c\u7684\u8ff4\u5708\u8f2a\u6578\u6700\u591a\u70ba \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\u7a4d\"\"\"\n    # \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.append(val)\n    # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p = self.parent(i)\n        # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p)\n        # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n
    my_heap.cpp
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.push_back(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap[i], maxHeap[p]);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid Push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.Add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc (h *maxHeap) push(val any) {\n    // \u65b0\u589e\u7bc0\u9ede\n    h.data = append(h.data, val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p := h.parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc push(val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.append(val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = parent(i: i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.#maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.#parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val: number): void {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n  // \u65b0\u589e\u7bc0\u9ede\n  _maxHeap.add(val);\n  // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    int p = _parent(i);\n    // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, p);\n    // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfn push(&mut self, val: i32) {\n    // \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u7bc0\u9ede i \u5df2\u7d93\u662f\u5806\u7a4d\u9802\u7bc0\u9ede\u4e86\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if i == 0 {\n            break;\n        }\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = Self::parent(i);\n        // \u7576\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c\u4e0d\u61c9\u8a72\u65b0\u589e\u9019\u9ebc\u591a\u7bc0\u9ede\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(maxHeap, i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfun push(_val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(_val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        val p = parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\n
    my_heap.zig
    // \u5143\u7d20\u5165\u5806\u7a4d\nfn push(self: *Self, val: T) !void {\n    // \u65b0\u589e\u7bc0\u9ede\n    try self.max_heap.?.append(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        var p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d","text":"

    \u5806\u7a4d\u9802\u5143\u7d20\u662f\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u5373\u4e32\u5217\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u5011\u76f4\u63a5\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\uff0c\u90a3\u9ebc\u4e8c\u5143\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u7d22\u5f15\u90fd\u6703\u767c\u751f\u8b8a\u5316\uff0c\u9019\u5c07\u4f7f\u5f97\u5f8c\u7e8c\u4f7f\u7528\u5806\u7a4d\u5316\u9032\u884c\u4fee\u5fa9\u8b8a\u5f97\u56f0\u96e3\u3002\u70ba\u4e86\u5118\u91cf\u6e1b\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u8b8a\u52d5\uff0c\u6211\u5011\u63a1\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9a5f\u3002

    1. \u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff09\u3002
    2. \u4ea4\u63db\u5b8c\u6210\u5f8c\uff0c\u5c07\u5806\u7a4d\u5e95\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\uff08\u6ce8\u610f\uff0c\u7531\u65bc\u5df2\u7d93\u4ea4\u63db\uff0c\u56e0\u6b64\u5be6\u969b\u4e0a\u522a\u9664\u7684\u662f\u539f\u4f86\u7684\u5806\u7a4d\u9802\u5143\u7d20\uff09\u3002
    3. \u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u3002

    \u5982\u5716 8-4 \u6240\u793a\uff0c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u8207\u201c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\u201d\u76f8\u53cd\uff0c\u6211\u5011\u5c07\u6839\u7bc0\u9ede\u7684\u503c\u8207\u5176\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u503c\u9032\u884c\u6bd4\u8f03\uff0c\u5c07\u6700\u5927\u7684\u5b50\u7bc0\u9ede\u8207\u6839\u7bc0\u9ede\u4ea4\u63db\u3002\u7136\u5f8c\u8ff4\u5708\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

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

    \u5716 8-4 \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u6b65\u9a5f

    \u8207\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\u7a4d\"\"\"\n    # \u5224\u7a7a\u8655\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u522a\u9664\u7bc0\u9ede\n    val = self.max_heap.pop()\n    # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma)\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n
    my_heap.cpp
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nvoid pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u7a4d\u70ba\u7a7a\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u522a\u9664\u7bc0\u9ede\n    maxHeap.pop_back();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.remove(size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint Pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u201d\u6216\u201c\u8d8a\u904e\u8449\u7bc0\u9ede\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u8655\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u522a\u9664\u7bc0\u9ede\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, max)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u8655\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    let val = maxHeap.remove(at: size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\npop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u7a4d\u70ba\u7a7a');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.#maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\npop(): number {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n  // \u5224\u7a7a\u8655\u7406\n  if (isEmpty()) throw Exception('\u5806\u7a4d\u70ba\u7a7a');\n  // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u522a\u9664\u7bc0\u9ede\n  int val = _maxHeap.removeLast();\n  // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, ma);\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u8655\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    let val = self.max_heap.remove(self.size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, max);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfun pop(): Int {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return _val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\n
    my_heap.zig
    // \u5143\u7d20\u51fa\u5806\u7a4d\nfn pop(self: *Self) !T {\n    // \u5224\u65b7\u8655\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    var val = self.max_heap.?.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n} \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7a4d\u7684\u5e38\u898b\u61c9\u7528","text":"
    • \u512a\u5148\u4f47\u5217\uff1a\u5806\u7a4d\u901a\u5e38\u4f5c\u70ba\u5be6\u73fe\u512a\u5148\u4f47\u5217\u7684\u9996\u9078\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \uff0c\u800c\u5efa\u968a\u64cd\u4f5c\u70ba \\(O(n)\\) \uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
    • \u5806\u7a4d\u6392\u5e8f\uff1a\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u5b83\u5011\u5efa\u7acb\u4e00\u500b\u5806\u7a4d\uff0c\u7136\u5f8c\u4e0d\u65b7\u5730\u57f7\u884c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u8cc7\u6599\u3002\u7136\u800c\uff0c\u6211\u5011\u901a\u5e38\u6703\u4f7f\u7528\u4e00\u7a2e\u66f4\u512a\u96c5\u7684\u65b9\u5f0f\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\uff0c\u8a73\u898b\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u7ae0\u7bc0\u3002
    • \u7372\u53d6\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\uff1a\u9019\u662f\u4e00\u500b\u7d93\u5178\u7684\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u540c\u6642\u4e5f\u662f\u4e00\u7a2e\u5178\u578b\u61c9\u7528\uff0c\u4f8b\u5982\u9078\u64c7\u71b1\u5ea6\u524d 10 \u7684\u65b0\u805e\u4f5c\u70ba\u5fae\u535a\u71b1\u641c\uff0c\u9078\u53d6\u92b7\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5806\u7a4d\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u6839\u64da\u6210\u7acb\u689d\u4ef6\u53ef\u5206\u70ba\u5927\u9802\u5806\u7a4d\u548c\u5c0f\u9802\u5806\u7a4d\u3002\u5927\uff08\u5c0f\uff09\u9802\u5806\u7a4d\u7684\u5806\u7a4d\u9802\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
    • \u512a\u5148\u4f47\u5217\u7684\u5b9a\u7fa9\u662f\u5177\u6709\u51fa\u5217\u512a\u5148\u9806\u5e8f\u7684\u4f47\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u7a4d\u4f86\u5be6\u73fe\u3002
    • \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\)\u3001\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) \u548c\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
    • \u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u8868\u793a\uff0c\u56e0\u6b64\u6211\u5011\u901a\u5e38\u4f7f\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002
    • \u5806\u7a4d\u5316\u64cd\u4f5c\u7528\u65bc\u7dad\u8b77\u5806\u7a4d\u7684\u6027\u8cea\uff0c\u5728\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u90fd\u6703\u7528\u5230\u3002
    • \u8f38\u5165 \\(n\\) \u500b\u5143\u7d20\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
    • Top-k \u662f\u4e00\u500b\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u9ad8\u6548\u89e3\u6c7a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8cc7\u6599\u7d50\u69cb\u7684\u201c\u5806\u7a4d\u201d\u8207\u8a18\u61b6\u9ad4\u7ba1\u7406\u7684\u201c\u5806\u7a4d\u201d\u662f\u540c\u4e00\u500b\u6982\u5ff5\u55ce\uff1f

    \u5169\u8005\u4e0d\u662f\u540c\u4e00\u500b\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u7a4d\u201d\u3002\u8a08\u7b97\u6a5f\u7cfb\u7d71\u8a18\u61b6\u9ad4\u4e2d\u7684\u5806\u7a4d\u662f\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6642\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u5132\u5b58\u8cc7\u6599\u3002\u7a0b\u5f0f\u53ef\u4ee5\u8acb\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u7a4d\u8a18\u61b6\u9ad4\uff0c\u7528\u65bc\u5132\u5b58\u5982\u7269\u4ef6\u548c\u9663\u5217\u7b49\u8907\u96dc\u7d50\u69cb\u3002\u7576\u9019\u4e9b\u8cc7\u6599\u4e0d\u518d\u9700\u8981\u6642\uff0c\u7a0b\u5f0f\u9700\u8981\u91cb\u653e\u9019\u4e9b\u8a18\u61b6\u9ad4\uff0c\u4ee5\u9632\u6b62\u8a18\u61b6\u9ad4\u6d41\u5931\u3002\u76f8\u8f03\u65bc\u5806\u758a\u8a18\u61b6\u9ad4\uff0c\u5806\u7a4d\u8a18\u61b6\u9ad4\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8b39\u614e\uff0c\u4f7f\u7528\u4e0d\u7576\u53ef\u80fd\u6703\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d41\u5931\u548c\u91ce\u6307\u6a19\u7b49\u554f\u984c\u3002

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u7121\u5e8f\u9663\u5217 nums \uff0c\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002

    \u5c0d\u65bc\u8a72\u554f\u984c\uff0c\u6211\u5011\u5148\u4ecb\u7d39\u5169\u7a2e\u601d\u8def\u6bd4\u8f03\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7d39\u6548\u7387\u66f4\u9ad8\u7684\u5806\u7a4d\u89e3\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u8d70\u8a2a\u9078\u64c7","text":"

    \u6211\u5011\u53ef\u4ee5\u9032\u884c\u5716 8-6 \u6240\u793a\u7684 \\(k\\) \u8f2a\u8d70\u8a2a\uff0c\u5206\u5225\u5728\u6bcf\u8f2a\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\) \u3002

    \u6b64\u65b9\u6cd5\u53ea\u9069\u7528\u65bc \\(k \\ll n\\) \u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u7576 \\(k\\) \u8207 \\(n\\) \u6bd4\u8f03\u63a5\u8fd1\u6642\uff0c\u5176\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411\u65bc \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u6642\u3002

    \u5716 8-6 \u00a0 \u8d70\u8a2a\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    Tip

    \u7576 \\(k = n\\) \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u6642\u7b49\u50f9\u65bc\u201c\u9078\u64c7\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

    \u5982\u5716 8-7 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u5c0d\u9663\u5217 nums \u9032\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u908a\u7684 \\(k\\) \u500b\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u986f\u7136\uff0c\u8a72\u65b9\u6cd5\u201c\u8d85\u984d\u201d\u5b8c\u6210\u4efb\u52d9\u4e86\uff0c\u56e0\u70ba\u6211\u5011\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

    \u5716 8-7 \u00a0 \u6392\u5e8f\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    "},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806\u7a4d","text":"

    \u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u5806\u7a4d\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u6c7a Top-k \u554f\u984c\uff0c\u6d41\u7a0b\u5982\u5716 8-8 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u5176\u5806\u7a4d\u9802\u5143\u7d20\u6700\u5c0f\u3002
    2. \u5148\u5c07\u9663\u5217\u7684\u524d \\(k\\) \u500b\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u7a4d\u3002
    3. \u5f9e\u7b2c \\(k + 1\\) \u500b\u5143\u7d20\u958b\u59cb\uff0c\u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\uff0c\u4e26\u5c07\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\u3002
    4. \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u5806\u7a4d\u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 8-8 \u00a0 \u57fa\u65bc\u5806\u7a4d\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    heap = []\n    # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in range(k, len(nums)):\n        # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
    top_k.cpp
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    PriorityQueue<int, int> heap = new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u4e26\u5c07\u524d k \u500b\u5143\u7d20\u5efa\u5806\u7a4d\n    var heap = Heap(nums.prefix(k))\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.ts
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.dart
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\uff0c\u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9802\u5806\u7a4d\uff0c\u4f7f\u7528 Reverse \u5c07\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\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\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\u7684\u51fd\u5f0f\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delMaxHeap(maxHeap);\n    return res;\n}\n
    top_k.kt
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    val heap = PriorityQueue<Int>()\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (i in k..<nums.size) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
    top_k.rb
    [class]{}-[func]{top_k_heap}\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u5171\u57f7\u884c\u4e86 \\(n\\) \u8f2a\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u6700\u5927\u9577\u5ea6\u70ba \\(k\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002\u8a72\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u7576 \\(k\\) \u8f03\u5c0f\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \uff1b\u7576 \\(k\\) \u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u6703\u8d85\u904e \\(O(n \\log n)\\) \u3002

    \u53e6\u5916\uff0c\u8a72\u65b9\u6cd5\u9069\u7528\u65bc\u52d5\u614b\u8cc7\u6599\u6d41\u7684\u4f7f\u7528\u5834\u666f\u3002\u5728\u4e0d\u65b7\u52a0\u5165\u8cc7\u6599\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u6301\u7e8c\u7dad\u8b77\u5806\u7a4d\u5167\u7684\u5143\u7d20\uff0c\u5f9e\u800c\u5be6\u73fe\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u7684\u52d5\u614b\u66f4\u65b0\u3002

    "},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

    \u5e7e\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u528d\u6307 Offer\u201d\u7cfb\u5217\u984c\u89e3\uff0c\u53d7\u5230\u4e86\u8a31\u591a\u8b80\u8005\u7684\u9f13\u52f5\u548c\u652f\u6301\u3002\u5728\u8207\u8b80\u8005\u4ea4\u6d41\u671f\u9593\uff0c\u6211\u6700\u5e38\u88ab\u554f\u7684\u4e00\u500b\u554f\u984c\u662f\u201c\u5982\u4f55\u5165\u9580\u6f14\u7b97\u6cd5\u201d\u3002\u9010\u6f38\u5730\uff0c\u6211\u5c0d\u9019\u500b\u554f\u984c\u7522\u751f\u4e86\u6fc3\u539a\u7684\u8208\u8da3\u3002

    \u5169\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u984c\u4f3c\u4e4e\u662f\u6700\u53d7\u6b61\u8fce\u7684\u65b9\u6cd5\uff0c\u7c21\u55ae\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u984c\u5c31\u5982\u540c\u73a9\u201c\u6383\u96f7\u201d\u904a\u6232\uff0c\u81ea\u5b78\u80fd\u529b\u5f37\u7684\u4eba\u80fd\u5920\u9806\u5229\u5c07\u5730\u96f7\u9010\u500b\u6392\u6389\uff0c\u800c\u57fa\u790e\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6eff\u982d\u662f\u5305\uff0c\u4e26\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7e2e\u3002\u901a\u8b80\u6559\u6750\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u505a\u6cd5\uff0c\u4f46\u5c0d\u65bc\u9762\u5411\u6c42\u8077\u7684\u4eba\u4f86\u8aaa\uff0c\u7562\u696d\u8ad6\u6587\u3001\u6295\u905e\u7c21\u6b77\u3001\u6e96\u5099\u7b46\u8a66\u548c\u9762\u8a66\u5df2\u7d93\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u66f8\u5f80\u5f80\u8b8a\u6210\u4e86\u4e00\u9805\u8271\u9245\u7684\u6311\u6230\u3002

    \u5982\u679c\u4f60\u4e5f\u9762\u81e8\u985e\u4f3c\u7684\u56f0\u64fe\uff0c\u90a3\u9ebc\u5f88\u5e78\u904b\u9019\u672c\u66f8\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u66f8\u662f\u6211\u5c0d\u9019\u500b\u554f\u984c\u7d66\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u512a\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u7a4d\u6975\u7684\u5617\u8a66\u3002\u672c\u66f8\u96d6\u7136\u4e0d\u8db3\u4ee5\u8b93\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u6703\u5f15\u5c0e\u4f60\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u201c\u77e5\u8b58\u5730\u5716\u201d\uff0c\u5e36\u4f60\u77ad\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72c0\u3001\u5927\u5c0f\u548c\u5206\u4f48\u4f4d\u7f6e\uff0c\u8b93\u4f60\u638c\u63e1\u5404\u7a2e\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u9019\u4e9b\u672c\u9818\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u984c\u548c\u95b1\u8b80\u6587\u737b\uff0c\u9010\u6b65\u69cb\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8b58\u9ad4\u7cfb\u3002

    \u6211\u6df1\u6df1\u8d0a\u540c\u8cbb\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u5f9e\u9019\u500b\u610f\u7fa9\u4e0a\u770b\uff0c\u9019\u672c\u66f8\u4e26\u975e\u5b8c\u5168\u201c\u514d\u8cbb\u201d\u3002\u70ba\u4e86\u4e0d\u8f9c\u8ca0\u4f60\u70ba\u672c\u66f8\u6240\u4ed8\u51fa\u7684\u5bf6\u8cb4\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u6703\u7aed\u76e1\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u4f86\u5b8c\u6210\u672c\u66f8\u7684\u5275\u4f5c\u3002

    \u672c\u4eba\u81ea\u77e5\u5b78\u758f\u624d\u6dfa\uff0c\u66f8\u4e2d\u5167\u5bb9\u96d6\u7136\u5df2\u7d93\u904e\u4e00\u6bb5\u6642\u9593\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8a31\u591a\u932f\u8aa4\uff0c\u61c7\u8acb\u5404\u4f4d\u8001\u5e2b\u548c\u540c\u5b78\u6279\u8a55\u6307\u6b63\u3002

    Hello\uff0c\u6f14\u7b97\u6cd5\uff01

    \u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u7d66\u4e16\u754c\u5e36\u4f86\u4e86\u5de8\u5927\u8b8a\u9769\uff0c\u5b83\u6191\u85c9\u9ad8\u901f\u7684\u8a08\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7a0b\u5f0f\u8a2d\u8a08\u6027\uff0c\u6210\u70ba\u4e86\u57f7\u884c\u6f14\u7b97\u6cd5\u8207\u8655\u7406\u8cc7\u6599\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u7121\u8ad6\u662f\u96fb\u5b50\u904a\u6232\u7684\u903c\u771f\u756b\u9762\u3001\u81ea\u52d5\u99d5\u99db\u7684\u667a\u6167\u6c7a\u7b56\uff0c\u9084\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4e92\u52d5\uff0c\u9019\u4e9b\u61c9\u7528\u90fd\u662f\u6f14\u7b97\u6cd5\u5728\u8a08\u7b97\u6a5f\u4e0a\u7684\u7cbe\u5999\u6f14\u7e79\u3002

    \u4e8b\u5be6\u4e0a\uff0c\u5728\u8a08\u7b97\u6a5f\u554f\u4e16\u4e4b\u524d\uff0c\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u5c31\u5df2\u7d93\u5b58\u5728\u65bc\u4e16\u754c\u7684\u5404\u500b\u89d2\u843d\u3002\u65e9\u671f\u7684\u6f14\u7b97\u6cd5\u76f8\u5c0d\u7c21\u55ae\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8a08\u6578\u65b9\u6cd5\u548c\u5de5\u5177\u88fd\u4f5c\u6b65\u9a5f\u7b49\u3002\u96a8\u8457\u6587\u660e\u7684\u9032\u6b65\uff0c\u6f14\u7b97\u6cd5\u9010\u6f38\u8b8a\u5f97\u66f4\u52a0\u7cbe\u7d30\u548c\u8907\u96dc\u3002\u5f9e\u5de7\u596a\u5929\u5de5\u7684\u5320\u4eba\u6280\u85dd\u3001\u5230\u89e3\u653e\u751f\u7522\u529b\u7684\u5de5\u696d\u7522\u54c1\u3001\u518d\u5230\u5b87\u5b99\u57f7\u884c\u7684\u79d1\u5b78\u898f\u5f8b\uff0c\u5e7e\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u9a5a\u6b4e\u7684\u4e8b\u7269\u80cc\u5f8c\uff0c\u90fd\u96b1\u85cf\u8457\u7cbe\u5999\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002

    \u540c\u6a23\uff0c\u8cc7\u6599\u7d50\u69cb\u7121\u8655\u4e0d\u5728\uff1a\u5927\u5230\u793e\u6703\u7db2\u8def\uff0c\u5c0f\u5230\u5730\u9435\u7dda\u8def\uff0c\u8a31\u591a\u7cfb\u7d71\u90fd\u53ef\u4ee5\u5efa\u6a21\u70ba\u201c\u5716\u201d\uff1b\u5927\u5230\u4e00\u500b\u570b\u5bb6\uff0c\u5c0f\u5230\u4e00\u500b\u5bb6\u5ead\uff0c\u793e\u6703\u7684\u4e3b\u8981\u7d44\u7e54\u5f62\u5f0f\u5448\u73fe\u51fa\u201c\u6a39\u201d\u7684\u7279\u5fb5\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u5806\u758a\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u5f8c\u624d\u80fd\u812b\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5247\u5982\u540c\u201c\u4f47\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u500b\u201c\u96dc\u6e4a\u8868\u201d\uff0c\u80fd\u5920\u5feb\u901f\u67e5\u8a62\u76ee\u6a19\u8a5e\u689d\u3002

    \u672c\u66f8\u65e8\u5728\u900f\u904e\u6e05\u6670\u6613\u61c2\u7684\u52d5\u756b\u5716\u89e3\u548c\u53ef\u57f7\u884c\u7684\u7a0b\u5f0f\u78bc\u793a\u4f8b\uff0c\u4f7f\u8b80\u8005\u7406\u89e3\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u4e26\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u4f86\u5be6\u73fe\u5b83\u5011\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u672c\u66f8\u81f4\u529b\u65bc\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u8907\u96dc\u4e16\u754c\u4e2d\u7684\u751f\u52d5\u9ad4\u73fe\uff0c\u5c55\u73fe\u6f14\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u66f8\u80fd\u5920\u5e6b\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8b58\u6f14\u7b97\u6cd5","text":"

    Abstract

    \u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u8207\u8cc7\u6599\u4ea4\u7e54\u5728\u4e00\u8d77\uff0c\u88d9\u896c\u4e0a\u98c4\u63da\u8457\u6f14\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

    \u5979\u9080\u8acb\u4f60\u5171\u821e\uff0c\u8acb\u7dca\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6eff\u908f\u8f2f\u8207\u7f8e\u611f\u7684\u6f14\u7b97\u6cd5\u4e16\u754c\u3002

    "},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728
    • 1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc
    • 1.3 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728","text":"

    \u7576\u6211\u5011\u807d\u5230\u201c\u6f14\u7b97\u6cd5\u201d\u9019\u500b\u8a5e\u6642\uff0c\u5f88\u81ea\u7136\u5730\u6703\u60f3\u5230\u6578\u5b78\u3002\u7136\u800c\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u6d89\u53ca\u8907\u96dc\u6578\u5b78\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8cf4\u57fa\u672c\u908f\u8f2f\uff0c\u9019\u4e9b\u908f\u8f2f\u5728\u6211\u5011\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u8655\u8655\u53ef\u898b\u3002

    \u5728\u6b63\u5f0f\u63a2\u8a0e\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u500b\u6709\u8da3\u7684\u4e8b\u5be6\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u4e26\u7fd2\u6163\u5c07\u5b83\u5011\u61c9\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c07\u8209\u5e7e\u500b\u5177\u9ad4\u7684\u4f8b\u5b50\u4f86\u8b49\u5be6\u9019\u4e00\u9ede\u3002

    \u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u88e1\uff0c\u6bcf\u500b\u6f22\u5b57\u90fd\u5c0d\u61c9\u4e00\u500b\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\u7684\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u67e5\u8a62\u4e00\u500b\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u6703\u6309\u7167\u5716 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5be6\u73fe\u3002

    1. \u7ffb\u958b\u5b57\u5178\u7d04\u4e00\u534a\u7684\u9801\u6578\uff0c\u6aa2\u8996\u8a72\u9801\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u9ebc\uff0c\u5047\u8a2d\u9996\u5b57\u6bcd\u70ba \\(m\\) \u3002
    2. \u7531\u65bc\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u65bc \\(m\\) \u4e4b\u5f8c\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u8a62\u7bc4\u570d\u7e2e\u5c0f\u5230\u5f8c\u534a\u90e8\u5206\u3002
    3. \u4e0d\u65b7\u91cd\u8907\u6b65\u9a5f 1. \u548c \u6b65\u9a5f 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u9801\u78bc\u70ba\u6b62\u3002
    <1><2><3><4><5>

    \u5716 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9a5f

    \u67e5\u5b57\u5178\u9019\u500b\u5c0f\u5b78\u751f\u5fc5\u5099\u6280\u80fd\uff0c\u5be6\u969b\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u6f14\u7b97\u6cd5\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b57\u5178\u8996\u70ba\u4e00\u500b\u5df2\u6392\u5e8f\u7684\u201c\u9663\u5217\u201d\uff1b\u5f9e\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u3002

    \u4f8b\u4e8c\uff1a\u6574\u7406\u64b2\u514b\u3002\u6211\u5011\u5728\u6253\u724c\u6642\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u64b2\u514b\u724c\uff0c\u4f7f\u5176\u5f9e\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5be6\u73fe\u6d41\u7a0b\u5982\u5716 1-2 \u6240\u793a\u3002

    1. \u5c07\u64b2\u514b\u724c\u5283\u5206\u70ba\u201c\u6709\u5e8f\u201d\u548c\u201c\u7121\u5e8f\u201d\u5169\u90e8\u5206\uff0c\u4e26\u5047\u8a2d\u521d\u59cb\u72c0\u614b\u4e0b\u6700\u5de6 1 \u5f35\u64b2\u514b\u724c\u5df2\u7d93\u6709\u5e8f\u3002
    2. \u5728\u7121\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f35\u64b2\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u78ba\u4f4d\u7f6e\uff1b\u5b8c\u6210\u5f8c\u6700\u5de6 2 \u5f35\u64b2\u514b\u5df2\u7d93\u6709\u5e8f\u3002
    3. \u4e0d\u65b7\u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u6bcf\u4e00\u8f2a\u5c07\u4e00\u5f35\u64b2\u514b\u724c\u5f9e\u7121\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u64b2\u514b\u724c\u90fd\u6709\u5e8f\u3002

    \u5716 1-2 \u00a0 \u64b2\u514b\u6392\u5e8f\u6b65\u9a5f

    \u4e0a\u8ff0\u6574\u7406\u64b2\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\uff0c\u5b83\u5728\u8655\u7406\u5c0f\u578b\u8cc7\u6599\u96c6\u6642\u975e\u5e38\u9ad8\u6548\u3002\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u7684\u6392\u5e8f\u5eab\u51fd\u5f0f\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

    \u4f8b\u4e09\uff1a\u8ca8\u5e63\u627e\u96f6\u3002\u5047\u8a2d\u6211\u5011\u5728\u8d85\u5e02\u8cfc\u8cb7\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7d66\u4e86\u6536\u9280\u54e1 \\(100\\) \u5143\uff0c\u5247\u6536\u9280\u54e1\u9700\u8981\u627e\u6211\u5011 \\(31\\) \u5143\u3002\u4ed6\u6703\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u5716 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

    1. \u53ef\u9078\u9805\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8ca8\u5e63\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
    2. \u5f9e\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u9918 \\(31 - 20 = 11\\) \u5143\u3002
    3. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u9918 \\(11 - 10 = 1\\) \u5143\u3002
    4. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u9918 \\(1 - 1 = 0\\) \u5143\u3002
    5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u70ba \\(20 + 10 + 1 = 31\\) \u5143\u3002

    \u5716 1-3 \u00a0 \u8ca8\u5e63\u627e\u96f6\u904e\u7a0b

    \u5728\u4ee5\u4e0a\u6b65\u9a5f\u4e2d\uff0c\u6211\u5011\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\uff08\u5118\u53ef\u80fd\u7528\u5927\u9762\u984d\u7684\u8ca8\u5e63\uff09\uff0c\u6700\u7d42\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u8caa\u5a6a\u201d\u6f14\u7b97\u6cd5\u3002

    \u5c0f\u5230\u70f9\u98ea\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u969b\u822a\u884c\uff0c\u5e7e\u4e4e\u6240\u6709\u554f\u984c\u7684\u89e3\u6c7a\u90fd\u96e2\u4e0d\u958b\u6f14\u7b97\u6cd5\u3002\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u4f7f\u5f97\u6211\u5011\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u5c07\u8cc7\u6599\u7d50\u69cb\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\uff0c\u540c\u6642\u7de8\u5beb\u7a0b\u5f0f\u78bc\u547c\u53eb CPU \u548c GPU \u57f7\u884c\u6f14\u7b97\u6cd5\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u6211\u5011\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u554f\u984c\u8f49\u79fb\u5230\u8a08\u7b97\u6a5f\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u6c7a\u5404\u7a2e\u8907\u96dc\u554f\u984c\u3002

    Tip

    \u5982\u679c\u4f60\u5c0d\u8cc7\u6599\u7d50\u69cb\u3001\u6f14\u7b97\u6cd5\u3001\u9663\u5217\u548c\u4e8c\u5206\u641c\u5c0b\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8acb\u7e7c\u7e8c\u5f80\u4e0b\u95b1\u8b80\uff0c\u672c\u66f8\u5c07\u5f15\u5c0e\u4f60\u9081\u5165\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u6bbf\u5802\u3002

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7d50","text":"
    • \u6f14\u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u7121\u8655\u4e0d\u5728\uff0c\u4e26\u4e0d\u662f\u9059\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8b58\u3002\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u6c7a\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u554f\u984c\u3002
    • \u67e5\u5b57\u5178\u7684\u539f\u7406\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u9ad4\u73fe\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u6f14\u7b97\u6cd5\u601d\u60f3\u3002
    • \u6574\u7406\u64b2\u514b\u7684\u904e\u7a0b\u8207\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u975e\u5e38\u985e\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u9069\u5408\u6392\u5e8f\u5c0f\u578b\u8cc7\u6599\u96c6\u3002
    • \u8ca8\u5e63\u627e\u96f6\u7684\u6b65\u9a5f\u672c\u8cea\u4e0a\u662f\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\u3002
    • \u6f14\u7b97\u6cd5\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002
    • \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7dca\u5bc6\u76f8\u9023\u3002\u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002
    • \u6211\u5011\u53ef\u4ee5\u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728\uff0c\u7a4d\u6728\u4ee3\u8868\u8cc7\u6599\uff0c\u7a4d\u6728\u7684\u5f62\u72c0\u548c\u9023\u7dda\u65b9\u5f0f\u7b49\u4ee3\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u62fc\u88dd\u7a4d\u6728\u7684\u6b65\u9a5f\u5247\u5c0d\u61c9\u6f14\u7b97\u6cd5\u3002
    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u6f14\u7b97\u6cd5\u5b9a\u7fa9","text":"

    \u6f14\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u554f\u984c\u662f\u660e\u78ba\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f38\u5165\u548c\u8f38\u51fa\u5b9a\u7fa9\u3002
    • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u5920\u5728\u6709\u9650\u6b65\u9a5f\u3001\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e0b\u5b8c\u6210\u3002
    • \u5404\u6b65\u9a5f\u90fd\u6709\u78ba\u5b9a\u7684\u542b\u7fa9\uff0c\u5728\u76f8\u540c\u7684\u8f38\u5165\u548c\u57f7\u884c\u689d\u4ef6\u4e0b\uff0c\u8f38\u51fa\u59cb\u7d42\u76f8\u540c\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5b9a\u7fa9","text":"

    \u8cc7\u6599\u7d50\u69cb\uff08data structure\uff09\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8a2d\u8a08\u76ee\u6a19\u3002

    • \u7a7a\u9593\u4f54\u7528\u5118\u91cf\u5c11\uff0c\u4ee5\u7bc0\u7701\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u3002
    • \u8cc7\u6599\u64cd\u4f5c\u5118\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u84cb\u8cc7\u6599\u8a2a\u554f\u3001\u65b0\u589e\u3001\u522a\u9664\u3001\u66f4\u65b0\u7b49\u3002
    • \u63d0\u4f9b\u7c21\u6f54\u7684\u8cc7\u6599\u8868\u793a\u548c\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4ee5\u4fbf\u6f14\u7b97\u6cd5\u9ad8\u6548\u57f7\u884c\u3002

    \u8cc7\u6599\u7d50\u69cb\u8a2d\u8a08\u662f\u4e00\u500b\u5145\u6eff\u6b0a\u8861\u7684\u904e\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\u5354\u3002\u4e0b\u9762\u8209\u5169\u500b\u4f8b\u5b50\u3002

    • \u93c8\u7d50\u4e32\u5217\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u5728\u8cc7\u6599\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u72a7\u7272\u4e86\u8cc7\u6599\u8a2a\u554f\u901f\u5ea6\u3002
    • \u5716\u76f8\u8f03\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u63d0\u4f9b\u4e86\u66f4\u8c50\u5bcc\u7684\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4f46\u9700\u8981\u4f54\u7528\u66f4\u5927\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2","text":"

    \u5982\u5716 1-4 \u6240\u793a\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u95dc\u3001\u7dca\u5bc6\u7d50\u5408\uff0c\u5177\u9ad4\u8868\u73fe\u5728\u4ee5\u4e0b\u4e09\u500b\u65b9\u9762\u3002

    • \u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u8cc7\u6599\u7d50\u69cb\u70ba\u6f14\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7d50\u69cb\u5316\u5132\u5b58\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u64cd\u4f5c\u8cc7\u6599\u7684\u65b9\u6cd5\u3002
    • \u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002\u8cc7\u6599\u7d50\u69cb\u672c\u8eab\u50c5\u5132\u5b58\u8cc7\u6599\u8cc7\u8a0a\uff0c\u7d50\u5408\u6f14\u7b97\u6cd5\u624d\u80fd\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u3002
    • \u6f14\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u65bc\u4e0d\u540c\u7684\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u4f46\u57f7\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9078\u64c7\u5408\u9069\u7684\u8cc7\u6599\u7d50\u69cb\u662f\u95dc\u9375\u3002

    \u5716 1-4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2

    \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7336\u5982\u5716 1-5 \u6240\u793a\u7684\u62fc\u88dd\u7a4d\u6728\u3002\u4e00\u5957\u7a4d\u6728\uff0c\u9664\u4e86\u5305\u542b\u8a31\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u9084\u9644\u6709\u8a73\u7d30\u7684\u7d44\u88dd\u8aaa\u660e\u66f8\u3002\u6211\u5011\u6309\u7167\u8aaa\u660e\u66f8\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7d44\u88dd\u51fa\u7cbe\u7f8e\u7684\u7a4d\u6728\u6a21\u578b\u3002

    \u5716 1-5 \u00a0 \u62fc\u88dd\u7a4d\u6728

    \u5169\u8005\u7684\u8a73\u7d30\u5c0d\u61c9\u95dc\u4fc2\u5982\u8868 1-1 \u6240\u793a\u3002

    \u8868 1-1 \u00a0 \u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728

    \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5 \u62fc\u88dd\u7a4d\u6728 \u8f38\u5165\u8cc7\u6599 \u672a\u62fc\u88dd\u7684\u7a4d\u6728 \u8cc7\u6599\u7d50\u69cb \u7a4d\u6728\u7d44\u7e54\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72c0\u3001\u5927\u5c0f\u3001\u9023\u7dda\u65b9\u5f0f\u7b49 \u6f14\u7b97\u6cd5 \u628a\u7a4d\u6728\u62fc\u6210\u76ee\u6a19\u5f62\u614b\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9a5f \u8f38\u51fa\u8cc7\u6599 \u7a4d\u6728\u6a21\u578b

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u662f\u7368\u7acb\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u66f8\u5f97\u4ee5\u63d0\u4f9b\u57fa\u65bc\u591a\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5be6\u73fe\u3002

    \u7d04\u5b9a\u4fd7\u6210\u7684\u7c21\u7a31

    \u5728\u5be6\u969b\u8a0e\u8ad6\u6642\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u201c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u201d\u7c21\u7a31\u70ba\u201c\u6f14\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u773e\u6240\u5468\u77e5\u7684 LeetCode \u6f14\u7b97\u6cd5\u984c\u76ee\uff0c\u5be6\u969b\u4e0a\u540c\u6642\u8003\u67e5\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u5169\u65b9\u9762\u7684\u77e5\u8b58\u3002

    "},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

    Abstract

    \u6f14\u7b97\u6cd5\u7336\u5982\u7f8e\u5999\u7684\u4ea4\u97ff\u6a02\uff0c\u6bcf\u4e00\u884c\u7a0b\u5f0f\u78bc\u90fd\u50cf\u97fb\u5f8b\u822c\u6d41\u6dcc\u3002

    \u9858\u9019\u672c\u66f8\u5728\u4f60\u7684\u8166\u6d77\u4e2d\u8f15\u8f15\u97ff\u8d77\uff0c\u7559\u4e0b\u7368\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

    "},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 0.1 \u00a0 \u95dc\u65bc\u672c\u66f8
    • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8
    • 0.3 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u95dc\u65bc\u672c\u66f8","text":"

    \u672c\u5c08\u6848\u65e8\u5728\u5efa\u7acb\u4e00\u672c\u958b\u6e90\u3001\u514d\u8cbb\u3001\u5c0d\u65b0\u624b\u53cb\u597d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5165\u9580\u6559\u7a0b\u3002

    • \u5168\u66f8\u63a1\u7528\u52d5\u756b\u5716\u89e3\uff0c\u7d50\u69cb\u5316\u5730\u8b1b\u89e3\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u5167\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\u3002
    • \u6f14\u7b97\u6cd5\u6e90\u7a0b\u5f0f\u78bc\u7686\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8a9e\u8a00\u3002
    • \u9f13\u52f5\u8b80\u8005\u5728\u7dda\u4e0a\u7ae0\u7bc0\u8a55\u8ad6\u5340\u4e92\u5e6b\u4e92\u52a9\u3001\u5171\u540c\u9032\u6b65\uff0c\u63d0\u554f\u8207\u8a55\u8ad6\u901a\u5e38\u53ef\u5728\u5169\u65e5\u5167\u5f97\u5230\u56de\u8986\u3002
    "},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8b80\u8005\u7269\u4ef6","text":"

    \u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\uff0c\u5f9e\u672a\u63a5\u89f8\u904e\u6f14\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7d93\u6709\u4e00\u4e9b\u5237\u984c\u7d93\u9a57\uff0c\u5c0d\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8a8d\u8b58\uff0c\u5728\u6703\u8207\u4e0d\u6703\u4e4b\u9593\u53cd\u8986\u6a6b\u8df3\uff0c\u90a3\u9ebc\u672c\u66f8\u6b63\u662f\u70ba\u4f60\u91cf\u8eab\u5b9a\u88fd\u7684\uff01

    \u5982\u679c\u4f60\u5df2\u7d93\u7a4d\u7d2f\u4e00\u5b9a\u7684\u5237\u984c\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u984c\u578b\uff0c\u90a3\u9ebc\u672c\u66f8\u53ef\u52a9\u4f60\u56de\u9867\u8207\u68b3\u7406\u6f14\u7b97\u6cd5\u77e5\u8b58\u9ad4\u7cfb\uff0c\u5009\u5eab\u6e90\u7a0b\u5f0f\u78bc\u53ef\u4ee5\u7576\u4f5c\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u6216\u201c\u6f14\u7b97\u6cd5\u5b57\u5178\u201d\u4f86\u4f7f\u7528\u3002

    \u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u5011\u671f\u5f85\u6536\u5230\u4f60\u7684\u5bf6\u8cb4\u5efa\u8b70\uff0c\u6216\u8005\u4e00\u8d77\u53c3\u8207\u5275\u4f5c\u3002

    \u524d\u7f6e\u689d\u4ef6

    \u4f60\u9700\u8981\u81f3\u5c11\u5177\u5099\u4efb\u4e00\u8a9e\u8a00\u7684\u7a0b\u5f0f\u8a2d\u8a08\u57fa\u790e\uff0c\u80fd\u5920\u95b1\u8b80\u548c\u7de8\u5beb\u7c21\u55ae\u7a0b\u5f0f\u78bc\u3002

    "},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5167\u5bb9\u7d50\u69cb","text":"

    \u672c\u66f8\u7684\u4e3b\u8981\u5167\u5bb9\u5982\u5716 0-1 \u6240\u793a\u3002

    • \u8907\u96dc\u5ea6\u5206\u6790\uff1a\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u7684\u8a55\u50f9\u7dad\u5ea6\u8207\u65b9\u6cd5\u3002\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u898b\u578b\u5225\u3001\u793a\u4f8b\u7b49\u3002
    • \u8cc7\u6599\u7d50\u69cb\uff1a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u5206\u985e\u65b9\u6cd5\u3002\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u898b\u578b\u5225\u3001\u5178\u578b\u61c9\u7528\u3001\u5be6\u73fe\u65b9\u6cd5\u7b49\u3002
    • \u6f14\u7b97\u6cd5\uff1a\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u6548\u7387\u3001\u61c9\u7528\u5834\u666f\u3001\u89e3\u984c\u6b65\u9a5f\u548c\u793a\u4f8b\u554f\u984c\u7b49\u3002

    \u5716 0-1 \u00a0 \u672c\u66f8\u4e3b\u8981\u5167\u5bb9

    "},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8b1d","text":"

    \u672c\u66f8\u5728\u958b\u6e90\u793e\u7fa4\u773e\u591a\u8ca2\u737b\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65b7\u5b8c\u5584\u3002\u611f\u8b1d\u6bcf\u4e00\u4f4d\u6295\u5165\u6642\u9593\u8207\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u5011\u662f\uff08\u6309\u7167 GitHub \u81ea\u52d5\u751f\u6210\u7684\u9806\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\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\uff09\u3002\u611f\u8b1d\u4ed6\u5011\u4ed8\u51fa\u7684\u6642\u9593\u8207\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u5011\u78ba\u4fdd\u4e86\u5404\u8a9e\u8a00\u7a0b\u5f0f\u78bc\u7684\u898f\u7bc4\u8207\u7d71\u4e00\u3002

    \u5728\u672c\u66f8\u7684\u5275\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8a31\u591a\u4eba\u7684\u5e6b\u52a9\u3002

    • \u611f\u8b1d\u6211\u5728\u516c\u53f8\u7684\u5c0e\u5e2b\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u66a2\u8ac7\u4e2d\u4f60\u9f13\u52f5\u6211\u201c\u5feb\u884c\u52d5\u8d77\u4f86\u201d\uff0c\u5805\u5b9a\u4e86\u6211\u5beb\u9019\u672c\u66f8\u7684\u6c7a\u5fc3\uff1b
    • \u611f\u8b1d\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u70ba\u672c\u66f8\u7684\u9996\u4f4d\u8b80\u8005\uff0c\u5f9e\u6f14\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8a31\u591a\u5bf6\u8cb4\u5efa\u8b70\uff0c\u4f7f\u5f97\u672c\u66f8\u66f4\u9069\u5408\u65b0\u624b\u95b1\u8b80\uff1b
    • \u611f\u8b1d\u9a30\u5bf6\u3001\u7426\u5bf6\u3001\u98db\u5bf6\u70ba\u672c\u66f8\u8d77\u4e86\u4e00\u500b\u5bcc\u6709\u5275\u610f\u7684\u540d\u5b57\uff0c\u559a\u8d77\u5927\u5bb6\u5beb\u4e0b\u7b2c\u4e00\u884c\u7a0b\u5f0f\u78bc\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u61b6\uff1b
    • \u611f\u8b1d\u6821\u9293\u5728\u667a\u6167\u8ca1\u7522\u6b0a\u65b9\u9762\u63d0\u4f9b\u7684\u5c08\u696d\u5e6b\u52a9\uff0c\u9019\u5c0d\u672c\u958b\u6e90\u66f8\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
    • \u611f\u8b1d\u8607\u6f7c\u70ba\u672c\u66f8\u8a2d\u8a08\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u4e26\u5728\u6211\u7684\u5f37\u8feb\u75c7\u7684\u9a45\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
    • \u611f\u8b1d @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8b70\uff0c\u4ee5\u53ca\u4ed6\u958b\u767c\u7684\u958b\u6e90\u6587\u4ef6\u4e3b\u984c Material-for-MkDocs \u3002

    \u5728\u5beb\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u95b1\u8b80\u4e86\u8a31\u591a\u95dc\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u9019\u4e9b\u4f5c\u54c1\u70ba\u672c\u66f8\u63d0\u4f9b\u4e86\u512a\u79c0\u7684\u7bc4\u672c\uff0c\u78ba\u4fdd\u4e86\u672c\u66f8\u5167\u5bb9\u7684\u6e96\u78ba\u6027\u8207\u54c1\u8cea\u3002\u5728\u6b64\u611f\u8b1d\u6240\u6709\u8001\u5e2b\u548c\u524d\u8f29\u7684\u5091\u51fa\u8ca2\u737b\uff01

    \u672c\u66f8\u5021\u5c0e\u624b\u8166\u4e26\u7528\u7684\u5b78\u7fd2\u65b9\u5f0f\uff0c\u5728\u9019\u4e00\u9ede\u4e0a\u6211\u6df1\u53d7\u300a\u52d5\u624b\u5b78\u6df1\u5ea6\u5b78\u7fd2\u300b\u7684\u555f\u767c\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8b80\u8005\u5f37\u70c8\u63a8\u85a6\u9019\u672c\u512a\u79c0\u7684\u8457\u4f5c\u3002

    \u8877\u5fc3\u611f\u8b1d\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u5011\u4e00\u76f4\u4ee5\u4f86\u7684\u652f\u6301\u8207\u9f13\u52f5\uff0c\u8b93\u6211\u6709\u6a5f\u6703\u505a\u9019\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8","text":"

    Tip

    \u70ba\u4e86\u7372\u5f97\u6700\u4f73\u7684\u95b1\u8b80\u9ad4\u9a57\uff0c\u5efa\u8b70\u4f60\u901a\u8b80\u672c\u7bc0\u5167\u5bb9\u3002

    "},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98a8\u683c\u7d04\u5b9a","text":"
    • \u6a19\u984c\u5f8c\u6a19\u8a3b * \u7684\u662f\u9078\u8b80\u7ae0\u7bc0\uff0c\u5167\u5bb9\u76f8\u5c0d\u56f0\u96e3\u3002\u5982\u679c\u4f60\u7684\u6642\u9593\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\u3002
    • \u5c08\u696d\u8853\u8a9e\u6703\u4f7f\u7528\u9ed1\u9ad4\uff08\u7d19\u8cea\u7248\u548c PDF \u7248\uff09\u6216\u65b0\u589e\u4e0b\u5283\u7dda\uff08\u7db2\u9801\u7248\uff09\uff0c\u4f8b\u5982\u9663\u5217\uff08array\uff09\u3002\u5efa\u8b70\u8a18\u4f4f\u5b83\u5011\uff0c\u4ee5\u4fbf\u95b1\u8b80\u6587\u737b\u3002
    • \u91cd\u9ede\u5167\u5bb9\u548c\u7e3d\u7d50\u6027\u8a9e\u53e5\u6703 \u52a0\u7c97\uff0c\u9019\u985e\u6587\u5b57\u503c\u5f97\u7279\u5225\u95dc\u6ce8\u3002
    • \u6709\u7279\u6307\u542b\u7fa9\u7684\u8a5e\u53e5\u6703\u4f7f\u7528\u201c\u5f15\u865f\u201d\u6a19\u8a3b\uff0c\u4ee5\u907f\u514d\u6b67\u7fa9\u3002
    • \u7576\u6d89\u53ca\u7a0b\u5f0f\u8a9e\u8a00\u4e4b\u9593\u4e0d\u4e00\u81f4\u7684\u540d\u8a5e\u6642\uff0c\u672c\u66f8\u5747\u4ee5 Python \u70ba\u6e96\uff0c\u4f8b\u5982\u4f7f\u7528 None \u4f86\u8868\u793a\u201c\u7a7a\u201d\u3002
    • \u672c\u66f8\u90e8\u5206\u653e\u68c4\u4e86\u7a0b\u5f0f\u8a9e\u8a00\u7684\u8a3b\u91cb\u898f\u7bc4\uff0c\u4ee5\u63db\u53d6\u66f4\u52a0\u7dca\u6e4a\u7684\u5167\u5bb9\u6392\u7248\u3002\u8a3b\u91cb\u4e3b\u8981\u5206\u70ba\u4e09\u7a2e\u985e\u578b\uff1a\u6a19\u984c\u8a3b\u91cb\u3001\u5167\u5bb9\u8a3b\u91cb\u3001\u591a\u884c\u8a3b\u91cb\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    \"\"\"\u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\"\"\"\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n\"\"\"\n\u591a\u884c\n\u8a3b\u91cb\n\"\"\"\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    ### \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 ###\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n# \u591a\u884c\n# \u8a3b\u91cb\n
    // \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n// \u591a\u884c\n// \u8a3b\u91cb\n
    "},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52d5\u756b\u5716\u89e3\u4e2d\u9ad8\u6548\u5b78\u7fd2","text":"

    \u76f8\u8f03\u65bc\u6587\u5b57\uff0c\u5f71\u7247\u548c\u5716\u7247\u5177\u6709\u66f4\u9ad8\u7684\u8cc7\u8a0a\u5bc6\u5ea6\u548c\u7d50\u69cb\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u65bc\u7406\u89e3\u3002\u5728\u672c\u66f8\u4e2d\uff0c\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u5c07\u4e3b\u8981\u900f\u904e\u52d5\u756b\u4ee5\u5716\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5247\u4f5c\u70ba\u89e3\u91cb\u8207\u88dc\u5145\u3002

    \u5982\u679c\u4f60\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u767c\u73fe\u67d0\u6bb5\u5167\u5bb9\u63d0\u4f9b\u77ad\u5982\u5716 0-2 \u6240\u793a\u7684\u52d5\u756b\u5716\u89e3\uff0c\u8acb\u4ee5\u5716\u70ba\u4e3b\u3001\u4ee5\u6587\u5b57\u70ba\u8f14\uff0c\u7d9c\u5408\u5169\u8005\u4f86\u7406\u89e3\u5167\u5bb9\u3002

    \u5716 0-2 \u00a0 \u52d5\u756b\u5716\u89e3\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u7a0b\u5f0f\u78bc\u5be6\u8e10\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

    \u672c\u66f8\u7684\u914d\u5957\u7a0b\u5f0f\u78bc\u8a17\u7ba1\u5728 GitHub \u5009\u5eab\u3002\u5982\u5716 0-3 \u6240\u793a\uff0c\u6e90\u7a0b\u5f0f\u78bc\u9644\u6709\u6e2c\u8a66\u6a23\u4f8b\uff0c\u53ef\u4e00\u9375\u57f7\u884c\u3002

    \u5982\u679c\u6642\u9593\u5141\u8a31\uff0c\u5efa\u8b70\u4f60\u53c3\u7167\u7a0b\u5f0f\u78bc\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b78\u7fd2\u6642\u9593\u6709\u9650\uff0c\u8acb\u81f3\u5c11\u901a\u8b80\u4e26\u57f7\u884c\u6240\u6709\u7a0b\u5f0f\u78bc\u3002

    \u8207\u95b1\u8b80\u7a0b\u5f0f\u78bc\u76f8\u6bd4\uff0c\u7de8\u5beb\u7a0b\u5f0f\u78bc\u7684\u904e\u7a0b\u5f80\u5f80\u80fd\u5e36\u4f86\u66f4\u591a\u6536\u7a6b\u3002\u52d5\u624b\u5b78\uff0c\u624d\u662f\u771f\u7684\u5b78\u3002

    \u5716 0-3 \u00a0 \u57f7\u884c\u7a0b\u5f0f\u78bc\u793a\u4f8b

    \u57f7\u884c\u7a0b\u5f0f\u78bc\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\u3002

    \u7b2c\u4e00\u6b65\uff1a\u5b89\u88dd\u672c\u5730\u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u3002\u8acb\u53c3\u7167\u9644\u9304\u6240\u793a\u7684\u6559\u7a0b\u9032\u884c\u5b89\u88dd\uff0c\u5982\u679c\u5df2\u5b89\u88dd\uff0c\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u5009\u5eab\u3002\u524d\u5f80 GitHub \u5009\u5eab\u3002\u5982\u679c\u5df2\u7d93\u5b89\u88dd Git \uff0c\u53ef\u4ee5\u900f\u904e\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u5009\u5eab\uff1a

    git clone https://github.com/krahets/hello-algo.git\n

    \u7576\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5716 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u9ede\u9078\u201cDownload ZIP\u201d\u6309\u9215\u76f4\u63a5\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u58d3\u7e2e\u5305\uff0c\u7136\u5f8c\u5728\u672c\u5730\u89e3\u58d3\u5373\u53ef\u3002

    \u5716 0-4 \u00a0 \u514b\u9686\u5009\u5eab\u8207\u4e0b\u8f09\u7a0b\u5f0f\u78bc

    \u7b2c\u4e09\u6b65\uff1a\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 0-5 \u6240\u793a\uff0c\u5c0d\u65bc\u9802\u90e8\u6a19\u6709\u6a94\u6848\u540d\u7a31\u7684\u7a0b\u5f0f\u78bc\u584a\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u5009\u5eab\u7684 codes \u6a94\u6848\u593e\u5167\u627e\u5230\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u3002\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5c07\u5e6b\u52a9\u4f60\u7bc0\u7701\u4e0d\u5fc5\u8981\u7684\u9664\u932f\u6642\u9593\uff0c\u8b93\u4f60\u80fd\u5920\u5c08\u6ce8\u65bc\u5b78\u7fd2\u5167\u5bb9\u3002

    \u5716 0-5 \u00a0 \u7a0b\u5f0f\u78bc\u584a\u8207\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848

    \u9664\u4e86\u672c\u5730\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u7db2\u9801\u7248\u9084\u652f\u6301 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c\uff08\u57fa\u65bc pythontutor \u5be6\u73fe\uff09\u3002\u5982\u5716 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u9ede\u9078\u7a0b\u5f0f\u78bc\u584a\u4e0b\u65b9\u7684\u201c\u8996\u89ba\u5316\u57f7\u884c\u201d\u4f86\u5c55\u958b\u6aa2\u8996\uff0c\u89c0\u5bdf\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u9ede\u9078\u201c\u5168\u5c4f\u89c0\u770b\u201d\uff0c\u4ee5\u7372\u5f97\u66f4\u597d\u7684\u95b1\u89bd\u9ad4\u9a57\u3002

    \u5716 0-6 \u00a0 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c

    "},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u554f\u8a0e\u8ad6\u4e2d\u5171\u540c\u6210\u9577","text":"

    \u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u8acb\u4e0d\u8981\u8f15\u6613\u8df3\u904e\u90a3\u4e9b\u6c92\u5b78\u660e\u767d\u7684\u77e5\u8b58\u9ede\u3002\u6b61\u8fce\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u4f60\u7684\u554f\u984c\uff0c\u6211\u548c\u5c0f\u5925\u4f34\u5011\u5c07\u7aed\u8aa0\u70ba\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u6cc1\u4e0b\u53ef\u5728\u5169\u5929\u5167\u56de\u8986\u3002

    \u5982\u5716 0-7 \u6240\u793a\uff0c\u7db2\u9801\u7248\u6bcf\u500b\u7ae0\u7bc0\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8a55\u8ad6\u5340\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u95dc\u6ce8\u8a55\u8ad6\u5340\u7684\u5167\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u77ad\u89e3\u5927\u5bb6\u9047\u5230\u7684\u554f\u984c\uff0c\u5f9e\u800c\u67e5\u6f0f\u88dc\u7f3a\uff0c\u6fc0\u767c\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u5925\u4f34\u7684\u554f\u984c\uff0c\u5206\u4eab\u4f60\u7684\u898b\u89e3\uff0c\u5e6b\u52a9\u4ed6\u4eba\u9032\u6b65\u3002

    \u5716 0-7 \u00a0 \u8a55\u8ad6\u5340\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda","text":"

    \u5f9e\u7e3d\u9ad4\u4e0a\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u904e\u7a0b\u5283\u5206\u70ba\u4e09\u500b\u968e\u6bb5\u3002

    1. \u968e\u6bb5\u4e00\uff1a\u6f14\u7b97\u6cd5\u5165\u9580\u3002\u6211\u5011\u9700\u8981\u719f\u6089\u5404\u7a2e\u8cc7\u6599\u7d50\u69cb\u7684\u7279\u9ede\u548c\u7528\u6cd5\uff0c\u5b78\u7fd2\u4e0d\u540c\u6f14\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5167\u5bb9\u3002
    2. \u968e\u6bb5\u4e8c\uff1a\u5237\u6f14\u7b97\u6cd5\u984c\u3002\u5efa\u8b70\u5f9e\u71b1\u9580\u984c\u76ee\u958b\u5237\uff0c\u5148\u7a4d\u7d2f\u81f3\u5c11 100 \u9053\u984c\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u3002\u521d\u6b21\u5237\u984c\u6642\uff0c\u201c\u77e5\u8b58\u907a\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u500b\u6311\u6230\uff0c\u4f46\u8acb\u653e\u5fc3\uff0c\u9019\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u5011\u53ef\u4ee5\u6309\u7167\u201c\u827e\u8cd3\u6d69\u65af\u907a\u5fd8\u66f2\u7dda\u201d\u4f86\u8907\u7fd2\u984c\u76ee\uff0c\u901a\u5e38\u5728\u9032\u884c 3\uff5e5 \u8f2a\u7684\u91cd\u8907\u5f8c\uff0c\u5c31\u80fd\u5c07\u5176\u7262\u8a18\u5728\u5fc3\u3002\u63a8\u85a6\u7684\u984c\u55ae\u548c\u5237\u984c\u8a08\u5283\u8acb\u898b\u6b64 GitHub \u5009\u5eab\u3002
    3. \u968e\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5b78\u7fd2\u65b9\u9762\uff0c\u6211\u5011\u53ef\u4ee5\u95b1\u8b80\u6f14\u7b97\u6cd5\u5c08\u6b04\u6587\u7ae0\u3001\u89e3\u984c\u6846\u67b6\u548c\u6f14\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65b7\u8c50\u5bcc\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5237\u984c\u65b9\u9762\uff0c\u53ef\u4ee5\u5617\u8a66\u63a1\u7528\u9032\u968e\u5237\u984c\u7b56\u7565\uff0c\u5982\u6309\u5c08\u984c\u5206\u985e\u3001\u4e00\u984c\u591a\u89e3\u3001\u4e00\u89e3\u591a\u984c\u7b49\uff0c\u76f8\u95dc\u7684\u5237\u984c\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u500b\u793e\u7fa4\u627e\u5230\u3002

    \u5982\u5716 0-8 \u6240\u793a\uff0c\u672c\u66f8\u5167\u5bb9\u4e3b\u8981\u6db5\u84cb\u201c\u968e\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e6b\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u958b\u968e\u6bb5\u4e8c\u548c\u968e\u6bb5\u4e09\u7684\u5b78\u7fd2\u3002

    \u5716 0-8 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7d50","text":"
    • \u672c\u66f8\u7684\u4e3b\u8981\u53d7\u773e\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u790e\uff0c\u672c\u66f8\u80fd\u5e6b\u52a9\u4f60\u7cfb\u7d71\u56de\u9867\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u66f8\u4e2d\u6e90\u7a0b\u5f0f\u78bc\u4e5f\u53ef\u4f5c\u70ba\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u4f7f\u7528\u3002
    • \u66f8\u4e2d\u5167\u5bb9\u4e3b\u8981\u5305\u62ec\u8907\u96dc\u5ea6\u5206\u6790\u3001\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u84cb\u4e86\u8a72\u9818\u57df\u7684\u5927\u90e8\u5206\u4e3b\u984c\u3002
    • \u5c0d\u65bc\u6f14\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b78\u968e\u6bb5\u95b1\u8b80\u4e00\u672c\u5165\u9580\u66f8\u81f3\u95dc\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8a31\u591a\u5f4e\u8def\u3002
    • \u66f8\u4e2d\u7684\u52d5\u756b\u5716\u89e3\u901a\u5e38\u7528\u65bc\u4ecb\u7d39\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u3002\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u61c9\u7d66\u4e88\u9019\u4e9b\u5167\u5bb9\u66f4\u591a\u95dc\u6ce8\u3002
    • \u5be6\u8e10\u4e43\u5b78\u7fd2\u7a0b\u5f0f\u8a2d\u8a08\u4e4b\u6700\u4f73\u9014\u5f91\u3002\u5f37\u70c8\u5efa\u8b70\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u4e26\u89aa\u81ea\u6572\u7a0b\u5f0f\u78bc\u3002
    • \u672c\u66f8\u7db2\u9801\u7248\u7684\u6bcf\u500b\u7ae0\u7bc0\u90fd\u8a2d\u6709\u8a55\u8ad6\u5340\uff0c\u6b61\u8fce\u96a8\u6642\u5206\u4eab\u4f60\u7684\u7591\u60d1\u8207\u898b\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c3\u8003\u6587\u737b","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] \u56b4\u851a\u654f. \u8cc7\u6599\u7d50\u69cb\uff08C \u8a9e\u8a00\u7248\uff09.

    [5] \u9127\u4fca\u8f1d. \u8cc7\u6599\u7d50\u69cb\uff08C++ \u8a9e\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

    [6] \u99ac\u514b \u827e\u502b \u7dad\u65af\u8457\uff0c\u9673\u8d8a\u8b6f. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5206\u6790\uff1aJava\u8a9e\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

    [7] \u7a0b\u5091. \u5927\u8a71\u8cc7\u6599\u7d50\u69cb.

    [8] \u738b\u722d. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\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\u5c0b","text":"

    Abstract

    \u641c\u5c0b\u662f\u4e00\u5834\u672a\u77e5\u7684\u5192\u96aa\uff0c\u6211\u5011\u6216\u8a31\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u9593\u7684\u6bcf\u500b\u89d2\u843d\uff0c\u53c8\u6216\u8a31\u53ef\u4ee5\u5feb\u901f\u9396\u5b9a\u76ee\u6a19\u3002

    \u5728\u9019\u5834\u5c0b\u8993\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u500b\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

    "},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b
    • 10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede
    • 10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c
    • 10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565
    • 10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5
    • 10.6 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b","text":"

    \u4e8c\u5206\u641c\u5c0b\uff08binary search\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\u641c\u5c0b\u7bc4\u570d\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u70ba\u6b62\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5143\u7d20\u6309\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u8907\u3002\u8acb\u67e5\u8a62\u4e26\u8fd4\u56de\u5143\u7d20 target \u5728\u8a72\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 10-1 \u6240\u793a\u3002

    \u5716 10-1 \u00a0 \u4e8c\u5206\u641c\u5c0b\u793a\u4f8b\u8cc7\u6599

    \u5982\u5716 10-2 \u6240\u793a\uff0c\u6211\u5011\u5148\u521d\u59cb\u5316\u6307\u6a19 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u5c0b\u5340\u9593 \\([0, n - 1]\\) \u3002\u8acb\u6ce8\u610f\uff0c\u4e2d\u62ec\u865f\u8868\u793a\u9589\u5340\u9593\uff0c\u5176\u5305\u542b\u908a\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u4f86\uff0c\u8ff4\u5708\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65b7 nums[m] \u548c target \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u4e09\u7a2e\u60c5\u6cc1\u3002
      1. \u7576 nums[m] < target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(i = m + 1\\) \u3002
      2. \u7576 nums[m] > target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(j = m - 1\\) \u3002
      3. \u7576 nums[m] = target \u6642\uff0c\u8aaa\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

    \u82e5\u9663\u5217\u4e0d\u5305\u542b\u76ee\u6a19\u5143\u7d20\uff0c\u641c\u5c0b\u5340\u9593\u6700\u7d42\u6703\u7e2e\u5c0f\u70ba\u7a7a\u3002\u6b64\u6642\u8fd4\u56de \\(-1\\) \u3002

    <1><2><3><4><5><6><7>

    \u5716 10-2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u6d41\u7a0b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u578b\u5225\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u6703\u8d85\u51fa int \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u3002\u70ba\u4e86\u907f\u514d\u5927\u6578\u8d8a\u754c\uff0c\u6211\u5011\u901a\u5e38\u63a1\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u4f86\u8a08\u7b97\u4e2d\u9ede\u3002

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8ad6\u4e0a Python \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\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\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while i <= j\n    # \u7406\u8ad6\u4e0a Ruby \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n    m = (i + j) / 2   # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u8ff4\u5708\u4e2d\uff0c\u5340\u9593\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u70ba \\(\\log_2 n\\) \u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7a7a\u9593\u3002

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u5340\u9593\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u96d9\u9589\u5340\u9593\u5916\uff0c\u5e38\u898b\u7684\u5340\u9593\u8868\u793a\u9084\u6709\u201c\u5de6\u9589\u53f3\u958b\u201d\u5340\u9593\uff0c\u5b9a\u7fa9\u70ba \\([0, n)\\) \uff0c\u5373\u5de6\u908a\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u908a\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8a72\u8868\u793a\u4e0b\uff0c\u5340\u9593 \\([i, j)\\) \u5728 \\(i = j\\) \u6642\u70ba\u7a7a\u3002

    \u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u8a72\u8868\u793a\u5be6\u73fe\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\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\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while i < j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 10-3 \u6240\u793a\uff0c\u5728\u5169\u7a2e\u5340\u9593\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u8ff4\u5708\u689d\u4ef6\u548c\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u7531\u65bc\u201c\u96d9\u9589\u5340\u9593\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u908a\u754c\u90fd\u88ab\u5b9a\u7fa9\u70ba\u9589\u5340\u9593\uff0c\u56e0\u6b64\u900f\u904e\u6307\u6a19 \\(i\\) \u548c\u6307\u6a19 \\(j\\) \u7e2e\u5c0f\u5340\u9593\u7684\u64cd\u4f5c\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u9019\u6a23\u66f4\u4e0d\u5bb9\u6613\u51fa\u932f\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8b70\u63a1\u7528\u201c\u96d9\u9589\u5340\u9593\u201d\u7684\u5beb\u6cd5\u3002

    \u5716 10-3 \u00a0 \u5169\u7a2e\u5340\u9593\u5b9a\u7fa9

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u4e8c\u5206\u641c\u5c0b\u5728\u6642\u9593\u548c\u7a7a\u9593\u65b9\u9762\u90fd\u6709\u8f03\u597d\u7684\u6548\u80fd\u3002

    • \u4e8c\u5206\u641c\u5c0b\u7684\u6642\u9593\u6548\u7387\u9ad8\u3002\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\uff0c\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5177\u6709\u986f\u8457\u512a\u52e2\u3002\u4f8b\u5982\uff0c\u7576\u8cc7\u6599\u5927\u5c0f \\(n = 2^{20}\\) \u6642\uff0c\u7dda\u6027\u67e5\u8a62\u9700\u8981 \\(2^{20} = 1048576\\) \u8f2a\u8ff4\u5708\uff0c\u800c\u4e8c\u5206\u641c\u5c0b\u50c5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f2a\u8ff4\u5708\u3002
    • \u4e8c\u5206\u641c\u5c0b\u7121\u9808\u984d\u5916\u7a7a\u9593\u3002\u76f8\u8f03\u65bc\u9700\u8981\u85c9\u52a9\u984d\u5916\u7a7a\u9593\u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08\u4f8b\u5982\u96dc\u6e4a\u67e5\u8a62\uff09\uff0c\u4e8c\u5206\u641c\u5c0b\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u641c\u5c0b\u4e26\u975e\u9069\u7528\u65bc\u6240\u6709\u60c5\u6cc1\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u6709\u5e8f\u8cc7\u6599\u3002\u82e5\u8f38\u5165\u8cc7\u6599\u7121\u5e8f\uff0c\u70ba\u4e86\u4f7f\u7528\u4e8c\u5206\u641c\u5c0b\u800c\u5c08\u9580\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u511f\u5931\u3002\u56e0\u70ba\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u6bd4\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u90fd\u66f4\u9ad8\u3002\u5c0d\u65bc\u983b\u7e41\u63d2\u5165\u5143\u7d20\u7684\u5834\u666f\uff0c\u70ba\u4fdd\u6301\u9663\u5217\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c07\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8cb4\u7684\u3002
    • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u8df3\u8e8d\u5f0f\uff08\u975e\u9023\u7e8c\u5730\uff09\u8a2a\u554f\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u57f7\u884c\u8df3\u8e8d\u5f0f\u8a2a\u554f\u7684\u6548\u7387\u8f03\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u61c9\u7528\u5728\u93c8\u7d50\u4e32\u5217\u6216\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u5c0f\u8cc7\u6599\u91cf\u4e0b\uff0c\u7dda\u6027\u67e5\u8a62\u6548\u80fd\u66f4\u4f73\u3002\u7dda\u4e0a\u6027\u67e5\u8a62\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u9700 1 \u6b21\u5224\u65b7\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65b7\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u6e1b\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u7576\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5c0f\u6642\uff0c\u7dda\u6027\u67e5\u8a62\u53cd\u800c\u6bd4\u4e8c\u5206\u641c\u5c0b\u66f4\u5feb\u3002
    "},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u8a62\u5de6\u908a\u754c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\u3002\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e2d\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

    \u56de\u61b6\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u7684\u65b9\u6cd5\uff0c\u641c\u5c0b\u5b8c\u6210\u5f8c \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target \uff0c\u56e0\u6b64\u67e5\u8a62\u63d2\u5165\u9ede\u672c\u8cea\u4e0a\u662f\u5728\u67e5\u8a62\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002

    \u8003\u616e\u900f\u904e\u67e5\u8a62\u63d2\u5165\u9ede\u7684\u51fd\u5f0f\u5be6\u73fe\u67e5\u8a62\u5de6\u908a\u754c\u3002\u8acb\u6ce8\u610f\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u9019\u7a2e\u60c5\u6cc1\u53ef\u80fd\u5c0e\u81f4\u4ee5\u4e0b\u5169\u7a2e\u7d50\u679c\u3002

    • \u63d2\u5165\u9ede\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
    • \u5143\u7d20 nums[i] \u8207 target \u4e0d\u76f8\u7b49\u3002

    \u7576\u9047\u5230\u4ee5\u4e0a\u5169\u7a2e\u60c5\u6cc1\u6642\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target\"\"\"\n    # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u8a62\u53f3\u908a\u754c","text":"

    \u90a3\u9ebc\u5982\u4f55\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u7a0b\u5f0f\u78bc\uff0c\u66ff\u63db\u5728 nums[m] == target \u60c5\u6cc1\u4e0b\u7684\u6307\u6a19\u6536\u7e2e\u64cd\u4f5c\u3002\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

    \u4e0b\u9762\u6211\u5011\u4ecb\u7d39\u5169\u7a2e\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

    "},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u8907\u7528\u67e5\u8a62\u5de6\u908a\u754c","text":"

    \u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u67e5\u8a62\u6700\u5de6\u5143\u7d20\u7684\u51fd\u5f0f\u4f86\u67e5\u8a62\u6700\u53f3\u5143\u7d20\uff0c\u5177\u9ad4\u65b9\u6cd5\u70ba\uff1a\u5c07\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\u3002

    \u5982\u5716 10-7 \u6240\u793a\uff0c\u67e5\u8a62\u5b8c\u6210\u5f8c\uff0c\u6307\u6a19 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

    \u5716 10-7 \u00a0 \u5c07\u67e5\u8a62\u53f3\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5de6\u908a\u754c

    \u8acb\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u9ede\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c07\u5176\u6e1b \\(1\\) \uff0c\u5f9e\u800c\u7372\u5f97 \\(j\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target\"\"\"\n    # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u6700\u7d42 \\(i\\) \u548c \\(j\\) \u6703\u5206\u5225\u6307\u5411\u9996\u500b\u5927\u65bc\u3001\u5c0f\u65bc target \u7684\u5143\u7d20\u3002

    \u56e0\u6b64\uff0c\u5982\u5716 10-8 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u69cb\u9020\u4e00\u500b\u9663\u5217\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u65bc\u67e5\u8a62\u5de6\u53f3\u908a\u754c\u3002

    • \u67e5\u8a62\u6700\u5de6\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target - 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(i\\) \u3002
    • \u67e5\u8a62\u6700\u53f3\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target + 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(j\\) \u3002

    \u5716 10-8 \u00a0 \u5c07\u67e5\u8a62\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20

    \u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u5169\u9ede\u503c\u5f97\u6ce8\u610f\u3002

    • \u7d66\u5b9a\u9663\u5217\u4e0d\u5305\u542b\u5c0f\u6578\uff0c\u9019\u610f\u5473\u8457\u6211\u5011\u7121\u9808\u95dc\u5fc3\u5982\u4f55\u8655\u7406\u76f8\u7b49\u7684\u60c5\u6cc1\u3002
    • \u56e0\u70ba\u8a72\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6578\uff0c\u6240\u4ee5\u9700\u8981\u5c07\u51fd\u5f0f\u4e2d\u7684\u8b8a\u6578 target \u6539\u70ba\u6d6e\u9ede\u6578\u578b\u5225\uff08Python \u7121\u9808\u6539\u52d5\uff09\u3002
    "},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede","text":"

    \u4e8c\u5206\u641c\u5c0b\u4e0d\u50c5\u53ef\u7528\u65bc\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\uff0c\u9084\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u8b8a\u7a2e\u554f\u984c\uff0c\u6bd4\u5982\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

    "},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \u548c\u4e00\u500b\u5143\u7d20 target \uff0c\u9663\u5217\u4e0d\u5b58\u5728\u91cd\u8907\u5143\u7d20\u3002\u73fe\u5c07 target \u63d2\u5165\u9663\u5217 nums \u4e2d\uff0c\u4e26\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u9663\u5217\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5247\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8acb\u8fd4\u56de\u63d2\u5165\u5f8c target \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u5716 10-4 \u6240\u793a\u3002

    \u5716 10-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u793a\u4f8b\u8cc7\u6599

    \u5982\u679c\u60f3\u8907\u7528\u4e0a\u4e00\u7bc0\u7684\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\uff0c\u5247\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u5169\u500b\u554f\u984c\u3002

    \u554f\u984c\u4e00\uff1a\u7576\u9663\u5217\u4e2d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u662f\u5426\u662f\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u984c\u76ee\u8981\u6c42\u5c07 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u908a\uff0c\u9019\u610f\u5473\u8457\u65b0\u63d2\u5165\u7684 target \u66ff\u63db\u4e86\u539f\u4f86 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u7576\u9663\u5217\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u5c31\u662f\u8a72 target \u7684\u7d22\u5f15\u3002

    \u554f\u984c\u4e8c\uff1a\u7576\u9663\u5217\u4e2d\u4e0d\u5b58\u5728 target \u6642\uff0c\u63d2\u5165\u9ede\u662f\u54ea\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u9032\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u641c\u5c0b\u904e\u7a0b\uff1a\u7576 nums[m] < target \u6642 \\(i\\) \u79fb\u52d5\uff0c\u9019\u610f\u5473\u8457\u6307\u6a19 \\(i\\) \u5728\u5411\u5927\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u6a19 \\(j\\) \u59cb\u7d42\u5728\u5411\u5c0f\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u56e0\u6b64\u4e8c\u5206\u7d50\u675f\u6642\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u3002\u6613\u5f97\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u7d22\u5f15\u70ba \\(i\\) \u3002\u7a0b\u5f0f\u78bc\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\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [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 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertionSimple}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u5728\u4e0a\u4e00\u984c\u7684\u57fa\u790e\u4e0a\uff0c\u898f\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u5176\u9918\u4e0d\u8b8a\u3002

    \u5047\u8a2d\u9663\u5217\u4e2d\u5b58\u5728\u591a\u500b target \uff0c\u5247\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u800c\u7121\u6cd5\u78ba\u5b9a\u8a72\u5143\u7d20\u7684\u5de6\u908a\u548c\u53f3\u908a\u9084\u6709\u591a\u5c11 target\u3002

    \u984c\u76ee\u8981\u6c42\u5c07\u76ee\u6a19\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u908a\uff0c\u6240\u4ee5\u6211\u5011\u9700\u8981\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u616e\u900f\u904e\u5716 10-5 \u6240\u793a\u7684\u6b65\u9a5f\u5be6\u73fe\u3002

    1. \u57f7\u884c\u4e8c\u5206\u641c\u5c0b\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\(k\\) \u3002
    2. \u5f9e\u7d22\u5f15 \\(k\\) \u958b\u59cb\uff0c\u5411\u5de6\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u7576\u627e\u5230\u6700\u5de6\u908a\u7684 target \u6642\u8fd4\u56de\u3002

    \u5716 10-5 \u00a0 \u7dda\u6027\u67e5\u8a62\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede

    \u6b64\u65b9\u6cd5\u96d6\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7dda\u6027\u67e5\u8a62\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u7576\u9663\u5217\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u8907\u7684 target \u6642\uff0c\u8a72\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

    \u73fe\u8003\u616e\u62d3\u5c55\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 10-6 \u6240\u793a\uff0c\u6574\u9ad4\u6d41\u7a0b\u4fdd\u6301\u4e0d\u8b8a\uff0c\u6bcf\u8f2a\u5148\u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65b7 target \u548c nums[m] \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u5e7e\u7a2e\u60c5\u6cc1\u3002

    • \u7576 nums[m] < target \u6216 nums[m] > target \u6642\uff0c\u8aaa\u660e\u9084\u6c92\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u63a1\u7528\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u7684\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u7576 nums[m] == target \u6642\uff0c\u8aaa\u660e\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u63a1\u7528 \\(j = m - 1\\) \u4f86\u7e2e\u5c0f\u5340\u9593\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(j\\) \u5411\u5c0f\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u8ff4\u5708\u5b8c\u6210\u5f8c\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u908a\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u9ede\u3002

    <1><2><3><4><5><6><7><8>

    \u5716 10-6 \u00a0 \u4e8c\u5206\u641c\u5c0b\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede\u7684\u6b65\u9a5f

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5224\u65b7\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u5169\u8005\u53ef\u4ee5\u5408\u4f75\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5c07\u5224\u65b7\u689d\u4ef6\u4fdd\u6301\u5c55\u958b\uff0c\u56e0\u70ba\u5176\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8b80\u6027\u66f4\u597d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [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 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertion}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \u672c\u7bc0\u7684\u7a0b\u5f0f\u78bc\u90fd\u662f\u201c\u96d9\u9589\u5340\u9593\u201d\u5beb\u6cd5\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u201c\u5de6\u9589\u53f3\u958b\u201d\u5beb\u6cd5\u3002

    \u7e3d\u7684\u4f86\u770b\uff0c\u4e8c\u5206\u641c\u5c0b\u7121\u975e\u5c31\u662f\u7d66\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5225\u8a2d\u5b9a\u641c\u5c0b\u76ee\u6a19\uff0c\u76ee\u6a19\u53ef\u80fd\u662f\u4e00\u500b\u5177\u9ad4\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u500b\u5143\u7d20\u7bc4\u570d\uff08\u4f8b\u5982\u5c0f\u65bc target \u7684\u5143\u7d20\uff09\u3002

    \u5728\u4e0d\u65b7\u7684\u8ff4\u5708\u4e8c\u5206\u4e2d\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6f38\u903c\u8fd1\u9810\u5148\u8a2d\u5b9a\u7684\u76ee\u6a19\u3002\u6700\u7d42\uff0c\u5b83\u5011\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u904e\u908a\u754c\u5f8c\u505c\u6b62\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565","text":"

    \u5728\u6f14\u7b97\u6cd5\u984c\u4e2d\uff0c\u6211\u5011\u5e38\u900f\u904e\u5c07\u7dda\u6027\u67e5\u8a62\u66ff\u63db\u70ba\u96dc\u6e4a\u67e5\u8a62\u4f86\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u6f14\u7b97\u6cd5\u984c\u4f86\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u5143\u7d20 target \uff0c\u8acb\u5728\u9663\u5217\u4e2d\u641c\u7d22\u201c\u548c\u201d\u70ba target \u7684\u5169\u500b\u5143\u7d20\uff0c\u4e26\u8fd4\u56de\u5b83\u5011\u7684\u9663\u5217\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u500b\u89e3\u5373\u53ef\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7dda\u6027\u67e5\u8a62\uff1a\u4ee5\u6642\u9593\u63db\u7a7a\u9593","text":"

    \u8003\u616e\u76f4\u63a5\u8d70\u8a2a\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\u3002\u5982\u5716 10-9 \u6240\u793a\uff0c\u6211\u5011\u958b\u555f\u4e00\u500b\u5169\u5c64\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u5224\u65b7\u5169\u500b\u6574\u6578\u7684\u548c\u662f\u5426\u70ba target \uff0c\u82e5\u662f\uff0c\u5247\u8fd4\u56de\u5b83\u5011\u7684\u7d22\u5f15\u3002

    \u5716 10-9 \u00a0 \u7dda\u6027\u67e5\u8a62\u6c42\u89e3\u5169\u6578\u4e4b\u548c

    \u7a0b\u5f0f\u78bc\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\u5217\u8209\"\"\"\n    # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; i < 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\u5217\u8209 */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\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\u5217\u8209 */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 ###\ndef two_sum_brute_force(nums, target)\n  # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6b64\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u975e\u5e38\u8017\u6642\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u96dc\u6e4a\u67e5\u8a62\uff1a\u4ee5\u7a7a\u9593\u63db\u6642\u9593","text":"

    \u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u9375\u503c\u5c0d\u5206\u5225\u70ba\u9663\u5217\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u8ff4\u5708\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u57f7\u884c\u5716 10-10 \u6240\u793a\u7684\u6b65\u9a5f\u3002

    1. \u5224\u65b7\u6578\u5b57 target - nums[i] \u662f\u5426\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u9019\u5169\u500b\u5143\u7d20\u7684\u7d22\u5f15\u3002
    2. \u5c07\u9375\u503c\u5c0d nums[i] \u548c\u7d22\u5f15 i \u65b0\u589e\u9032\u96dc\u6e4a\u8868\u3002
    <1><2><3>

    \u5716 10-10 \u00a0 \u8f14\u52a9\u96dc\u6e4a\u8868\u6c42\u89e3\u5169\u6578\u4e4b\u548c

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff0c\u50c5\u9700\u55ae\u5c64\u8ff4\u5708\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\u8f14\u52a9\u96dc\u6e4a\u8868\"\"\"\n    # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    dic = {}\n    # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    unordered_map<int, int> dic;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Dictionary<int, int> dic = [];\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    hashTable := map[int]int{}\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic: [Int: Int] = [:]\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m = {};\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m: Map<number, number> = new Map();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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 \u8f14\u52a9\u96dc\u6e4a\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  Map<int, int> dic = HashMap();\n  // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let mut dic = HashMap::new();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    /* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u96dc\u6e4a\u8868\u67e5\u8a62 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u96dc\u6e4a\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\u8f14\u52a9\u96dc\u6e4a\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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    val dic = HashMap<Int, Int>()\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  dic = {}\n  # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6b64\u65b9\u6cd5\u900f\u904e\u96dc\u6e4a\u67e5\u8a62\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u57f7\u884c\u6548\u7387\u3002

    \u7531\u65bc\u9700\u8981\u7dad\u8b77\u4e00\u500b\u984d\u5916\u7684\u96dc\u6e4a\u8868\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5118\u7ba1\u5982\u6b64\uff0c\u8a72\u65b9\u6cd5\u7684\u6574\u9ad4\u6642\u7a7a\u6548\u7387\u66f4\u70ba\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u984c\u7684\u6700\u512a\u89e3\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5","text":"

    \u641c\u5c0b\u6f14\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u65bc\u5728\u8cc7\u6599\u7d50\u69cb\uff08\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u6216\u5716\uff09\u4e2d\u641c\u7d22\u4e00\u500b\u6216\u4e00\u7d44\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5143\u7d20\u3002

    \u641c\u5c0b\u6f14\u7b97\u6cd5\u53ef\u6839\u64da\u5be6\u73fe\u601d\u8def\u5206\u70ba\u4ee5\u4e0b\u5169\u985e\u3002

    • \u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\uff0c\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u8d70\u8a2a\u7b49\u3002
    • \u5229\u7528\u8cc7\u6599\u7d44\u7e54\u7d50\u69cb\u6216\u8cc7\u6599\u5305\u542b\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u5be6\u73fe\u9ad8\u6548\u5143\u7d20\u67e5\u8a62\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u3001\u96dc\u6e4a\u67e5\u8a62\u548c\u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7b49\u3002

    \u4e0d\u96e3\u767c\u73fe\uff0c\u9019\u4e9b\u77e5\u8b58\u9ede\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u56e0\u6b64\u641c\u5c0b\u6f14\u7b97\u6cd5\u5c0d\u65bc\u6211\u5011\u4f86\u8aaa\u4e26\u4e0d\u964c\u751f\u3002\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5c07\u5f9e\u66f4\u52a0\u7cfb\u7d71\u7684\u8996\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5be9\u8996\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u5c0b","text":"

    \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u7684\u6bcf\u500b\u5143\u7d20\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    • \u201c\u7dda\u6027\u641c\u5c0b\u201d\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7b49\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u5b83\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u4e00\u7aef\u958b\u59cb\uff0c\u9010\u500b\u8a2a\u554f\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u5230\u9054\u53e6\u4e00\u7aef\u4ecd\u6c92\u6709\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
    • \u201c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u548c\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u662f\u5716\u548c\u6a39\u7684\u5169\u7a2e\u8d70\u8a2a\u7b56\u7565\u3002\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\u9010\u5c64\u641c\u5c0b\uff0c\u7531\u8fd1\u53ca\u9060\u5730\u8a2a\u554f\u5404\u500b\u7bc0\u9ede\u3002\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\uff0c\u6cbf\u8457\u4e00\u689d\u8def\u5f91\u8d70\u5230\u982d\uff0c\u518d\u56de\u6eaf\u4e26\u5617\u8a66\u5176\u4ed6\u8def\u5f91\uff0c\u76f4\u5230\u8d70\u8a2a\u5b8c\u6574\u500b\u8cc7\u6599\u7d50\u69cb\u3002

    \u66b4\u529b\u641c\u5c0b\u7684\u512a\u9ede\u662f\u7c21\u55ae\u4e14\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u505a\u9810\u8655\u7406\u548c\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\u3002

    \u7136\u800c\uff0c\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u5143\u7d20\u6578\u91cf\uff0c\u56e0\u6b64\u5728\u8cc7\u6599\u91cf\u8f03\u5927\u7684\u60c5\u6cc1\u4e0b\u6548\u80fd\u8f03\u5dee\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9069\u61c9\u641c\u5c0b","text":"

    \u81ea\u9069\u61c9\u641c\u5c0b\u5229\u7528\u8cc7\u6599\u7684\u7279\u6709\u5c6c\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u4f86\u6700\u4f73\u5316\u641c\u5c0b\u904e\u7a0b\uff0c\u5f9e\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    • \u201c\u4e8c\u5206\u641c\u5c0b\u201d\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u5be6\u73fe\u9ad8\u6548\u67e5\u8a62\uff0c\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002
    • \u201c\u96dc\u6e4a\u67e5\u8a62\u201d\u5229\u7528\u96dc\u6e4a\u8868\u5c07\u641c\u5c0b\u8cc7\u6599\u548c\u76ee\u6a19\u8cc7\u6599\u5efa\u7acb\u70ba\u9375\u503c\u5c0d\u5c0d\u6620\uff0c\u5f9e\u800c\u5be6\u73fe\u67e5\u8a62\u64cd\u4f5c\u3002
    • \u201c\u6a39\u67e5\u8a62\u201d\u5728\u7279\u5b9a\u7684\u6a39\u7d50\u69cb\uff08\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\uff09\u4e2d\uff0c\u57fa\u65bc\u6bd4\u8f03\u7bc0\u9ede\u503c\u4f86\u5feb\u901f\u6392\u9664\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    \u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u662f\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u7136\u800c\uff0c\u4f7f\u7528\u9019\u4e9b\u6f14\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u9810\u5148\u5c0d\u9663\u5217\u9032\u884c\u6392\u5e8f\uff0c\u96dc\u6e4a\u67e5\u8a62\u548c\u6a39\u67e5\u8a62\u90fd\u9700\u8981\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u7dad\u8b77\u9019\u4e9b\u8cc7\u6599\u7d50\u69cb\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u958b\u92b7\u3002

    Tip

    \u81ea\u9069\u61c9\u641c\u5c0b\u6f14\u7b97\u6cd5\u5e38\u88ab\u7a31\u70ba\u67e5\u8a62\u6f14\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u65bc\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u6aa2\u7d22\u76ee\u6a19\u5143\u7d20\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u5c0b\u65b9\u6cd5\u9078\u53d6","text":"

    \u7d66\u5b9a\u5927\u5c0f\u70ba \\(n\\) \u7684\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u7dda\u6027\u641c\u5c0b\u3001\u4e8c\u5206\u641c\u5c0b\u3001\u6a39\u67e5\u8a62\u3001\u96dc\u6e4a\u67e5\u8a62\u7b49\u591a\u7a2e\u65b9\u6cd5\u5f9e\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\u3002\u5404\u500b\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u5716 10-11 \u6240\u793a\u3002

    \u5716 10-11 \u00a0 \u591a\u7a2e\u641c\u5c0b\u7b56\u7565

    \u4e0a\u8ff0\u5e7e\u7a2e\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u8207\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

    \u8868 10-1 \u00a0 \u67e5\u8a62\u6f14\u7b97\u6cd5\u6548\u7387\u5c0d\u6bd4

    \u7dda\u6027\u641c\u5c0b \u4e8c\u5206\u641c\u5c0b \u6a39\u67e5\u8a62 \u96dc\u6e4a\u67e5\u8a62 \u67e5\u8a62\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)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u984d\u5916\u7a7a\u9593 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u8cc7\u6599\u9810\u8655\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6a39 \\(O(n \\log n)\\) \u5efa\u96dc\u6e4a\u8868 \\(O(n)\\) \u8cc7\u6599\u662f\u5426\u6709\u5e8f \u7121\u5e8f \u6709\u5e8f \u6709\u5e8f \u7121\u5e8f

    \u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u9078\u64c7\u9084\u53d6\u6c7a\u65bc\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u8207\u66f4\u65b0\u983b\u7387\u7b49\u3002

    \u7dda\u6027\u641c\u5c0b

    • \u901a\u7528\u6027\u8f03\u597d\uff0c\u7121\u9808\u4efb\u4f55\u8cc7\u6599\u9810\u8655\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u5011\u50c5\u9700\u67e5\u8a62\u4e00\u6b21\u8cc7\u6599\uff0c\u90a3\u9ebc\u5176\u4ed6\u4e09\u7a2e\u65b9\u6cd5\u7684\u8cc7\u6599\u9810\u8655\u7406\u7684\u6642\u9593\u6bd4\u7dda\u6027\u641c\u5c0b\u7684\u6642\u9593\u9084\u8981\u66f4\u9577\u3002
    • \u9069\u7528\u65bc\u9ad4\u91cf\u8f03\u5c0f\u7684\u8cc7\u6599\uff0c\u6b64\u60c5\u6cc1\u4e0b\u6642\u9593\u8907\u96dc\u5ea6\u5c0d\u6548\u7387\u5f71\u97ff\u8f03\u5c0f\u3002
    • \u9069\u7528\u65bc\u8cc7\u6599\u66f4\u65b0\u983b\u7387\u8f03\u9ad8\u7684\u5834\u666f\uff0c\u56e0\u70ba\u8a72\u65b9\u6cd5\u4e0d\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u4efb\u4f55\u984d\u5916\u7dad\u8b77\u3002

    \u4e8c\u5206\u641c\u5c0b

    • \u9069\u7528\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u6548\u7387\u8868\u73fe\u7a69\u5b9a\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002
    • \u8cc7\u6599\u91cf\u4e0d\u80fd\u904e\u5927\uff0c\u56e0\u70ba\u5132\u5b58\u9663\u5217\u9700\u8981\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u4e0d\u9069\u7528\u65bc\u9ad8\u983b\u589e\u522a\u8cc7\u6599\u7684\u5834\u666f\uff0c\u56e0\u70ba\u7dad\u8b77\u6709\u5e8f\u9663\u5217\u7684\u958b\u92b7\u8f03\u5927\u3002

    \u96dc\u6e4a\u67e5\u8a62

    • \u9069\u5408\u5c0d\u67e5\u8a62\u6548\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u5834\u666f\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002
    • \u4e0d\u9069\u5408\u9700\u8981\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u7121\u6cd5\u7dad\u8b77\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u3002
    • \u5c0d\u96dc\u6e4a\u51fd\u5f0f\u548c\u96dc\u6e4a\u885d\u7a81\u8655\u7406\u7b56\u7565\u7684\u4f9d\u8cf4\u6027\u8f03\u9ad8\uff0c\u5177\u6709\u8f03\u5927\u7684\u6548\u80fd\u52a3\u5316\u98a8\u96aa\u3002
    • \u4e0d\u9069\u5408\u8cc7\u6599\u91cf\u904e\u5927\u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u9700\u8981\u984d\u5916\u7a7a\u9593\u4f86\u6700\u5927\u7a0b\u5ea6\u5730\u6e1b\u5c11\u885d\u7a81\uff0c\u5f9e\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8a62\u6548\u80fd\u3002

    \u6a39\u67e5\u8a62

    • \u9069\u7528\u65bc\u6d77\u91cf\u8cc7\u6599\uff0c\u56e0\u70ba\u6a39\u7bc0\u9ede\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u5206\u6563\u5132\u5b58\u7684\u3002
    • \u9069\u5408\u9700\u8981\u7dad\u8b77\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\u3002
    • \u5728\u6301\u7e8c\u589e\u522a\u7bc0\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u7522\u751f\u50be\u659c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • \u82e5\u4f7f\u7528 AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5247\u5404\u9805\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a69\u5b9a\u57f7\u884c\uff0c\u4f46\u7dad\u8b77\u6a39\u5e73\u8861\u7684\u64cd\u4f5c\u6703\u589e\u52a0\u984d\u5916\u7684\u958b\u92b7\u3002
    "},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7d50","text":"
    • \u4e8c\u5206\u641c\u5c0b\u4f9d\u8cf4\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u900f\u904e\u8ff4\u5708\u9010\u6b65\u7e2e\u6e1b\u4e00\u534a\u641c\u5c0b\u5340\u9593\u4f86\u9032\u884c\u67e5\u8a62\u3002\u5b83\u8981\u6c42\u8f38\u5165\u8cc7\u6599\u6709\u5e8f\uff0c\u4e14\u50c5\u9069\u7528\u65bc\u9663\u5217\u6216\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u8cc7\u6599\u3002\u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\uff0c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u548c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u9069\u7528\u65bc\u5716\u548c\u6a39\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\uff0c\u4f46\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u8f03\u9ad8\u3002
    • \u96dc\u6e4a\u67e5\u8a62\u3001\u6a39\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u5c6c\u65bc\u9ad8\u6548\u641c\u5c0b\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u85c9\u52a9\u984d\u5916\u8cc7\u6599\u7d50\u69cb\u3002
    • \u5be6\u969b\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5c0d\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u548c\u66f4\u65b0\u983b\u7387\u7b49\u56e0\u7d20\u9032\u884c\u5177\u9ad4\u5206\u6790\uff0c\u5f9e\u800c\u9078\u64c7\u5408\u9069\u7684\u641c\u5c0b\u65b9\u6cd5\u3002
    • \u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u5c0f\u578b\u6216\u983b\u7e41\u66f4\u65b0\u7684\u8cc7\u6599\uff1b\u4e8c\u5206\u641c\u5c0b\u9069\u7528\u65bc\u5927\u578b\u3001\u6392\u5e8f\u7684\u8cc7\u6599\uff1b\u96dc\u6e4a\u67e5\u8a62\u9069\u7528\u65bc\u5c0d\u67e5\u8a62\u6548\u7387\u8981\u6c42\u8f03\u9ad8\u4e14\u7121\u9808\u7bc4\u570d\u67e5\u8a62\u7684\u8cc7\u6599\uff1b\u6a39\u67e5\u8a62\u9069\u7528\u65bc\u9700\u8981\u7dad\u8b77\u9806\u5e8f\u548c\u652f\u6301\u7bc4\u570d\u67e5\u8a62\u7684\u5927\u578b\u52d5\u614b\u8cc7\u6599\u3002
    • \u7528\u96dc\u6e4a\u67e5\u8a62\u66ff\u63db\u7dda\u6027\u67e5\u8a62\u662f\u4e00\u7a2e\u5e38\u7528\u7684\u6700\u4f73\u5316\u57f7\u884c\u6642\u9593\u7684\u7b56\u7565\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
    "},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

    Abstract

    \u6392\u5e8f\u7336\u5982\u4e00\u628a\u5c07\u6df7\u4e82\u8b8a\u70ba\u79e9\u5e8f\u7684\u9b54\u6cd5\u9470\u5319\uff0c\u4f7f\u6211\u5011\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u8207\u8655\u7406\u8cc7\u6599\u3002

    \u7121\u8ad6\u662f\u7c21\u55ae\u7684\u5347\u5e8f\uff0c\u9084\u662f\u8907\u96dc\u7684\u5206\u985e\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u5011\u5c55\u793a\u4e86\u8cc7\u6599\u7684\u548c\u8ae7\u7f8e\u611f\u3002

    "},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5
    • 11.2 \u00a0 \u9078\u64c7\u6392\u5e8f
    • 11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f
    • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
    • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
    • 11.6 \u00a0 \u5408\u4f75\u6392\u5e8f
    • 11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f
    • 11.8 \u00a0 \u6876\u6392\u5e8f
    • 11.9 \u00a0 \u8a08\u6578\u6392\u5e8f
    • 11.10 \u00a0 \u57fa\u6578\u6392\u5e8f
    • 11.11 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f","text":"

    \u6ce1\u6cab\u6392\u5e8f\uff08bubble sort\uff09\u900f\u904e\u9023\u7e8c\u5730\u6bd4\u8f03\u8207\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u5be6\u73fe\u6392\u5e8f\u3002\u9019\u500b\u904e\u7a0b\u5c31\u50cf\u6c23\u6ce1\u5f9e\u5e95\u90e8\u5347\u5230\u9802\u90e8\u4e00\u6a23\uff0c\u56e0\u6b64\u5f97\u540d\u6ce1\u6cab\u6392\u5e8f\u3002

    \u5982\u5716 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u904e\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u4f86\u6a21\u64ec\uff1a\u5f9e\u9663\u5217\u6700\u5de6\u7aef\u958b\u59cb\u5411\u53f3\u8d70\u8a2a\uff0c\u4f9d\u6b21\u6bd4\u8f03\u76f8\u9130\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u63db\u4e8c\u8005\u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u7684\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u5230\u9663\u5217\u7684\u6700\u53f3\u7aef\u3002

    <1><2><3><4><5><6><7>

    \u5716 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u6a21\u64ec\u5192\u6ce1

    "},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6b65\u9a5f\u5982\u5716 11-5 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5c0d \\(n\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    2. \u63a5\u4e0b\u4f86\uff0c\u5c0d\u5269\u9918 \\(n - 1\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u985e\u63a8\uff0c\u7d93\u904e \\(n - 1\\) \u8f2a\u201c\u5192\u6ce1\u201d\u5f8c\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    4. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002

    \u5716 11-5 \u00a0 \u6ce1\u6cab\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
    bubble_sort.cpp
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.java
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.go
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
    bubble_sort.js
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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.c
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    [class]{}-[func]{bubble_sort}\n
    bubble_sort.zig
    // \u6ce1\u6cab\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u6700\u4f73\u5316","text":"

    \u6211\u5011\u767c\u73fe\uff0c\u5982\u679c\u67d0\u8f2a\u201c\u5192\u6ce1\u201d\u4e2d\u6c92\u6709\u57f7\u884c\u4efb\u4f55\u4ea4\u63db\u64cd\u4f5c\uff0c\u8aaa\u660e\u9663\u5217\u5df2\u7d93\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7d50\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u500b\u6a19\u8a8c\u4f4d flag \u4f86\u76e3\u6e2c\u9019\u7a2e\u60c5\u6cc1\uff0c\u4e00\u65e6\u51fa\u73fe\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7d93\u904e\u6700\u4f73\u5316\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(n^2)\\) \uff1b\u4f46\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u53ef\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
    bubble_sort.cpp
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.java
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.cs
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.go
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.js
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.ts
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.dart
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
    bubble_sort.rs
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
    bubble_sort.c
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\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
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.rb
    [class]{}-[func]{bubble_sort_with_flag}\n
    bubble_sort.zig
    // \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5404\u8f2a\u201c\u5192\u6ce1\u201d\u8d70\u8a2a\u7684\u9663\u5217\u9577\u5ea6\u4f9d\u6b21\u70ba \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u7e3d\u548c\u70ba \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u6700\u4f73\u5316\u5f8c\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u63db\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\u5e7e\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u90fd\u5c6c\u65bc\u201c\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u900f\u904e\u6bd4\u8f03\u5143\u7d20\u9593\u7684\u5927\u5c0f\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u6b64\u985e\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7121\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u63a2\u8a0e\u5e7e\u7a2e\u201c\u975e\u6bd4\u8f03\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u7dda\u6027\u968e\u3002

    \u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u900f\u904e\u8a2d\u5b9a\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u9806\u5e8f\u7684\u6876\uff0c\u6bcf\u500b\u6876\u5c0d\u61c9\u4e00\u500b\u6578\u64da\u7bc4\u570d\uff0c\u5c07\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff1b\u7136\u5f8c\uff0c\u5728\u6bcf\u500b\u6876\u5167\u90e8\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff1b\u6700\u7d42\u6309\u7167\u6876\u7684\u9806\u5e8f\u5c07\u6240\u6709\u8cc7\u6599\u5408\u4f75\u3002

    "},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8003\u616e\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u5176\u5143\u7d20\u662f\u7bc4\u570d \\([0, 1)\\) \u5167\u7684\u6d6e\u9ede\u6578\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-13 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316 \\(k\\) \u500b\u6876\uff0c\u5c07 \\(n\\) \u500b\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u500b\u6876\u4e2d\u3002
    2. \u5c0d\u6bcf\u500b\u6876\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff08\u9019\u88e1\u63a1\u7528\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff09\u3002
    3. \u6309\u7167\u6876\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u5408\u4f75\u7d50\u679c\u3002

    \u5716 11-13 \u00a0 \u6876\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

    \u7a0b\u5f0f\u78bc\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums:\n        # \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i = int(num * k)\n        # \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = num * k;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int) (num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int)(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i := int(num * float64(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5167\u5efa\u5207\u7247\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 _num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c07 _num \u65b0\u589e\u9032\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\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 \u500b\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8a18\u9304\u6bcf\u500b\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52d5\u614b\u9663\u5217\u7684\u9663\u5217\uff08\u6876\uff09\n    // \u70ba\u6bcf\u500b\u6876\u9810\u5206\u914d\u8db3\u5920\u7684\u7a7a\u9593\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\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. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u4f75\u6392\u5e8f\u5f8c\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        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(buckets[i]);\n    }\n}\n
    bucket_sort.kt
    /* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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
    [class]{}-[func]{bucket_sort}\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u6876\u6392\u5e8f\u9069\u7528\u65bc\u8655\u7406\u9ad4\u91cf\u5f88\u5927\u7684\u8cc7\u6599\u3002\u4f8b\u5982\uff0c\u8f38\u5165\u8cc7\u6599\u5305\u542b 100 \u842c\u500b\u5143\u7d20\uff0c\u7531\u65bc\u7a7a\u9593\u9650\u5236\uff0c\u7cfb\u7d71\u8a18\u61b6\u9ad4\u7121\u6cd5\u4e00\u6b21\u6027\u8f09\u5165\u6240\u6709\u8cc7\u6599\u3002\u6b64\u6642\uff0c\u53ef\u4ee5\u5c07\u8cc7\u6599\u5206\u6210 1000 \u500b\u6876\uff0c\u7136\u5f8c\u5206\u5225\u5c0d\u6bcf\u500b\u6876\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5408\u4f75\u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\) \uff1a\u5047\u8a2d\u5143\u7d20\u5728\u5404\u500b\u6876\u5167\u5e73\u5747\u5206\u4f48\uff0c\u90a3\u9ebc\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u6578\u91cf\u70ba \\(\\frac{n}{k}\\) \u3002\u5047\u8a2d\u6392\u5e8f\u55ae\u500b\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u6642\u9593\uff0c\u5247\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u6642\u9593\u3002\u7576\u6876\u6578\u91cf \\(k\\) \u6bd4\u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5247\u8da8\u5411\u65bc \\(O(n)\\) \u3002\u5408\u4f75\u7d50\u679c\u6642\u9700\u8981\u8d70\u8a2a\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8cbb \\(O(n + k)\\) \u6642\u9593\u3002
    • \u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u8cc7\u6599\u88ab\u5206\u914d\u5230\u4e00\u500b\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8a72\u6876\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u85c9\u52a9 \\(k\\) \u500b\u6876\u548c\u7e3d\u5171 \\(n\\) \u500b\u5143\u7d20\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a69\u5b9a\u53d6\u6c7a\u65bc\u6392\u5e8f\u6876\u5167\u5143\u7d20\u7684\u6f14\u7b97\u6cd5\u662f\u5426\u7a69\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5be6\u73fe\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7406\u8ad6\u4e0a\u53ef\u4ee5\u9054\u5230 \\(O(n)\\) \uff0c\u95dc\u9375\u5728\u65bc\u5c07\u5143\u7d20\u5747\u52fb\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u56e0\u70ba\u5be6\u969b\u8cc7\u6599\u5f80\u5f80\u4e0d\u662f\u5747\u52fb\u5206\u4f48\u7684\u3002\u4f8b\u5982\uff0c\u6211\u5011\u60f3\u8981\u5c07\u6dd8\u5bf6\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u50f9\u683c\u7bc4\u570d\u5e73\u5747\u5206\u914d\u5230 10 \u500b\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u50f9\u683c\u5206\u4f48\u4e0d\u5747\uff0c\u4f4e\u65bc 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u65bc 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c07\u50f9\u683c\u5340\u9593\u5e73\u5747\u5283\u5206\u70ba 10 \u500b\uff0c\u5404\u500b\u6876\u4e2d\u7684\u5546\u54c1\u6578\u91cf\u5dee\u8ddd\u6703\u975e\u5e38\u5927\u3002

    \u70ba\u5be6\u73fe\u5e73\u5747\u5206\u914d\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u8a2d\u5b9a\u4e00\u689d\u5927\u81f4\u7684\u5206\u754c\u7dda\uff0c\u5c07\u8cc7\u6599\u7c97\u7565\u5730\u5206\u5230 3 \u500b\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u7562\u5f8c\uff0c\u518d\u5c07\u5546\u54c1\u8f03\u591a\u7684\u6876\u7e7c\u7e8c\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6578\u91cf\u5927\u81f4\u76f8\u7b49\u3002

    \u5982\u5716 11-14 \u6240\u793a\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u5efa\u7acb\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u76ee\u6a19\u662f\u8b93\u8449\u7bc0\u9ede\u7684\u503c\u5118\u53ef\u80fd\u5e73\u5747\u3002\u7576\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f2a\u5c07\u8cc7\u6599\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u5177\u9ad4\u5283\u5206\u65b9\u5f0f\u53ef\u6839\u64da\u8cc7\u6599\u7279\u9ede\u9748\u6d3b\u9078\u64c7\u3002

    \u5716 11-14 \u00a0 \u905e\u8ff4\u5283\u5206\u6876

    \u5982\u679c\u6211\u5011\u63d0\u524d\u77e5\u9053\u5546\u54c1\u50f9\u683c\u7684\u6a5f\u7387\u5206\u4f48\uff0c\u5247\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u6a5f\u7387\u5206\u4f48\u8a2d\u5b9a\u6bcf\u500b\u6876\u7684\u50f9\u683c\u5206\u754c\u7dda\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8cc7\u6599\u5206\u4f48\u4e26\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7d71\u8a08\uff0c\u4e5f\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u7279\u9ede\u63a1\u7528\u67d0\u7a2e\u6a5f\u7387\u6a21\u578b\u9032\u884c\u8fd1\u4f3c\u3002

    \u5982\u5716 11-15 \u6240\u793a\uff0c\u6211\u5011\u5047\u8a2d\u5546\u54c1\u50f9\u683c\u670d\u5f9e\u6b63\u614b\u5206\u4f48\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8a2d\u5b9a\u50f9\u683c\u5340\u9593\uff0c\u5f9e\u800c\u5c07\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\u3002

    \u5716 11-15 \u00a0 \u6839\u64da\u6a5f\u7387\u5206\u4f48\u5283\u5206\u6876

    "},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8a08\u6578\u6392\u5e8f","text":"

    \u8a08\u6578\u6392\u5e8f\uff08counting sort\uff09\u900f\u904e\u7d71\u8a08\u5143\u7d20\u6578\u91cf\u4f86\u5be6\u73fe\u6392\u5e8f\uff0c\u901a\u5e38\u61c9\u7528\u65bc\u6574\u6578\u9663\u5217\u3002

    "},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7c21\u55ae\u5be6\u73fe","text":"

    \u5148\u4f86\u770b\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\u3002\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8ca0\u6574\u6578\u201d\uff0c\u8a08\u6578\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-16 \u6240\u793a\u3002

    1. \u8d70\u8a2a\u9663\u5217\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6578\u5b57\uff0c\u8a18\u70ba \\(m\\) \uff0c\u7136\u5f8c\u5efa\u7acb\u4e00\u500b\u9577\u5ea6\u70ba \\(m + 1\\) \u7684\u8f14\u52a9\u9663\u5217 counter \u3002
    2. \u85c9\u52a9 counter \u7d71\u8a08 nums \u4e2d\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\uff0c\u5176\u4e2d counter[num] \u5c0d\u61c9\u6578\u5b57 num \u7684\u51fa\u73fe\u6b21\u6578\u3002\u7d71\u8a08\u65b9\u6cd5\u5f88\u7c21\u55ae\uff0c\u53ea\u9700\u8d70\u8a2a nums\uff08\u8a2d\u7576\u524d\u6578\u5b57\u70ba num\uff09\uff0c\u6bcf\u8f2a\u5c07 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
    3. \u7531\u65bc counter \u7684\u5404\u500b\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u7576\u65bc\u6240\u6709\u6578\u5b57\u5df2\u7d93\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8d70\u8a2a counter \uff0c\u6839\u64da\u5404\u6578\u5b57\u51fa\u73fe\u6b21\u6578\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

    \u5716 11-16 \u00a0 \u8a08\u6578\u6392\u5e8f\u6d41\u7a0b

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\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. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    [class]{}-[func]{counting_sort_naive}\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8a08\u6578\u6392\u5e8f\u8207\u6876\u6392\u5e8f\u7684\u95dc\u806f

    \u5f9e\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u6578\u6392\u5e8f\u4e2d\u7684\u8a08\u6578\u9663\u5217 counter \u7684\u6bcf\u500b\u7d22\u5f15\u8996\u70ba\u4e00\u500b\u6876\uff0c\u5c07\u7d71\u8a08\u6578\u91cf\u7684\u904e\u7a0b\u770b\u4f5c\u5c07\u5404\u500b\u5143\u7d20\u5206\u914d\u5230\u5c0d\u61c9\u7684\u6876\u4e2d\u3002\u672c\u8cea\u4e0a\uff0c\u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u8cc7\u6599\u4e0b\u7684\u4e00\u500b\u7279\u4f8b\u3002

    "},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5be6\u73fe","text":"

    \u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u5982\u679c\u8f38\u5165\u8cc7\u6599\u662f\u7269\u4ef6\uff0c\u4e0a\u8ff0\u6b65\u9a5f 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u662f\u5546\u54c1\u7269\u4ef6\uff0c\u6211\u5011\u60f3\u6309\u7167\u5546\u54c1\u50f9\u683c\uff08\u985e\u5225\u7684\u6210\u54e1\u8b8a\u6578\uff09\u5c0d\u5546\u54c1\u9032\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u6f14\u7b97\u6cd5\u53ea\u80fd\u7d66\u51fa\u50f9\u683c\u7684\u6392\u5e8f\u7d50\u679c\u3002

    \u90a3\u9ebc\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u8cc7\u6599\u7684\u6392\u5e8f\u7d50\u679c\u5462\uff1f\u6211\u5011\u9996\u5148\u8a08\u7b97 counter \u7684\u201c\u524d\u7db4\u548c\u201d\u3002\u9867\u540d\u601d\u7fa9\uff0c\u7d22\u5f15 i \u8655\u7684\u524d\u7db4\u548c prefix[i] \u7b49\u65bc\u9663\u5217\u524d i \u500b\u5143\u7d20\u4e4b\u548c\uff1a

    \\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

    \u524d\u7db4\u548c\u5177\u6709\u660e\u78ba\u7684\u610f\u7fa9\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7d50\u679c\u9663\u5217 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\u3002\u9019\u500b\u8cc7\u8a0a\u975e\u5e38\u95dc\u9375\uff0c\u56e0\u70ba\u5b83\u544a\u8a34\u6211\u5011\u5404\u500b\u5143\u7d20\u61c9\u8a72\u51fa\u73fe\u5728\u7d50\u679c\u9663\u5217\u7684\u54ea\u500b\u4f4d\u7f6e\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5012\u5e8f\u8d70\u8a2a\u539f\u9663\u5217 nums \u7684\u6bcf\u500b\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u5c07 num \u586b\u5165\u9663\u5217 res \u7684\u7d22\u5f15 prefix[num] - 1 \u8655\u3002
    2. \u4ee4\u524d\u7db4\u548c prefix[num] \u6e1b\u5c0f \\(1\\) \uff0c\u5f9e\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

    \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u9663\u5217 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7d50\u679c\uff0c\u6700\u5f8c\u4f7f\u7528 res \u8986\u84cb\u539f\u9663\u5217 nums \u5373\u53ef\u3002\u5716 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8a08\u6578\u6392\u5e8f\u6d41\u7a0b\u3002

    <1><2><3><4><5><6><7><8>

    \u5716 11-17 \u00a0 \u8a08\u6578\u6392\u5e8f\u6b65\u9a5f

    \u8a08\u6578\u6392\u5e8f\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    # \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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  # \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1  # \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n
    counting_sort.cpp
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    nums = res;\n}\n
    counting_sort.java
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.cs
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.go
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    copy(nums, res)\n}\n
    counting_sort.swift
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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 // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1 // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.js
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.ts
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.dart
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n  // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 _num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n    counter[_num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  nums.setAll(0, res);\n}\n
    counting_sort.rs
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.c
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\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. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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 // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]-- // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.rb
    [class]{}-[func]{counting_sort}\n
    counting_sort.zig
    [class]{}-[func]{countingSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\) \uff1a\u6d89\u53ca\u8d70\u8a2a nums \u548c\u8d70\u8a2a counter \uff0c\u90fd\u4f7f\u7528\u7dda\u6027\u6642\u9593\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b \\(n \\gg m\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u65bc \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u85c9\u52a9\u4e86\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \u7684\u9663\u5217 res \u548c counter \u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u9806\u5e8f\u662f\u201c\u5f9e\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u8d70\u8a2a nums \u53ef\u4ee5\u907f\u514d\u6539\u8b8a\u76f8\u7b49\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5be6\u73fe\u7a69\u5b9a\u6392\u5e8f\u3002\u5be6\u969b\u4e0a\uff0c\u6b63\u5e8f\u8d70\u8a2a nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\uff0c\u4f46\u7d50\u679c\u662f\u975e\u7a69\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u4fb7\u9650\u6027","text":"

    \u770b\u5230\u9019\u88e1\uff0c\u4f60\u4e5f\u8a31\u6703\u89ba\u5f97\u8a08\u6578\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u50c5\u900f\u904e\u7d71\u8a08\u6578\u91cf\u5c31\u53ef\u4ee5\u5be6\u73fe\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\u76f8\u5c0d\u8f03\u70ba\u56b4\u683c\u3002

    \u8a08\u6578\u6392\u5e8f\u53ea\u9069\u7528\u65bc\u975e\u8ca0\u6574\u6578\u3002\u82e5\u60f3\u5c07\u5176\u7528\u65bc\u5176\u4ed6\u578b\u5225\u7684\u8cc7\u6599\uff0c\u9700\u8981\u78ba\u4fdd\u9019\u4e9b\u8cc7\u6599\u53ef\u4ee5\u8f49\u63db\u70ba\u975e\u8ca0\u6574\u6578\uff0c\u4e26\u4e14\u5728\u8f49\u63db\u904e\u7a0b\u4e2d\u4e0d\u80fd\u6539\u8b8a\u5404\u500b\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u5927\u5c0f\u95dc\u4fc2\u3002\u4f8b\u5982\uff0c\u5c0d\u65bc\u5305\u542b\u8ca0\u6578\u7684\u6574\u6578\u9663\u5217\uff0c\u53ef\u4ee5\u5148\u7d66\u6240\u6709\u6578\u5b57\u52a0\u4e0a\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5168\u90e8\u6578\u5b57\u8f49\u5316\u70ba\u6b63\u6578\uff0c\u6392\u5e8f\u5b8c\u6210\u5f8c\u518d\u8f49\u63db\u56de\u53bb\u3002

    \u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5247\u6703\u4f54\u7528\u904e\u591a\u7a7a\u9593\u3002\u800c\u7576 \\(n \\ll m\\) \u6642\uff0c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u9084\u8981\u6162\u3002

    "},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f","text":"

    Tip

    \u95b1\u8b80\u672c\u7bc0\u524d\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b78\u5b8c\u201c\u5806\u7a4d\u201c\u7ae0\u7bc0\u3002

    \u5806\u7a4d\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\u7684\u9ad8\u6548\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u6211\u5011\u53ef\u4ee5\u5229\u7528\u5df2\u7d93\u5b78\u904e\u7684\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u201d\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\u3002

    1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5c0f\u9802\u5806\u7a4d\uff0c\u6b64\u6642\u6700\u5c0f\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
    2. \u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8a18\u9304\u51fa\u5806\u7a4d\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u96d6\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u85c9\u52a9\u4e00\u500b\u984d\u5916\u9663\u5217\u4f86\u5132\u5b58\u5f48\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f03\u6d6a\u8cbb\u7a7a\u9593\u3002\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u4e00\u7a2e\u66f4\u52a0\u512a\u96c5\u7684\u5be6\u73fe\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5806\u7a4d\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-12 \u6240\u793a\u3002

    1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5927\u9802\u5806\u7a4d\u3002\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
    2. \u5c07\u5806\u7a4d\u9802\u5143\u7d20\uff08\u7b2c\u4e00\u500b\u5143\u7d20\uff09\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u6700\u5f8c\u4e00\u500b\u5143\u7d20\uff09\u4ea4\u63db\u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u6e1b \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6578\u91cf\u52a0 \\(1\\) \u3002
    3. \u5f9e\u5806\u7a4d\u9802\u5143\u7d20\u958b\u59cb\uff0c\u5f9e\u9802\u5230\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u7a4d\u5316\u5f8c\uff0c\u5806\u7a4d\u7684\u6027\u8cea\u5f97\u5230\u4fee\u5fa9\u3002
    4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u8ff4\u5708 \\(n - 1\\) \u8f2a\u5f8c\uff0c\u5373\u53ef\u5b8c\u6210\u9663\u5217\u6392\u5e8f\u3002

    Tip

    \u5be6\u969b\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u500b\u5f48\u51fa\u5143\u7d20\u7684\u6b65\u9a5f\u3002

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

    \u5716 11-12 \u00a0 \u5806\u7a4d\u6392\u5e8f\u6b65\u9a5f

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u4f7f\u7528\u4e86\u8207\u201c\u5806\u7a4d\u201d\u7ae0\u7bc0\u76f8\u540c\u7684\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 sift_down() \u51fd\u5f0f\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u5806\u7a4d\u7684\u9577\u5ea6\u6703\u96a8\u8457\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u6e1b\u5c0f\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u7d66 sift_down() \u51fd\u5f0f\u65b0\u589e\u4e00\u500b\u9577\u5ea6\u53c3\u6578 \\(n\\) \uff0c\u7528\u65bc\u6307\u5b9a\u5806\u7a4d\u7684\u7576\u524d\u6709\u6548\u9577\u5ea6\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u7a4d\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0)\n
    heap_sort.cpp
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.java
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.cs
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
    heap_sort.go
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.swift
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums.swapAt(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\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    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
    heap_sort.js
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.ts
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.dart
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
    heap_sort.rs
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
    heap_sort.c
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.kt
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.rb
    [class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5efa\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff0c\u5171\u8ff4\u5708 \\(n - 1\\) \u8f2a\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u4f7f\u7528 \\(O(1)\\) \u7a7a\u9593\u3002\u5143\u7d20\u4ea4\u63db\u548c\u5806\u7a4d\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u548c\u5806\u7a4d\u5e95\u5143\u7d20\u6642\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5c0d\u4f4d\u7f6e\u53ef\u80fd\u767c\u751f\u8b8a\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\u7a2e\u7c21\u55ae\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u8207\u624b\u52d5\u6574\u7406\u4e00\u526f\u724c\u7684\u904e\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u9ad4\u4f86\u8aaa\uff0c\u6211\u5011\u5728\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u4e00\u500b\u57fa\u6e96\u5143\u7d20\uff0c\u5c07\u8a72\u5143\u7d20\u8207\u5176\u5de6\u5074\u5df2\u6392\u5e8f\u5340\u9593\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f03\u5927\u5c0f\uff0c\u4e26\u5c07\u8a72\u5143\u7d20\u63d2\u5165\u5230\u6b63\u78ba\u7684\u4f4d\u7f6e\u3002

    \u5716 11-6 \u5c55\u793a\u4e86\u9663\u5217\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8a2d\u57fa\u6e96\u5143\u7d20\u70ba base \uff0c\u6211\u5011\u9700\u8981\u5c07\u5f9e\u76ee\u6a19\u7d22\u5f15\u5230 base \u4e4b\u9593\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\uff0c\u7136\u5f8c\u5c07 base \u8ce6\u503c\u7d66\u76ee\u6a19\u7d22\u5f15\u3002

    \u5716 11-6 \u00a0 \u55ae\u6b21\u63d2\u5165\u64cd\u4f5c

    "},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-7 \u6240\u793a\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u9663\u5217\u7684\u7b2c 1 \u500b\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9078\u53d6\u9663\u5217\u7684\u7b2c 2 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9078\u53d6\u7b2c 3 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 3 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u985e\u63a8\uff0c\u5728\u6700\u5f8c\u4e00\u8f2a\u4e2d\uff0c\u9078\u53d6\u6700\u5f8c\u4e00\u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    \u5716 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
    def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n
    insertion_sort.cpp
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.java
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.cs
    /* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.go
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.dart
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  }\n}\n
    insertion_sort.rs
    /* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
    insertion_sort.kt
    /* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u8ff4\u5708: \u5df2\u6392\u5e8f\u5143\u7d20\u70ba 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.rb
    ### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  end\nend\n
    insertion_sort.zig
    // \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [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        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u5225\u9700\u8981\u8ff4\u5708 \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u8cc7\u6599\u6642\uff0c\u63d2\u5165\u64cd\u4f5c\u6703\u63d0\u524d\u7d42\u6b62\u3002\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u63d2\u5165\u6392\u5e8f\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u6703\u5c07\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\uff0c\u4e0d\u6703\u6539\u8b8a\u5b83\u5011\u7684\u9806\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u512a\u52e2","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u800c\u6211\u5011\u5373\u5c07\u5b78\u7fd2\u7684\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u5118\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u7684\u60c5\u6cc1\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u9019\u500b\u7d50\u8ad6\u8207\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u7684\u9069\u7528\u60c5\u6cc1\u7684\u7d50\u8ad6\u985e\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u9019\u985e \\(O(n \\log n)\\) \u7684\u6f14\u7b97\u6cd5\u5c6c\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u55ae\u5143\u8a08\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6578\u503c\u6bd4\u8f03\u63a5\u8fd1\uff0c\u8907\u96dc\u5ea6\u4e0d\u4f54\u4e3b\u5c0e\u5730\u4f4d\uff0c\u6bcf\u8f2a\u4e2d\u7684\u55ae\u5143\u64cd\u4f5c\u6578\u91cf\u8d77\u5230\u6c7a\u5b9a\u6027\u4f5c\u7528\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u63a1\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u70ba\uff1a\u5c0d\u65bc\u9577\u9663\u5217\uff0c\u63a1\u7528\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5c0d\u65bc\u77ed\u9663\u5217\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u96d6\u7136\u6ce1\u6cab\u6392\u5e8f\u3001\u9078\u64c7\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \uff0c\u4f46\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u983b\u7387\u986f\u8457\u9ad8\u65bc\u6ce1\u6cab\u6392\u5e8f\u548c\u9078\u64c7\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u6ce1\u6cab\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u4ea4\u63db\u5be6\u73fe\uff0c\u9700\u8981\u85c9\u52a9\u4e00\u500b\u81e8\u6642\u8b8a\u6578\uff0c\u5171\u6d89\u53ca 3 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u8ce6\u503c\u5be6\u73fe\uff0c\u50c5\u9700 1 \u500b\u55ae\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u8a08\u7b97\u958b\u92b7\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9078\u64c7\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u6cc1\u4e0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002\u5982\u679c\u7d66\u5b9a\u4e00\u7d44\u90e8\u5206\u6709\u5e8f\u7684\u8cc7\u6599\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9078\u64c7\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9078\u64c7\u6392\u5e8f\u4e0d\u7a69\u5b9a\uff0c\u7121\u6cd5\u61c9\u7528\u65bc\u591a\u7d1a\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5408\u4f75\u6392\u5e8f","text":"

    \u5408\u4f75\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5305\u542b\u5716 11-10 \u6240\u793a\u7684\u201c\u5283\u5206\u201d\u548c\u201c\u5408\u4f75\u201d\u968e\u6bb5\u3002

    1. \u5283\u5206\u968e\u6bb5\uff1a\u900f\u904e\u905e\u8ff4\u4e0d\u65b7\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u958b\uff0c\u5c07\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u8f49\u63db\u70ba\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002
    2. \u5408\u4f75\u968e\u6bb5\uff1a\u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u5283\u5206\uff0c\u958b\u59cb\u5408\u4f75\uff0c\u6301\u7e8c\u5730\u5c07\u5de6\u53f3\u5169\u500b\u8f03\u77ed\u7684\u6709\u5e8f\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u8f03\u9577\u7684\u6709\u5e8f\u9663\u5217\uff0c\u76f4\u81f3\u7d50\u675f\u3002

    \u5716 11-10 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5283\u5206\u8207\u5408\u4f75\u968e\u6bb5

    "},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5982\u5716 11-11 \u6240\u793a\uff0c\u201c\u5283\u5206\u968e\u6bb5\u201d\u5f9e\u9802\u81f3\u5e95\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u5207\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002

    1. \u8a08\u7b97\u9663\u5217\u4e2d\u9ede mid \uff0c\u905e\u8ff4\u5283\u5206\u5de6\u5b50\u9663\u5217\uff08\u5340\u9593 [left, mid] \uff09\u548c\u53f3\u5b50\u9663\u5217\uff08\u5340\u9593 [mid + 1, right] \uff09\u3002
    2. \u905e\u8ff4\u57f7\u884c\u6b65\u9a5f 1. \uff0c\u76f4\u81f3\u5b50\u9663\u5217\u5340\u9593\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u3002

    \u201c\u5408\u4f75\u968e\u6bb5\u201d\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f9e\u9577\u5ea6\u70ba 1 \u7684\u5b50\u9663\u5217\u958b\u59cb\u5408\u4f75\uff0c\u5408\u4f75\u968e\u6bb5\u4e2d\u7684\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u662f\u6709\u5e8f\u7684\u3002

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

    \u5716 11-11 \u00a0 \u5408\u4f75\u6392\u5e8f\u6b65\u9a5f

    \u89c0\u5bdf\u767c\u73fe\uff0c\u5408\u4f75\u6392\u5e8f\u8207\u4e8c\u5143\u6a39\u5f8c\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u9806\u5e8f\u662f\u4e00\u81f4\u7684\u3002

    • \u5f8c\u5e8f\u8d70\u8a2a\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u6a39\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u6a39\uff0c\u6700\u5f8c\u8655\u7406\u6839\u7bc0\u9ede\u3002
    • \u5408\u4f75\u6392\u5e8f\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u9663\u5217\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u9663\u5217\uff0c\u6700\u5f8c\u8655\u7406\u5408\u4f75\u3002

    \u5408\u4f75\u6392\u5e8f\u7684\u5be6\u73fe\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\u3002\u8acb\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u4f75\u5340\u9593\u70ba [left, right] \uff0c\u800c tmp \u7684\u5c0d\u61c9\u5340\u9593\u70ba [0, right - left] \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\"\"\"\n    # \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    # \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    # \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\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    \"\"\"\u5408\u4f75\u6392\u5e8f\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if left >= right:\n        return  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    # \u5283\u5206\u968e\u6bb5\n    mid = (left + right) // 2  # \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid)  # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right)  # \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    # \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n
    merge_sort.cpp
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.java
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.cs
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;       // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    MergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    MergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    Merge(nums, left, mid, right);\n}\n
    merge_sort.go
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.swift
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right { // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums: &nums, left: left, right: mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
    merge_sort.js
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.ts
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.dart
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n  // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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  // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  // \u5283\u5206\u968e\u6bb5\n  int mid = (left + right) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\n  mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n  mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n  // \u5408\u4f75\u968e\u6bb5\n  merge(nums, left, mid, right);\n}\n
    merge_sort.rs
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    }\n\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.c
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.kt
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return  // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    val mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.rb
    [class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
    merge_sort.zig
    // \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n// \u5de6\u5b50\u9663\u5217\u5340\u9593 [left, mid]\n// \u53f3\u5b50\u9663\u5217\u5340\u9593 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f14\u52a9\u9663\u5217\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\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u5225\u6307\u5411\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u900f\u904e\u8986\u84cb\u539f\u9663\u5217 nums \u4f86\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u53f3\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 <= \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u5de6\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u672a\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 > \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5408\u4f75\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;              // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    var mid = (left + right) / 2;           // \u8a08\u7b97\u4e2d\u9ede\n    try mergeSort(nums, left, mid);         // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    try mergeSort(nums, mid + 1, right);    // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    try merge(nums, left, mid, right);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5283\u5206\u7522\u751f\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u5c64\u5408\u4f75\u7684\u7e3d\u64cd\u4f5c\u6578\u91cf\u70ba \\(n\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u905e\u8ff4\u6df1\u5ea6\u70ba \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u5408\u4f75\u64cd\u4f5c\u9700\u8981\u85c9\u52a9\u8f14\u52a9\u9663\u5217\u5be6\u73fe\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u4f75\u904e\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u8b8a\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u93c8\u7d50\u4e32\u5217\u6392\u5e8f","text":"

    \u5c0d\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u5408\u4f75\u6392\u5e8f\u76f8\u8f03\u65bc\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\u5177\u6709\u986f\u8457\u512a\u52e2\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u6392\u5e8f\u4efb\u52d9\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002

    • \u5283\u5206\u968e\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u905e\u8ff4\u201d\u4f86\u5be6\u73fe\u93c8\u7d50\u4e32\u5217\u5283\u5206\u5de5\u4f5c\uff0c\u5f9e\u800c\u7701\u53bb\u905e\u8ff4\u4f7f\u7528\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
    • \u5408\u4f75\u968e\u6bb5\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u50c5\u9700\u6539\u8b8a\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u5be6\u73fe\uff0c\u56e0\u6b64\u5408\u4f75\u968e\u6bb5\uff08\u5c07\u5169\u500b\u77ed\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\u5408\u4f75\u70ba\u4e00\u500b\u9577\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\uff09\u7121\u9808\u5efa\u7acb\u984d\u5916\u93c8\u7d50\u4e32\u5217\u3002

    \u5177\u9ad4\u5be6\u73fe\u7d30\u7bc0\u6bd4\u8f03\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u76f8\u95dc\u8cc7\u6599\u9032\u884c\u5b78\u7fd2\u3002

    "},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

    \u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u57f7\u884c\u9ad8\u6548\uff0c\u61c9\u7528\u5ee3\u6cdb\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5176\u76ee\u6a19\u662f\uff1a\u9078\u64c7\u9663\u5217\u4e2d\u7684\u67d0\u500b\u5143\u7d20\u4f5c\u70ba\u201c\u57fa\u6e96\u6578\u201d\uff0c\u5c07\u6240\u6709\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u5074\uff0c\u800c\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u5074\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u54e8\u5175\u5283\u5206\u7684\u6d41\u7a0b\u5982\u5716 11-8 \u6240\u793a\u3002

    1. \u9078\u53d6\u9663\u5217\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u521d\u59cb\u5316\u5169\u500b\u6307\u6a19 i \u548c j \u5206\u5225\u6307\u5411\u9663\u5217\u7684\u5169\u7aef\u3002
    2. \u8a2d\u5b9a\u4e00\u500b\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u5225\u5c0b\u627e\u7b2c\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u5f8c\u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\u3002
    3. \u8ff4\u5708\u57f7\u884c\u6b65\u9a5f 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u6642\u505c\u6b62\uff0c\u6700\u5f8c\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u500b\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 11-8 \u00a0 \u54e8\u5175\u5283\u5206\u6b65\u9a5f

    \u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u539f\u9663\u5217\u88ab\u5283\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u9663\u5217\u3001\u57fa\u6e96\u6578\u3001\u53f3\u5b50\u9663\u5217\uff0c\u4e14\u6eff\u8db3\u201c\u5de6\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u6e96\u6578 \\(\\leq\\) \u53f3\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u53ea\u9700\u5c0d\u9019\u5169\u500b\u5b50\u9663\u5217\u9032\u884c\u6392\u5e8f\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    \u54e8\u5175\u5283\u5206\u7684\u5be6\u8cea\u662f\u5c07\u4e00\u500b\u8f03\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u7c21\u5316\u70ba\u5169\u500b\u8f03\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u5143\u7d20\u4ea4\u63db */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u54e8\u5175\u5283\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u54e8\u5175\u5283\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.js
    /* \u5143\u7d20\u4ea4\u63db */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u54e8\u5175\u5283\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n    return i;\n}\n
    quick_sort.kt
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i              // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    [class]{QuickSort}-[func]{partition}\n
    quick_sort.zig
    // \u5143\u7d20\u4ea4\u63db\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\u5283\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5feb\u901f\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-9 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5c0d\u539f\u9663\u5217\u57f7\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u3002
    2. \u7136\u5f8c\uff0c\u5c0d\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5206\u5225\u905e\u8ff4\u57f7\u884c\u201c\u54e8\u5175\u5283\u5206\u201d\u3002
    3. \u6301\u7e8c\u905e\u8ff4\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\uff0c\u5f9e\u800c\u5b8c\u6210\u6574\u500b\u9663\u5217\u7684\u6392\u5e8f\u3002

    \u5716 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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right:\n        return\n    # \u54e8\u5175\u5283\u5206\n    pivot = self.partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = Partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    pivot := q.partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  if (left >= right) return;\n  // \u54e8\u5175\u5283\u5206\n  int pivot = _partition(nums, left, right);\n  // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return\n    // \u54e8\u5175\u5283\u5206\n    val pivot = partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
    quick_sort.rb
    [class]{QuickSort}-[func]{quick_sort}\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    var pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u6cc1\u4e0b\uff0c\u54e8\u5175\u5283\u5206\u7684\u905e\u8ff4\u5c64\u6578\u70ba \\(\\log n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u7e3d\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n \\log n)\\) \u6642\u9593\u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u5283\u5206\u70ba\u9577\u5ea6\u70ba \\(0\\) \u548c \\(n - 1\\) \u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u6b64\u6642\u905e\u8ff4\u5c64\u6578\u9054\u5230 \\(n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f38\u5165\u9663\u5217\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u6cc1\u4e0b\uff0c\u9054\u5230\u6700\u5dee\u905e\u8ff4\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\uff0c\u672a\u85c9\u52a9\u984d\u5916\u9663\u5217\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5283\u5206\u7684\u6700\u5f8c\u4e00\u6b65\uff0c\u57fa\u6e96\u6578\u53ef\u80fd\u6703\u88ab\u4ea4\u63db\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u70ba\u4ec0\u9ebc\u5feb","text":"

    \u5f9e\u540d\u7a31\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u61c9\u8a72\u5177\u6709\u4e00\u5b9a\u7684\u512a\u52e2\u3002\u5118\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u8207\u201c\u5408\u4f75\u6392\u5e8f\u201d\u548c\u201c\u5806\u7a4d\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\u73fe\u6700\u5dee\u60c5\u6cc1\u7684\u6a5f\u7387\u5f88\u4f4e\uff1a\u96d6\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u6c92\u6709\u5408\u4f75\u6392\u5e8f\u7a69\u5b9a\uff0c\u4f46\u5728\u7d55\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u57f7\u884c\u3002
    • \u5feb\u53d6\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u57f7\u884c\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u6642\uff0c\u7cfb\u7d71\u53ef\u5c07\u6574\u500b\u5b50\u9663\u5217\u8f09\u5165\u5230\u5feb\u53d6\uff0c\u56e0\u6b64\u8a2a\u554f\u5143\u7d20\u7684\u6548\u7387\u8f03\u9ad8\u3002\u800c\u50cf\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u9019\u985e\u6f14\u7b97\u6cd5\u9700\u8981\u8df3\u8e8d\u5f0f\u8a2a\u554f\u5143\u7d20\uff0c\u5f9e\u800c\u7f3a\u4e4f\u9019\u4e00\u7279\u6027\u3002
    • \u8907\u96dc\u5ea6\u7684\u5e38\u6578\u4fc2\u6578\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u7a2e\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f03\u3001\u8ce6\u503c\u3001\u4ea4\u63db\u7b49\u64cd\u4f5c\u7684\u7e3d\u6578\u91cf\u6700\u5c11\u3002\u9019\u8207\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u985e\u4f3c\u3002
    "},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u6e96\u6578\u6700\u4f73\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\u7684\u6642\u9593\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u8209\u4e00\u500b\u6975\u7aef\u4f8b\u5b50\uff0c\u5047\u8a2d\u8f38\u5165\u9663\u5217\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u65bc\u6211\u5011\u9078\u64c7\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u5728\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u57fa\u6e96\u6578\u88ab\u4ea4\u63db\u81f3\u9663\u5217\u6700\u53f3\u7aef\uff0c\u5c0e\u81f4\u5de6\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(n - 1\\)\u3001\u53f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(0\\) \u3002\u5982\u6b64\u905e\u8ff4\u4e0b\u53bb\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u5f8c\u90fd\u6709\u4e00\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u70ba\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

    \u70ba\u4e86\u5118\u91cf\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u767c\u751f\uff0c\u6211\u5011\u53ef\u4ee5\u6700\u4f73\u5316\u54e8\u5175\u5283\u5206\u4e2d\u7684\u57fa\u6e96\u6578\u7684\u9078\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u5011\u53ef\u4ee5\u96a8\u6a5f\u9078\u53d6\u4e00\u500b\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u7136\u800c\uff0c\u5982\u679c\u904b\u6c23\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9078\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u6e96\u6578\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u76e1\u5982\u4eba\u610f\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u507d\u96a8\u6a5f\u6578\u201d\u3002\u5982\u679c\u6211\u5011\u91dd\u5c0d\u507d\u96a8\u6a5f\u6578\u5e8f\u5217\u69cb\u5efa\u4e00\u500b\u7279\u5b9a\u7684\u6e2c\u8a66\u6a23\u4f8b\uff0c\u90a3\u9ebc\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

    \u70ba\u4e86\u9032\u4e00\u6b65\u6539\u9032\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u9663\u5217\u4e2d\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\uff08\u901a\u5e38\u70ba\u9663\u5217\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u9ede\u5143\u7d20\uff09\uff0c\u4e26\u5c07\u9019\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u57fa\u6e96\u6578\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6a5f\u7387\u5c07\u5927\u5e45\u63d0\u5347\u3002\u7576\u7136\uff0c\u6211\u5011\u9084\u53ef\u4ee5\u9078\u53d6\u66f4\u591a\u5019\u9078\u5143\u7d20\uff0c\u4ee5\u9032\u4e00\u6b65\u63d0\u9ad8\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002\u63a1\u7528\u9019\u7a2e\u65b9\u6cd5\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6a5f\u7387\u5927\u5927\u964d\u4f4e\u3002

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\"\"\"\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\u9593\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u9593\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
    quick_sort.js
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u9593\n  return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.kt
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i                         // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    [class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
    quick_sort.zig
    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n// \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u905e\u8ff4\u6700\u4f73\u5316","text":"

    \u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u4f54\u7528\u7a7a\u9593\u8f03\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f38\u5165\u9663\u5217\u70ba\u4f8b\uff0c\u8a2d\u905e\u8ff4\u4e2d\u7684\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(m\\) \uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u7522\u751f\u9577\u5ea6\u70ba \\(0\\) \u7684\u5de6\u5b50\u9663\u5217\u548c\u9577\u5ea6\u70ba \\(m - 1\\) \u7684\u53f3\u5b50\u9663\u5217\uff0c\u9019\u610f\u5473\u8457\u6bcf\u4e00\u5c64\u905e\u8ff4\u547c\u53eb\u6e1b\u5c11\u7684\u554f\u984c\u898f\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u6e1b\u5c11\u4e00\u500b\u5143\u7d20\uff09\uff0c\u905e\u8ff4\u6a39\u7684\u9ad8\u5ea6\u6703\u9054\u5230 \\(n - 1\\) \uff0c\u6b64\u6642\u9700\u8981\u4f54\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002

    \u70ba\u4e86\u9632\u6b62\u5806\u758a\u5e40\u7a7a\u9593\u7684\u7d2f\u7a4d\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u6bcf\u8f2a\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u5f8c\uff0c\u6bd4\u8f03\u5169\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\uff0c\u50c5\u5c0d\u8f03\u77ed\u7684\u5b50\u9663\u5217\u9032\u884c\u905e\u8ff4\u3002\u7531\u65bc\u8f03\u77ed\u5b50\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u6703\u8d85\u904e \\(n / 2\\) \uff0c\u56e0\u6b64\u9019\u7a2e\u65b9\u6cd5\u80fd\u78ba\u4fdd\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff0c\u5f9e\u800c\u5c07\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\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\u905e\u8ff4\u6700\u4f73\u5316\uff09\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right:\n        # \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    for left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n      left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n      right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    }\n  }\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            l = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            r = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.rb
    [class]{QuickSortTailCall}-[func]{quick_sort}\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                   // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6578\u6392\u5e8f","text":"

    \u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u8a08\u6578\u6392\u5e8f\uff0c\u5b83\u9069\u7528\u65bc\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5927\u4f46\u8cc7\u6599\u7bc4\u570d \\(m\\) \u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u5c0d \\(n = 10^6\\) \u500b\u5b78\u865f\u9032\u884c\u6392\u5e8f\uff0c\u800c\u5b78\u865f\u662f\u4e00\u500b \\(8\\) \u4f4d\u6578\u5b57\uff0c\u9019\u610f\u5473\u8457\u8cc7\u6599\u7bc4\u570d \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u800c\u57fa\u6578\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u3002

    \u57fa\u6578\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u8207\u8a08\u6578\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u900f\u904e\u7d71\u8a08\u500b\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u57fa\u6578\u6392\u5e8f\u5229\u7528\u6578\u5b57\u5404\u4f4d\u4e4b\u9593\u7684\u905e\u9032\u95dc\u4fc2\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u4e00\u4f4d\u9032\u884c\u6392\u5e8f\uff0c\u5f9e\u800c\u5f97\u5230\u6700\u7d42\u7684\u6392\u5e8f\u7d50\u679c\u3002

    "},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b78\u865f\u8cc7\u6599\u70ba\u4f8b\uff0c\u5047\u8a2d\u6578\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6578\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-18 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4f4d\u6578 \\(k = 1\\) \u3002
    2. \u5c0d\u5b78\u865f\u7684\u7b2c \\(k\\) \u4f4d\u57f7\u884c\u201c\u8a08\u6578\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u5f8c\uff0c\u8cc7\u6599\u6703\u6839\u64da\u7b2c \\(k\\) \u4f4d\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u3002
    3. \u5c07 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u5f8c\u8fd4\u56de\u6b65\u9a5f 2. \u7e7c\u7e8c\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u5f8c\u7d50\u675f\u3002

    \u5716 11-18 \u00a0 \u57fa\u6578\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

    \u4e0b\u9762\u5256\u6790\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u65bc\u4e00\u500b \\(d\\) \u9032\u4f4d\u5236\u7684\u6578\u5b57 \\(x\\) \uff0c\u8981\u7372\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8a08\u7b97\u516c\u5f0f\uff1a

    \\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5c0d\u6d6e\u9ede\u6578 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5c0d \\(d\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\u3002\u5c0d\u65bc\u5b78\u865f\u8cc7\u6599\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

    \u6b64\u5916\uff0c\u6211\u5011\u9700\u8981\u5c0f\u5e45\u6539\u52d5\u8a08\u6578\u6392\u5e8f\u7a0b\u5f0f\u78bc\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u64da\u6578\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u9032\u884c\u6392\u5e8f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
    def digit(num: int, exp: int) -> int:\n    \"\"\"\u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter = [0] * 10\n    n = len(nums)\n    # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1  # \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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  # \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6578\u6392\u5e8f\"\"\"\n    # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    m = max(nums)\n    # \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    exp = 1\n    while exp <= m:\n        # \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++             // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var counter = Array(repeating: 0, count: 10)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1 // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n    counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n  }\n  // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n  }\n  // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  // dart \u4e2d int \u7684\u9577\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
    radix_sort.c
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < size; i++) {\n        // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        int d = digit(nums[i], exp);\n        // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\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\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    while (exp <= m) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    [class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
    radix_sort.zig
    // \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\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    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6578\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u70ba\u4ec0\u9ebc\u5f9e\u6700\u4f4e\u4f4d\u958b\u59cb\u6392\u5e8f\uff1f

    \u5728\u9023\u7e8c\u7684\u6392\u5e8f\u8f2a\u6b21\u4e2d\uff0c\u5f8c\u4e00\u8f2a\u6392\u5e8f\u6703\u8986\u84cb\u524d\u4e00\u8f2a\u6392\u5e8f\u7684\u7d50\u679c\u3002\u8209\u4f8b\u4f86\u8aaa\uff0c\u5982\u679c\u7b2c\u4e00\u8f2a\u6392\u5e8f\u7d50\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f2a\u6392\u5e8f\u7d50\u679c \\(a > b\\) \uff0c\u90a3\u9ebc\u7b2c\u4e8c\u8f2a\u7684\u7d50\u679c\u5c07\u53d6\u4ee3\u7b2c\u4e00\u8f2a\u7684\u7d50\u679c\u3002\u7531\u65bc\u6578\u5b57\u7684\u9ad8\u4f4d\u512a\u5148\u9806\u5e8f\u9ad8\u65bc\u4f4e\u4f4d\uff0c\u56e0\u6b64\u61c9\u8a72\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

    "},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f03\u65bc\u8a08\u6578\u6392\u5e8f\uff0c\u57fa\u6578\u6392\u5e8f\u9069\u7528\u65bc\u6578\u503c\u7bc4\u570d\u8f03\u5927\u7684\u60c5\u6cc1\uff0c\u4f46\u524d\u63d0\u662f\u8cc7\u6599\u5fc5\u9808\u53ef\u4ee5\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6578\u4e0d\u80fd\u904e\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u9ede\u6578\u4e0d\u9069\u5408\u4f7f\u7528\u57fa\u6578\u6392\u5e8f\uff0c\u56e0\u70ba\u5176\u4f4d\u6578 \\(k\\) \u904e\u5927\uff0c\u53ef\u80fd\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\)\uff1a\u8a2d\u8cc7\u6599\u91cf\u70ba \\(n\\)\u3001\u8cc7\u6599\u70ba \\(d\\) \u9032\u4f4d\u5236\u3001\u6700\u5927\u4f4d\u6578\u70ba \\(k\\) \uff0c\u5247\u5c0d\u67d0\u4e00\u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u6642\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5c0d\u8f03\u5c0f\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u8207\u8a08\u6578\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6578\u6392\u5e8f\u9700\u8981\u85c9\u52a9\u9577\u5ea6\u70ba \\(n\\) \u548c \\(d\\) \u7684\u9663\u5217 res \u548c counter \u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7576\u8a08\u6578\u6392\u5e8f\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u4e5f\u7a69\u5b9a\uff1b\u7576\u8a08\u6578\u6392\u5e8f\u4e0d\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u7121\u6cd5\u4fdd\u8b49\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9078\u64c7\u6392\u5e8f","text":"

    \u9078\u64c7\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7c21\u55ae\uff1a\u958b\u555f\u4e00\u500b\u8ff4\u5708\uff0c\u6bcf\u8f2a\u5f9e\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c07\u5176\u653e\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u672b\u5c3e\u3002

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u9078\u64c7\u6392\u5e8f\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 11-2 \u6240\u793a\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u5340\u9593\u70ba \\([0, n-1]\\) \u3002
    2. \u9078\u53d6\u5340\u9593 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(0\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 1 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9078\u53d6\u5340\u9593 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(1\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u985e\u63a8\u3002\u7d93\u904e \\(n - 1\\) \u8f2a\u9078\u64c7\u8207\u4ea4\u63db\u5f8c\uff0c\u9663\u5217\u524d \\(n - 1\\) \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5716 11-2 \u00a0 \u9078\u64c7\u6392\u5e8f\u6b65\u9a5f

    \u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u7528 \\(k\\) \u4f86\u8a18\u9304\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
    def selection_sort(nums: list[int]):\n    \"\"\"\u9078\u64c7\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in range(n - 1):\n        # \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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  # \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.cpp
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        swap(nums[i], nums[k]);\n    }\n}\n
    selection_sort.java
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.cs
    /* \u9078\u64c7\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
    selection_sort.go
    /* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
    selection_sort.swift
    /* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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 // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swapAt(i, k)\n    }\n}\n
    selection_sort.js
    /* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.ts
    /* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.dart
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
    selection_sort.rs
    /* \u9078\u64c7\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in 0..n - 1 {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swap(i, k);\n    }\n}\n
    selection_sort.c
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.kt
    /* \u9078\u64c7\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
    selection_sort.rb
    [class]{}-[func]{selection_sort}\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5916\u8ff4\u5708\u5171 \\(n - 1\\) \u8f2a\uff0c\u7b2c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6700\u5f8c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(2\\) \uff0c\u5373\u5404\u8f2a\u5916\u8ff4\u5708\u5206\u5225\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f2a\u5167\u8ff4\u5708\uff0c\u6c42\u548c\u70ba \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5982\u5716 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u63db\u81f3\u8207\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u908a\uff0c\u5c0e\u81f4\u5169\u8005\u7684\u76f8\u5c0d\u9806\u5e8f\u767c\u751f\u6539\u8b8a\u3002

    \u5716 11-3 \u00a0 \u9078\u64c7\u6392\u5e8f\u975e\u7a69\u5b9a\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

    \u6392\u5e8f\u6f14\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u65bc\u5c0d\u4e00\u7d44\u8cc7\u6599\u6309\u7167\u7279\u5b9a\u9806\u5e8f\u9032\u884c\u6392\u5217\u3002\u6392\u5e8f\u6f14\u7b97\u6cd5\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\uff0c\u56e0\u70ba\u6709\u5e8f\u8cc7\u6599\u901a\u5e38\u80fd\u5920\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u8a62\u3001\u5206\u6790\u548c\u8655\u7406\u3002

    \u5982\u5716 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u8cc7\u6599\u578b\u5225\u53ef\u4ee5\u662f\u6574\u6578\u3001\u6d6e\u9ede\u6578\u3001\u5b57\u5143\u6216\u5b57\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65b7\u898f\u5247\u53ef\u6839\u64da\u9700\u6c42\u8a2d\u5b9a\uff0c\u5982\u6578\u5b57\u5927\u5c0f\u3001\u5b57\u5143 ASCII \u78bc\u9806\u5e8f\u6216\u81ea\u5b9a\u7fa9\u898f\u5247\u3002

    \u5716 11-1 \u00a0 \u8cc7\u6599\u578b\u5225\u548c\u5224\u65b7\u898f\u5247\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8a55\u50f9\u7dad\u5ea6","text":"

    \u57f7\u884c\u6548\u7387\uff1a\u6211\u5011\u671f\u671b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5118\u91cf\u4f4e\uff0c\u4e14\u7e3d\u9ad4\u64cd\u4f5c\u6578\u91cf\u8f03\u5c11\uff08\u6642\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\uff09\u3002\u5c0d\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u57f7\u884c\u6548\u7387\u986f\u5f97\u5c24\u70ba\u91cd\u8981\u3002

    \u5c31\u5730\u6027\uff1a\u9867\u540d\u601d\u7fa9\uff0c\u539f\u5730\u6392\u5e8f\u900f\u904e\u5728\u539f\u9663\u5217\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\uff0c\u7121\u9808\u85c9\u52a9\u984d\u5916\u7684\u8f14\u52a9\u9663\u5217\uff0c\u5f9e\u800c\u7bc0\u7701\u8a18\u61b6\u9ad4\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u8cc7\u6599\u642c\u904b\u64cd\u4f5c\u8f03\u5c11\uff0c\u57f7\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

    \u7a69\u5b9a\u6027\uff1a\u7a69\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u5f8c\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u76f8\u5c0d\u9806\u5e8f\u4e0d\u767c\u751f\u6539\u8b8a\u3002

    \u7a69\u5b9a\u6392\u5e8f\u662f\u591a\u7d1a\u6392\u5e8f\u5834\u666f\u7684\u5fc5\u8981\u689d\u4ef6\u3002\u5047\u8a2d\u6211\u5011\u6709\u4e00\u500b\u5132\u5b58\u5b78\u751f\u8cc7\u8a0a\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u5225\u662f\u59d3\u540d\u548c\u5e74\u9f61\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u975e\u7a69\u5b9a\u6392\u5e8f\u53ef\u80fd\u5c0e\u81f4\u8f38\u5165\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u55aa\u5931\uff1a

    # \u8f38\u5165\u8cc7\u6599\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\u8a2d\u4f7f\u7528\u975e\u7a69\u5b9a\u6392\u5e8f\u6f14\u7b97\u6cd5\u6309\u5e74\u9f61\u6392\u5e8f\u4e32\u5217\uff0c\n# \u7d50\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5c0d\u4f4d\u7f6e\u6539\u8b8a\uff0c\n# \u8f38\u5165\u8cc7\u6599\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8cea\u4e1f\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

    \u81ea\u9069\u61c9\u6027\uff1a\u81ea\u9069\u61c9\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u53d7\u8f38\u5165\u8cc7\u6599\u7684\u5f71\u97ff\uff0c\u5373\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u3001\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4e26\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

    \u81ea\u9069\u61c9\u6027\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u4f86\u8a55\u4f30\u3002\u5982\u679c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u5dee\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u8aaa\u660e\u6392\u5e8f\u6f14\u7b97\u6cd5\u5728\u67d0\u4e9b\u8cc7\u6599\u4e0b\u6548\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u8996\u70ba\u8ca0\u9762\u5c6c\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u5247\u88ab\u8996\u70ba\u6b63\u9762\u5c6c\u6027\u3002

    \u662f\u5426\u57fa\u65bc\u6bd4\u8f03\uff1a\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u4f9d\u8cf4\u6bd4\u8f03\u904b\u7b97\u5b50\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u4f86\u5224\u65b7\u5143\u7d20\u7684\u76f8\u5c0d\u9806\u5e8f\uff0c\u5f9e\u800c\u6392\u5e8f\u6574\u500b\u9663\u5217\uff0c\u7406\u8ad6\u6700\u512a\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f03\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f03\u904b\u7b97\u5b50\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5c0d\u8f03\u5dee\u3002

    "},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

    \u57f7\u884c\u5feb\u3001\u539f\u5730\u3001\u7a69\u5b9a\u3001\u6b63\u5411\u81ea\u9069\u61c9\u3001\u901a\u7528\u6027\u597d\u3002\u986f\u7136\uff0c\u8fc4\u4eca\u70ba\u6b62\u5c1a\u672a\u767c\u73fe\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9078\u64c7\u6392\u5e8f\u6f14\u7b97\u6cd5\u6642\uff0c\u9700\u8981\u6839\u64da\u5177\u9ad4\u7684\u8cc7\u6599\u7279\u9ede\u548c\u554f\u984c\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u5171\u540c\u5b78\u7fd2\u5404\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4e26\u57fa\u65bc\u4e0a\u8ff0\u8a55\u50f9\u7dad\u5ea6\u5c0d\u5404\u500b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u512a\u7f3a\u9ede\u9032\u884c\u5206\u6790\u3002

    "},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u6ce1\u6cab\u6392\u5e8f\u900f\u904e\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u900f\u904e\u65b0\u589e\u4e00\u500b\u6a19\u8a8c\u4f4d\u4f86\u5be6\u73fe\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(n)\\) \u3002
    • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f2a\u5c07\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u6b63\u78ba\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u96d6\u7136\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u4f46\u7531\u65bc\u55ae\u5143\u64cd\u4f5c\u76f8\u5c0d\u8f03\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u8cc7\u6599\u91cf\u7684\u6392\u5e8f\u4efb\u52d9\u4e2d\u975e\u5e38\u53d7\u6b61\u8fce\u3002
    • \u5feb\u901f\u6392\u5e8f\u57fa\u65bc\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5283\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9078\u53d6\u5230\u6700\u5dee\u7684\u57fa\u6e96\u6578\uff0c\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6578\u57fa\u6e96\u6578\u6216\u96a8\u6a5f\u57fa\u6e96\u6578\u53ef\u4ee5\u964d\u4f4e\u9019\u7a2e\u52a3\u5316\u7684\u6a5f\u7387\u3002\u5c3e\u905e\u8ff4\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u6e1b\u5c11\u905e\u8ff4\u6df1\u5ea6\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(\\log n)\\) \u3002
    • \u5408\u4f75\u6392\u5e8f\u5305\u62ec\u5283\u5206\u548c\u5408\u4e26\u5169\u500b\u968e\u6bb5\uff0c\u5178\u578b\u5730\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5408\u4f75\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u9663\u5217\u9700\u8981\u5efa\u7acb\u8f14\u52a9\u9663\u5217\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u93c8\u7d50\u4e32\u5217\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002
    • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u500b\u6b65\u9a5f\uff1a\u8cc7\u6599\u5206\u6876\u3001\u6876\u5167\u6392\u5e8f\u548c\u5408\u4e26\u7d50\u679c\u3002\u5b83\u540c\u6a23\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9069\u7528\u65bc\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u3002\u6876\u6392\u5e8f\u7684\u95dc\u9375\u5728\u65bc\u5c0d\u8cc7\u6599\u9032\u884c\u5e73\u5747\u5206\u914d\u3002
    • \u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5b83\u900f\u904e\u7d71\u8a08\u8cc7\u6599\u51fa\u73fe\u7684\u6b21\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u6709\u9650\u7684\u60c5\u6cc1\uff0c\u4e26\u4e14\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8f49\u63db\u70ba\u6b63\u6574\u6578\u3002
    • \u57fa\u6578\u6392\u5e8f\u900f\u904e\u9010\u4f4d\u6392\u5e8f\u4f86\u5be6\u73fe\u8cc7\u6599\u6392\u5e8f\uff0c\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u6578\u5b57\u3002
    • \u7e3d\u7684\u4f86\u8aaa\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a69\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9069\u61c9\u6027\u7b49\u512a\u9ede\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u6c92\u6709\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u80fd\u5920\u540c\u6642\u6eff\u8db3\u6240\u6709\u9019\u4e9b\u689d\u4ef6\u3002\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u9700\u8981\u6839\u64da\u8cc7\u6599\u7684\u7279\u6027\u4f86\u9078\u64c7\u5408\u9069\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002
    • \u5716 11-19 \u5c0d\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a69\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9069\u61c9\u6027\u7b49\u3002

    \u5716 11-19 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5\u5c0d\u6bd4

    "},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6392\u5e8f\u6f14\u7b97\u6cd5\u7a69\u5b9a\u6027\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

    \u5728\u73fe\u5be6\u4e2d\uff0c\u6211\u5011\u6709\u53ef\u80fd\u57fa\u65bc\u7269\u4ef6\u7684\u67d0\u500b\u5c6c\u6027\u9032\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b78\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u5169\u500b\u5c6c\u6027\uff0c\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u4e00\u500b\u591a\u7d1a\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5c0d\u8eab\u9ad8\u9032\u884c\u6392\u5e8f\u3002\u7531\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e0d\u7a69\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

    \u53ef\u4ee5\u767c\u73fe\uff0c\u5b78\u751f D \u548c C \u7684\u4f4d\u7f6e\u767c\u751f\u4e86\u4ea4\u63db\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u58de\u4e86\uff0c\u800c\u9019\u662f\u6211\u5011\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

    Q\uff1a\u54e8\u5175\u5283\u5206\u4e2d\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u8207\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u7684\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\u55ce\uff1f

    \u4e0d\u884c\uff0c\u7576\u6211\u5011\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u70ba\u57fa\u6e96\u6578\u6642\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u518d\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002\u9019\u500b\u7d50\u8ad6\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u6211\u5011\u4f86\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

    \u54e8\u5175\u5283\u5206 partition() \u7684\u6700\u5f8c\u4e00\u6b65\u662f\u4ea4\u63db nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u57fa\u6e96\u6578\u5de6\u908a\u7684\u5143\u7d20\u90fd <= \u57fa\u6e96\u6578\uff0c\u9019\u5c31\u8981\u6c42\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u524d nums[left] >= nums[i] \u5fc5\u9808\u6210\u7acb\u3002\u5047\u8a2d\u6211\u5011\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\uff0c\u90a3\u9ebc\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5247\u6703\u5728 i == j \u6642\u8df3\u51fa\u8ff4\u5708\uff0c\u6b64\u6642\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6b64\u6642\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u64cd\u4f5c\u6703\u628a\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\uff0c\u5c0e\u81f4\u54e8\u5175\u5283\u5206\u5931\u6557\u3002

    \u8209\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u9663\u5217 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u5f9e\u5de6\u5411\u53f3\u67e5\u8a62\u201d\uff0c\u54e8\u5175\u5283\u5206\u5f8c\u9663\u5217\u70ba [1, 0, 0, 0, 0] \uff0c\u9019\u500b\u7d50\u679c\u662f\u4e0d\u6b63\u78ba\u7684\u3002

    \u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u5011\u9078\u64c7 nums[right] \u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u6b63\u597d\u53cd\u904e\u4f86\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002

    Q\uff1a\u95dc\u65bc\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u70ba\u4ec0\u9ebc\u9078\u77ed\u7684\u9663\u5217\u80fd\u4fdd\u8b49\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff1f

    \u905e\u8ff4\u6df1\u5ea6\u5c31\u662f\u7576\u524d\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u65b9\u6cd5\u7684\u6578\u91cf\u3002\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u6211\u5011\u5c07\u539f\u9663\u5217\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002\u5728\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u5f8c\uff0c\u5411\u4e0b\u905e\u8ff4\u7684\u5b50\u9663\u5217\u9577\u5ea6\u6700\u5927\u70ba\u539f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8a2d\u6700\u5dee\u60c5\u6cc1\uff0c\u4e00\u76f4\u70ba\u4e00\u534a\u9577\u5ea6\uff0c\u90a3\u9ebc\u6700\u7d42\u7684\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

    \u56de\u9867\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u5011\u6709\u53ef\u80fd\u6703\u9023\u7e8c\u5730\u905e\u8ff4\u9577\u5ea6\u8f03\u5927\u7684\u9663\u5217\uff0c\u6700\u5dee\u60c5\u6cc1\u4e0b\u70ba \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u51fa\u73fe\u3002

    Q\uff1a\u7576\u9663\u5217\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u6642\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n^2)\\) \u55ce\uff1f\u8a72\u5982\u4f55\u8655\u7406\u9019\u7a2e\u9000\u5316\u60c5\u6cc1\uff1f

    \u662f\u7684\u3002\u5c0d\u65bc\u9019\u7a2e\u60c5\u6cc1\uff0c\u53ef\u4ee5\u8003\u616e\u900f\u904e\u54e8\u5175\u5283\u5206\u5c07\u9663\u5217\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\uff1a\u5c0f\u65bc\u3001\u7b49\u65bc\u3001\u5927\u65bc\u57fa\u6e96\u6578\u3002\u50c5\u5411\u4e0b\u905e\u8ff4\u5c0f\u65bc\u548c\u5927\u65bc\u7684\u5169\u90e8\u5206\u3002\u5728\u8a72\u65b9\u6cd5\u4e0b\uff0c\u8f38\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u9663\u5217\uff0c\u50c5\u4e00\u8f2a\u54e8\u5175\u5283\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

    Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u4ec0\u9ebc\u662f \\(O(n^2)\\) \uff1f

    \u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u500b\u6876\u4e2d\u3002\u5982\u679c\u6211\u5011\u63a1\u7528\u4e00\u500b \\(O(n^2)\\) \u6f14\u7b97\u6cd5\u4f86\u6392\u5e8f\u9019\u4e9b\u5143\u7d20\uff0c\u5247\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u5806\u758a\u8207\u4f47\u5217","text":"

    Abstract

    \u5806\u758a\u5982\u540c\u758a\u8c93\u8c93\uff0c\u800c\u4f47\u5217\u5c31\u50cf\u8c93\u8c93\u6392\u968a\u3002

    \u5169\u8005\u5206\u5225\u4ee3\u8868\u5148\u5165\u5f8c\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u908f\u8f2f\u95dc\u4fc2\u3002

    "},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 5.1 \u00a0 \u5806\u758a
    • 5.2 \u00a0 \u4f47\u5217
    • 5.3 \u00a0 \u96d9\u5411\u4f47\u5217
    • 5.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u96d9\u5411\u4f47\u5217","text":"

    \u5728\u4f47\u5217\u4e2d\uff0c\u6211\u5011\u50c5\u80fd\u522a\u9664\u982d\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u3002\u5982\u5716 5-7 \u6240\u793a\uff0c\u96d9\u5411\u4f47\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u9748\u6d3b\u6027\uff0c\u5141\u8a31\u5728\u982d\u90e8\u548c\u5c3e\u90e8\u57f7\u884c\u5143\u7d20\u7684\u65b0\u589e\u6216\u522a\u9664\u64cd\u4f5c\u3002

    \u5716 5-7 \u00a0 \u96d9\u5411\u4f47\u5217\u7684\u64cd\u4f5c

    "},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u96d9\u5411\u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u96d9\u5411\u4f47\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u7a31\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

    \u8868 5-3 \u00a0 \u96d9\u5411\u4f47\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push_first() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u9996 \\(O(1)\\) push_last() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop_first() \u522a\u9664\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u522a\u9664\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\)

    \u540c\u6a23\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u5df2\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeque.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deque[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deque.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deque.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deque) == 0\n
    deque.cpp
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint front = deque.front(); // \u4f47\u5217\u9996\u5143\u7d20\nint back = deque.back();   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.pop_front();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.pop_back();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = deque.empty();\n
    deque.java
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.pollFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.pollLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c07\u93c8\u7d50\u4e32\u5217 LinkedList \u770b\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.AddLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.AddFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.RemoveFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.RemoveLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.PushBack(2)      // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.PushFront(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfront := deque.Front() // \u4f47\u5217\u9996\u5143\u7d20\nrear := deque.Back()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.Remove(front)    // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.Remove(rear)     // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.append(2) // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.insert(1, at: 0)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nlet peekFirst = deque.first! // \u4f47\u5217\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u4f7f\u7528 Array \u6a21\u64ec\u6642 popFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet popFirst = deque.removeFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nlet popLast = deque.removeLast() // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty = size === 0;\n
    deque.ts
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u7fa9\u70ba\u96d9\u5411\u4f47\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.addLast(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.addFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.first; // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.removeFirst(); // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.removeLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u4f47\u5217\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop_front) = deque.pop_front() { // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96d9\u5411\u4f47\u5217\n
    deque.kt
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2)  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u4f47\u5217\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nval popFirst = deque.pollFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nval popLast = deque.pollLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = deque.isEmpty()\n
    deque.rb
    # \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\n# Ruby \u6c92\u6709\u5167\u76f4\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u968a\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#unshift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8a2a\u554f\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u5217\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0c Array#shift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize = deque.length\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = size.zero?\n
    deque.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u96d9\u5411\u4f47\u5217\u5be6\u73fe *","text":"

    \u96d9\u5411\u4f47\u5217\u7684\u5be6\u73fe\u8207\u4f47\u5217\u985e\u4f3c\uff0c\u53ef\u4ee5\u9078\u64c7\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u4f5c\u70ba\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

    "},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u56de\u9867\u4e0a\u4e00\u7bc0\u5167\u5bb9\uff0c\u6211\u5011\u4f7f\u7528\u666e\u901a\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u4f47\u5217\uff0c\u56e0\u70ba\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u522a\u9664\u982d\u7bc0\u9ede\uff08\u5c0d\u61c9\u51fa\u5217\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e\u65b0\u7bc0\u9ede\uff08\u5c0d\u61c9\u5165\u5217\u64cd\u4f5c\uff09\u3002

    \u5c0d\u65bc\u96d9\u5411\u4f47\u5217\u800c\u8a00\uff0c\u982d\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u57f7\u884c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96d9\u5411\u4f47\u5217\u9700\u8981\u5be6\u73fe\u53e6\u4e00\u500b\u5c0d\u7a31\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u201c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u201d\u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

    \u5982\u5716 5-8 \u6240\u793a\uff0c\u6211\u5011\u5c07\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u548c\u5c3e\u7bc0\u9ede\u8996\u70ba\u96d9\u5411\u4f47\u5217\u7684\u4f47\u5217\u9996\u548c\u4f47\u5217\u5c3e\uff0c\u540c\u6642\u5be6\u73fe\u5728\u5169\u7aef\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u7684\u529f\u80fd\u3002

    LinkedListDequepush_last()push_first()pop_last()pop_first()

    \u5716 5-8 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
    class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0  # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u5217\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        elif is_front:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size += 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u5217\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            # \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            # \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        self._size -= 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nstruct DoublyListNode {\n    int val;              // \u7bc0\u9ede\u503c\n    DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize = 0;              // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    int val; // \u7bc0\u9ede\u503c\n    ListNode next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    ListNode prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(int val) {\n    public int val = val;       // \u7bc0\u9ede\u503c\n    public ListNode? next = null; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u982d\u7bc0\u9ede front, \u5c3e\u7bc0\u9ede rear\n    int queSize = 0;      // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede                           \n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u96d9\u7aef\u4f47\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 */\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/* \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217 */\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/* \u8a2a\u554f\u4f47\u5217\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/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
    linkedlist_deque.swift
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede rear\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if isFront {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size += 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        let val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear!.val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size -= 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val; // \u7bc0\u9ede\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    #front; // \u982d\u7bc0\u9ede front\n    #rear; // \u5c3e\u7bc0\u9ede rear\n    #queSize; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next: ListNode; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val: number; // \u7bc0\u9ede\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u982d\u7bc0\u9ede front\n    private rear: ListNode; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  ListNode? prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u5c0d\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u982d\u7bc0\u9ede _front\n  late ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u9577\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u5217\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u5217\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n      val = _front!.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      // \u522a\u9664\u982d\u7bc0\u9ede\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n      val = _rear!.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      // \u522a\u9664\u5c3e\u7bc0\u9ede\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\npub struct ListNode<T> {\n    pub val: T,                                 // \u7bc0\u9ede\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u96d9\u5411\u4f47\u5217\u7684\u9577\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    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\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\u982d\u7bc0\u9ede\n                }\n            }\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\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\u7bc0\u9ede\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u4f47\u5217\u9996\u51fa\u5217\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\u982d\u7bc0\u9ede\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\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\u7bc0\u9ede\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct DoublyListNode {\n    int val;                     // \u7bc0\u9ede\u503c\n    struct DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n    struct DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\n} DoublyListNode;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;                  // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n} LinkedListDeque;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\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    // \u91cb\u653e deque \u7d50\u69cb\u9ad4\n    free(deque);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u66ab\u5b58\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u66ab\u5b58\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n    }\n    deque->queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(var _val: Int) {\n    // \u7bc0\u9ede\u503c\n    var next: ListNode? = null // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? = null // \u5c3e\u7bc0\u9ede rear\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++ // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize-- // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return _val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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### \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :prev # \u524d\u8ec0\u7bc0\u9ede\u5f15\u7528\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass LinkedListDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0     # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c \u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    elsif is_front\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size += 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u5217\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      # \u522a\u9664\u982d\u7bc0\u9ede\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else\n      val = @rear.val # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      # \u522a\u9664\u5c3e\u7bc0\u9ede\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size -= 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    val\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    // \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u7bc0\u9ede\u503c\n        next: ?*Self = null,    // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n        prev: ?*Self = null,    // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u982d\u7bc0\u9ede front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                             // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u5217\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\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n            } else {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        } \n\n        // \u4f47\u5217\u9996\u5165\u5217\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u4f47\u5217\u5c3e\u5165\u5217\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u5217\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            var val: T = undefined;\n            // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n                // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n                // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n            return val;\n        } \n\n        // \u4f47\u5217\u9996\u51fa\u5217\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u4f47\u5217\u5c3e\u51fa\u5217\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u5982\u5716 5-9 \u6240\u793a\uff0c\u8207\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u985e\u4f3c\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u4f7f\u7528\u74b0\u5f62\u9663\u5217\u4f86\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u3002

    ArrayDequepush_last()push_first()pop_last()pop_first()

    \u5716 5-9 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u5728\u4f47\u5217\u7684\u5be6\u73fe\u57fa\u790e\u4e0a\uff0c\u50c5\u9700\u589e\u52a0\u201c\u4f47\u5217\u9996\u5165\u5217\u201d\u548c\u201c\u4f47\u5217\u5c3e\u51fa\u5217\u201d\u7684\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
    class ArrayDeque:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15\"\"\"\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        num = self.peek_first()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\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        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;      // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int Index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\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/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\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/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
    array_deque.js
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i: number): number {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n  int index(int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe _front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: usize,    // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: usize, // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u5efa\u69cb\u5b50 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c07 num \u65b0\u589e\u5230\u4f47\u5217\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
    array_deque.kt
    /* \u5efa\u69cb\u5b50 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass ArrayDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    num = peek_first\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u4f47\u5217\u5c3e\u51fa\u5217 ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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  ### \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 ###\n  def index(i)\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\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 \u96d9\u5411\u4f47\u5217\u61c9\u7528","text":"

    \u96d9\u5411\u4f47\u5217\u517c\u5177\u5806\u758a\u8207\u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5be6\u73fe\u9019\u5169\u8005\u7684\u6240\u6709\u61c9\u7528\u5834\u666f\uff0c\u540c\u6642\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

    \u6211\u5011\u77e5\u9053\uff0c\u8edf\u9ad4\u7684\u201c\u64a4\u92b7\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u5806\u758a\u4f86\u5be6\u73fe\uff1a\u7cfb\u7d71\u5c07\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u5806\u758a\u4e2d\uff0c\u7136\u5f8c\u900f\u904e pop \u5be6\u73fe\u64a4\u92b7\u3002\u7136\u800c\uff0c\u8003\u616e\u5230\u7cfb\u7d71\u8cc7\u6e90\u7684\u9650\u5236\uff0c\u8edf\u9ad4\u901a\u5e38\u6703\u9650\u5236\u64a4\u92b7\u7684\u6b65\u6578\uff08\u4f8b\u5982\u50c5\u5141\u8a31\u5132\u5b58 \\(50\\) \u6b65\uff09\u3002\u7576\u5806\u758a\u7684\u9577\u5ea6\u8d85\u904e \\(50\\) \u6642\uff0c\u8edf\u9ad4\u9700\u8981\u5728\u5806\u758a\u5e95\uff08\u4f47\u5217\u9996\uff09\u57f7\u884c\u522a\u9664\u64cd\u4f5c\u3002\u4f46\u5806\u758a\u7121\u6cd5\u5be6\u73fe\u8a72\u529f\u80fd\uff0c\u6b64\u6642\u5c31\u9700\u8981\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f86\u66ff\u4ee3\u5806\u758a\u3002\u8acb\u6ce8\u610f\uff0c\u201c\u64a4\u92b7\u201d\u7684\u6838\u5fc3\u908f\u8f2f\u4ecd\u7136\u9075\u5faa\u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u539f\u5247\uff0c\u53ea\u662f\u96d9\u5411\u4f47\u5217\u80fd\u5920\u66f4\u52a0\u9748\u6d3b\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u908f\u8f2f\u3002

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u4f47\u5217","text":"

    \u4f47\u5217\uff08queue\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u898f\u5247\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u9867\u540d\u601d\u7fa9\uff0c\u4f47\u5217\u6a21\u64ec\u4e86\u6392\u968a\u73fe\u8c61\uff0c\u5373\u65b0\u4f86\u7684\u4eba\u4e0d\u65b7\u52a0\u5165\u4f47\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u65bc\u4f47\u5217\u982d\u90e8\u7684\u4eba\u9010\u500b\u96e2\u958b\u3002

    \u5982\u5716 5-4 \u6240\u793a\uff0c\u6211\u5011\u5c07\u4f47\u5217\u982d\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u9996\u201d\uff0c\u5c3e\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u5c07\u628a\u5143\u7d20\u52a0\u5165\u5217\u5c3e\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u5165\u5217\u201d\uff0c\u522a\u9664\u4f47\u5217\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u51fa\u5217\u201d\u3002

    \u5716 5-4 \u00a0 \u4f47\u5217\u7684\u5148\u5165\u5148\u51fa\u898f\u5247

    "},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u4f47\u5217\u7684\u5e38\u898b\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u65b9\u6cd5\u540d\u7a31\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002\u6211\u5011\u5728\u6b64\u63a1\u7528\u8207\u5806\u758a\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

    \u8868 5-2 \u00a0 \u4f47\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5217\uff0c\u5373\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop() \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 \\(O(1)\\) peek() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\)

    \u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u73fe\u6210\u7684\u4f47\u5217\u985e\u5225\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u4f47\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u5011\u4e00\u822c\u5c07\u96d9\u5411\u4f47\u5217\u985e\u5225 deque \u7576\u4f5c\u4f47\u5217\u4f7f\u7528\n# \u96d6\u7136 queue.Queue() \u662f\u7d14\u6b63\u7684\u4f47\u5217\u985e\u5225\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u85a6\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u5217\npop: int = que.popleft()\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(que)\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u5217 */\nqueue.pop();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = queue.empty();\n
    queue.java
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.poll();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.Dequeue();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u4f47\u5217\u4f86\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u5217 */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u7531\u65bc\u662f\u9663\u5217\uff0c\u56e0\u6b64 removeFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet pool = queue.removeFirst()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
    queue.ts
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
    queue.dart
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u4f47\u5217\u985e\u5225 Qeque \u662f\u96d9\u5411\u4f47\u5217\uff0c\u4e5f\u53ef\u4f5c\u70ba\u4f47\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.removeFirst();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f5c\u70ba\u666e\u901a\u4f47\u5217\u4f86\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u4f47\u5217\n
    queue.kt
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u5217 */\nval pop = queue.poll()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = queue.isEmpty()\n
    queue.rb
    # \u521d\u59cb\u5316\u4f47\u5217\n# Ruby \u5167\u5efa\u7684\u4f47\u5217\uff08Thread::Queue) \u6c92\u6709 peek \u548c\u8d70\u8a2a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u5217\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8a2a\u554f\u4f47\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u5217\n# \u6e05\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#shift \u65b9\u6cd5\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop = queue.shift\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize = queue.length\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = queue.empty?\n
    queue.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u4f47\u5217\u5be6\u73fe","text":"

    \u70ba\u4e86\u5be6\u73fe\u4f47\u5217\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u65b0\u589e\u5143\u7d20\uff0c\u4e26\u5728\u53e6\u4e00\u7aef\u522a\u9664\u5143\u7d20\uff0c\u93c8\u7d50\u4e32\u5217\u548c\u9663\u5217\u90fd\u7b26\u5408\u8981\u6c42\u3002

    "},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u5982\u5716 5-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u201c\u982d\u7bc0\u9ede\u201d\u548c\u201c\u5c3e\u7bc0\u9ede\u201d\u5206\u5225\u8996\u70ba\u201c\u4f47\u5217\u9996\u201d\u548c\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u898f\u5b9a\u4f47\u5217\u5c3e\u50c5\u53ef\u65b0\u589e\u7bc0\u9ede\uff0c\u4f47\u5217\u9996\u50c5\u53ef\u522a\u9664\u7bc0\u9ede\u3002

    LinkedListQueuepush()pop()

    \u5716 5-5 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
    class LinkedListQueue:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        node = ListNode(num)\n        # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num = self.peek()\n        # \u522a\u9664\u982d\u7bc0\u9ede\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Vector \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u4f47\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5217 */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5217 */\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/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
    linkedlist_queue.swift
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u982d\u7bc0\u9ede\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    #front; // \u982d\u7bc0\u9ede #front\n    #rear; // \u5c3e\u7bc0\u9ede #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u982d\u7bc0\u9ede front\n    private rear: ListNode | null; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u982d\u7bc0\u9ede _front\n  ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    final int _num = peek();\n    // \u522a\u9664\u982d\u7bc0\u9ede\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u4f47\u5217\u70ba\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u4f47\u5217\u7684\u9577\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    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\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\u5217 */\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    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e queue \u7d50\u69cb\u9ad4\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u7bc0\u9ede\u8655\u65b0\u589e node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u5217 */\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/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue(\n    // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        val node = ListNode(num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u982d\u73fe\u7684\u4f47\u5217 ###\nclass LinkedListQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\uff0c\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u4ee4\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u522a\u9664\u982d\u7bc0\u9ede\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u982d\u7bc0\u9ede front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                            // \u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u5728\u9663\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u9019\u6703\u5c0e\u81f4\u51fa\u5217\u64cd\u4f5c\u6548\u7387\u8f03\u4f4e\u3002\u7136\u800c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u4f86\u907f\u514d\u9019\u500b\u554f\u984c\u3002

    \u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 front \u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u4e26\u7dad\u8b77\u4e00\u500b\u8b8a\u6578 size \u7528\u65bc\u8a18\u9304\u4f47\u5217\u9577\u5ea6\u3002\u5b9a\u7fa9 rear = front + size \uff0c\u9019\u500b\u516c\u5f0f\u8a08\u7b97\u51fa\u7684 rear \u6307\u5411\u4f47\u5217\u5c3e\u5143\u7d20\u4e4b\u5f8c\u7684\u4e0b\u4e00\u500b\u4f4d\u7f6e\u3002

    \u57fa\u65bc\u6b64\u8a2d\u8a08\uff0c\u9663\u5217\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u5340\u9593\u70ba [front, rear - 1]\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u6cd5\u5982\u5716 5-6 \u6240\u793a\u3002

    • \u5165\u5217\u64cd\u4f5c\uff1a\u5c07\u8f38\u5165\u5143\u7d20\u8ce6\u503c\u7d66 rear \u7d22\u5f15\u8655\uff0c\u4e26\u5c07 size \u589e\u52a0 1 \u3002
    • \u51fa\u5217\u64cd\u4f5c\uff1a\u53ea\u9700\u5c07 front \u589e\u52a0 1 \uff0c\u4e26\u5c07 size \u6e1b\u5c11 1 \u3002

    \u53ef\u4ee5\u770b\u5230\uff0c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u90fd\u53ea\u9700\u9032\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002

    ArrayQueuepush()pop()

    \u5716 5-6 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u4f60\u53ef\u80fd\u6703\u767c\u73fe\u4e00\u500b\u554f\u984c\uff1a\u5728\u4e0d\u65b7\u9032\u884c\u5165\u5217\u548c\u51fa\u5217\u7684\u904e\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52d5\uff0c\u7576\u5b83\u5011\u5230\u9054\u9663\u5217\u5c3e\u90e8\u6642\u5c31\u7121\u6cd5\u7e7c\u7e8c\u79fb\u52d5\u4e86\u3002\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u8996\u70ba\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u74b0\u5f62\u9663\u5217\u201d\u3002

    \u5c0d\u65bc\u74b0\u5f62\u9663\u5217\uff0c\u6211\u5011\u9700\u8981\u8b93 front \u6216 rear \u5728\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u76f4\u63a5\u56de\u5230\u9663\u5217\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002\u9019\u7a2e\u9031\u671f\u6027\u898f\u5f8b\u53ef\u4ee5\u900f\u904e\u201c\u53d6\u9918\u64cd\u4f5c\u201d\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
    class ArrayQueue:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n        self._front: int = 0  # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        self._size: int = 0  # \u4f47\u5217\u9577\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u4f47\u5217\u5df2\u6eff\")\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num: int = self.peek()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u4f47\u5217\u9577\u5ea6\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c07\u9663\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u5217 */\nfunc (q *arrayQueue) push(num int) {\n    // \u7576 rear == queCapacity \u8868\u793a\u4f47\u5217\u5df2\u6eff\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u5217 */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6 Slice \u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u4f47\u5217\u9577\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
    array_queue.js
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front = 0; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u4f47\u5217\u9577\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    int _num = peek();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: i32,        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: i32,     // \u4f47\u5217\u9577\u5ea6\n    que_capacity: i32, // \u4f47\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u5217 */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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\u9663\u5217 */\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u5efa\u69cb\u5b50 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u5217 */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u5217 */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
    array_queue.kt
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 ###\nclass ArrayQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    @front = 0 # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    @size = 0 # \u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    raise IndexError, '\u4f47\u5217\u5df2\u6eff' if size == capacity\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear = (@front + size) % capacity\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217     \n        cap: usize = 0,                                 // \u4f47\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u4f47\u5217\u5df2\u6eff\\n\", .{});\n                return;\n            }\n            // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n            // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u4ee5\u4e0a\u5be6\u73fe\u7684\u4f47\u5217\u4ecd\u7136\u5177\u6709\u4fb7\u9650\u6027\uff1a\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002\u7136\u800c\uff0c\u9019\u500b\u554f\u984c\u4e0d\u96e3\u89e3\u6c7a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u66ff\u63db\u70ba\u52d5\u614b\u9663\u5217\uff0c\u5f9e\u800c\u5f15\u5165\u64f4\u5bb9\u6a5f\u5236\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u5617\u8a66\u81ea\u884c\u5be6\u73fe\u3002

    \u5169\u7a2e\u5be6\u73fe\u7684\u5c0d\u6bd4\u7d50\u8ad6\u8207\u5806\u758a\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

    "},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u4f47\u5217\u5178\u578b\u61c9\u7528","text":"
    • \u6dd8\u5bf6\u8a02\u55ae\u3002\u8cfc\u7269\u8005\u4e0b\u55ae\u5f8c\uff0c\u8a02\u55ae\u5c07\u52a0\u5165\u5217\u5217\u4e2d\uff0c\u7cfb\u7d71\u96a8\u5f8c\u6703\u6839\u64da\u9806\u5e8f\u8655\u7406\u4f47\u5217\u4e2d\u7684\u8a02\u55ae\u3002\u5728\u96d9\u5341\u4e00\u671f\u9593\uff0c\u77ed\u6642\u9593\u5167\u6703\u7522\u751f\u6d77\u91cf\u8a02\u55ae\uff0c\u9ad8\u4f75\u767c\u6210\u70ba\u5de5\u7a0b\u5e2b\u5011\u9700\u8981\u91cd\u9ede\u653b\u514b\u7684\u554f\u984c\u3002
    • \u5404\u985e\u5f85\u8fa6\u4e8b\u9805\u3002\u4efb\u4f55\u9700\u8981\u5be6\u73fe\u201c\u5148\u4f86\u5f8c\u5230\u201d\u529f\u80fd\u7684\u5834\u666f\uff0c\u4f8b\u5982\u5370\u8868\u6a5f\u7684\u4efb\u52d9\u4f47\u5217\u3001\u9910\u5ef3\u7684\u51fa\u9910\u4f47\u5217\u7b49\uff0c\u4f47\u5217\u5728\u9019\u4e9b\u5834\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7dad\u8b77\u8655\u7406\u9806\u5e8f\u3002
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u5806\u758a","text":"

    \u5806\u758a\uff08stack\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u908f\u8f2f\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002

    \u6211\u5011\u53ef\u4ee5\u5c07\u5806\u758a\u985e\u6bd4\u70ba\u684c\u9762\u4e0a\u7684\u4e00\u758a\u76e4\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76e4\u5b50\uff0c\u5247\u9700\u8981\u5148\u5c07\u4e0a\u9762\u7684\u76e4\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u5011\u5c07\u76e4\u5b50\u66ff\u63db\u70ba\u5404\u7a2e\u578b\u5225\u7684\u5143\u7d20\uff08\u5982\u6574\u6578\u3001\u5b57\u5143\u3001\u7269\u4ef6\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u5806\u758a\u9019\u7a2e\u8cc7\u6599\u7d50\u69cb\u3002

    \u5982\u5716 5-1 \u6240\u793a\uff0c\u6211\u5011\u628a\u5806\u7a4d\u758a\u5143\u7d20\u7684\u9802\u90e8\u7a31\u70ba\u201c\u5806\u758a\u9802\u201d\uff0c\u5e95\u90e8\u7a31\u70ba\u201c\u5806\u758a\u5e95\u201d\u3002\u5c07\u628a\u5143\u7d20\u65b0\u589e\u5230\u5806\u758a\u9802\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u5806\u758a\u201d\uff0c\u522a\u9664\u5806\u758a\u9802\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u5806\u758a\u201d\u3002

    \u5716 5-1 \u00a0 \u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u898f\u5247

    "},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u5011\u4ee5\u5e38\u898b\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u70ba\u4f8b\u3002

    \u8868 5-1 \u00a0 \u5806\u758a\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5 \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u758a\uff08\u65b0\u589e\u81f3\u5806\u758a\u9802\uff09 \\(O(1)\\) pop() \u5806\u758a\u9802\u5143\u7d20\u51fa\u5806\u758a \\(O(1)\\) peek() \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 \\(O(1)\\)

    \u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8a9e\u8a00\u53ef\u80fd\u6c92\u6709\u5c08\u9580\u63d0\u4f9b\u5806\u758a\u985e\u5225\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u5c07\u8a72\u8a9e\u8a00\u7684\u201c\u9663\u5217\u201d\u6216\u201c\u93c8\u7d50\u4e32\u5217\u201d\u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\uff0c\u4e26\u5728\u7a0b\u5f0f\u908f\u8f2f\u4e0a\u5ffd\u7565\u8207\u5806\u758a\u7121\u95dc\u7684\u64cd\u4f5c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
    # \u521d\u59cb\u5316\u5806\u758a\n# Python \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a list \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop: int = stack.pop()\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* \u521d\u59cb\u5316\u5806\u758a */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nstack.pop(); // \u7121\u8fd4\u56de\u503c\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool empty = stack.empty();\n
    stack.java
    /* \u521d\u59cb\u5316\u5806\u758a */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* \u521d\u59cb\u5316\u5806\u758a */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.Pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* \u521d\u59cb\u5316\u5806\u758a */\n// \u5728 Go \u4e2d\uff0c\u63a8\u85a6\u5c07 Slice \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* \u521d\u59cb\u5316\u5806\u758a */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.removeLast()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* \u521d\u59cb\u5316\u5806\u758a */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* \u521d\u59cb\u5316\u5806\u758a */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* \u521d\u59cb\u5316\u5806\u758a */\n// Dart \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a List \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.removeLast();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* \u521d\u59cb\u5316\u5806\u758a */\n// \u628a Vec \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.pop().unwrap();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u5806\u758a\n
    stack.kt
    /* \u521d\u59cb\u5316\u5806\u758a */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nval pop = stack.pop()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nval isEmpty = stack.isEmpty()\n
    stack.rb
    # \u521d\u59cb\u5316\u5806\u758a\n# Ruby \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop = stack.pop\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize = stack.length\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty = stack.empty?\n
    stack.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u5806\u758a\u7684\u5be6\u73fe","text":"

    \u70ba\u4e86\u6df1\u5165\u77ad\u89e3\u5806\u758a\u7684\u57f7\u884c\u6a5f\u5236\uff0c\u6211\u5011\u4f86\u5617\u8a66\u81ea\u5df1\u5be6\u73fe\u4e00\u500b\u5806\u758a\u985e\u5225\u3002

    \u5806\u758a\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u7684\u539f\u5247\uff0c\u56e0\u6b64\u6211\u5011\u53ea\u80fd\u5728\u5806\u758a\u9802\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u65b0\u589e\u548c\u522a\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u5806\u758a\u53ef\u4ee5\u8996\u70ba\u4e00\u7a2e\u53d7\u9650\u5236\u7684\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u201c\u906e\u853d\u201d\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u90e8\u5206\u7121\u95dc\u64cd\u4f5c\uff0c\u4f7f\u5176\u5c0d\u5916\u8868\u73fe\u7684\u908f\u8f2f\u7b26\u5408\u5806\u758a\u7684\u7279\u6027\u3002

    "},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u9802\uff0c\u5c3e\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u5e95\u3002

    \u5982\u5716 5-2 \u6240\u793a\uff0c\u5c0d\u65bc\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u6211\u5011\u53ea\u9700\u5c07\u5143\u7d20\u63d2\u5165\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u9019\u7a2e\u7bc0\u9ede\u63d2\u5165\u65b9\u6cd5\u88ab\u7a31\u70ba\u201c\u982d\u63d2\u6cd5\u201d\u3002\u800c\u5c0d\u65bc\u51fa\u5806\u758a\u64cd\u4f5c\uff0c\u53ea\u9700\u5c07\u982d\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u5373\u53ef\u3002

    LinkedListStackpush()pop()

    \u5716 5-2 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
    class LinkedListStack:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\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\u5806\u758a\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize;        // \u5806\u758a\u7684\u9577\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private int stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize = 0;   // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u5806\u758a\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5806\u758a */\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/* \u8a2a\u554f\u5806\u758a\u9802\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/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
    linkedlist_stack.swift
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var _size: Int // \u5806\u758a\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    #stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    #stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private stkSize: number = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u985e\u5225\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n  int _stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba List \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    stk_size: usize,                              // \u5806\u758a\u7684\u9577\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    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\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    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    ListNode *top; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int size;      // \u5806\u758a\u7684\u9577\u5ea6\n} LinkedListStack;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\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/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u6307\u6a19\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u8cc7\u6599\u57df\n    s->top = node;       // \u66f4\u65b0\u5806\u758a\u9802\n    s->size++;           // \u66f4\u65b0\u5806\u758a\u5927\u5c0f\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u5806\u758a */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n    s->size--;\n    return val;\n}\n
    linkedlist_stack.kt
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var stkSize: Int = 0 // \u5806\u758a\u7684\u9577\u5ea6\n) {\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n        stk_size: usize = 0,                             // \u5806\u758a\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u5806\u758a\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\u5806\u758a\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        // \u5c07\u5806\u758a\u8f49\u63db\u70ba\u9663\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u4f7f\u7528\u9663\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u7684\u5c3e\u90e8\u4f5c\u70ba\u5806\u758a\u9802\u3002\u5982\u5716 5-3 \u6240\u793a\uff0c\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u5206\u5225\u5c0d\u61c9\u5728\u9663\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u8207\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(1)\\) \u3002

    ArrayStackpush()pop()

    \u5716 5-3 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

    \u7531\u65bc\u5165\u5806\u758a\u7684\u5143\u7d20\u53ef\u80fd\u6703\u6e90\u6e90\u4e0d\u65b7\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff0c\u9019\u6a23\u5c31\u7121\u9808\u81ea\u884c\u8655\u7406\u9663\u5217\u64f4\u5bb9\u554f\u984c\u3002\u4ee5\u4e0b\u70ba\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
    class ArrayStack:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        return self._stack\n
    array_stack.cpp
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
    array_stack.cs
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\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    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
    array_stack.go
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype arrayStack struct {\n    data []int // \u8cc7\u6599\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8a2d\u5b9a\u5806\u758a\u7684\u9577\u5ea6\u70ba 0\uff0c\u5bb9\u91cf\u70ba 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u6703\u81ea\u52d5\u64f4\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6\u5806\u758a\u9802\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/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
    array_stack.swift
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = []\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
    array_stack.js
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c07\u5806\u758a\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
    array_stack.rs
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u5806\u758a */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u5efa\u69cb\u5b50 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u500b\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u64f4\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u5806\u758a\u5df2\u6eff\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u5806\u758a */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
    array_stack.kt
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
    array_stack.rb
    ### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass ArrayStack\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
    array_stack.zig
    // \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\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\u69cb\u65b9\u6cd5\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u5806\u758a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u5169\u7a2e\u5be6\u73fe\u5c0d\u6bd4","text":"

    \u652f\u6301\u64cd\u4f5c

    \u5169\u7a2e\u5be6\u73fe\u90fd\u652f\u6301\u5806\u758a\u5b9a\u7fa9\u4e2d\u7684\u5404\u9805\u64cd\u4f5c\u3002\u9663\u5217\u5be6\u73fe\u984d\u5916\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff0c\u4f46\u9019\u5df2\u8d85\u51fa\u4e86\u5806\u758a\u7684\u5b9a\u7fa9\u7bc4\u7587\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u6703\u7528\u5230\u3002

    \u6642\u9593\u6548\u7387

    \u5728\u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u5165\u5806\u758a\u548c\u51fa\u5806\u758a\u64cd\u4f5c\u90fd\u5728\u9810\u5148\u5206\u914d\u597d\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u4e2d\u9032\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u5feb\u53d6\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f03\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u5806\u758a\u6642\u8d85\u51fa\u9663\u5217\u5bb9\u91cf\uff0c\u6703\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\uff0c\u5c0e\u81f4\u8a72\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8b8a\u70ba \\(O(n)\\) \u3002

    \u5728\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u64f4\u5bb9\u975e\u5e38\u9748\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u9663\u5217\u64f4\u5bb9\u6642\u6548\u7387\u964d\u4f4e\u7684\u554f\u984c\u3002\u4f46\u662f\uff0c\u5165\u5806\u758a\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u7bc0\u9ede\u7269\u4ef6\u4e26\u4fee\u6539\u6307\u6a19\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5c0d\u8f03\u4f4e\u3002\u4e0d\u904e\uff0c\u5982\u679c\u5165\u5806\u758a\u5143\u7d20\u672c\u8eab\u5c31\u662f\u7bc0\u9ede\u7269\u4ef6\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9a5f\uff0c\u5f9e\u800c\u63d0\u9ad8\u6548\u7387\u3002

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u7576\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u8cc7\u6599\u578b\u5225\u6642\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

    • \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u5728\u89f8\u767c\u64f4\u5bb9\u6642\u6548\u7387\u6703\u964d\u4f4e\uff0c\u4f46\u7531\u65bc\u64f4\u5bb9\u662f\u4f4e\u983b\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002

    \u7a7a\u9593\u6548\u7387

    \u5728\u521d\u59cb\u5316\u4e32\u5217\u6642\uff0c\u7cfb\u7d71\u6703\u70ba\u4e32\u5217\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8a72\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\uff1b\u4e26\u4e14\uff0c\u64f4\u5bb9\u6a5f\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u9032\u884c\u64f4\u5bb9\u7684\uff0c\u64f4\u5bb9\u5f8c\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002

    \u7136\u800c\uff0c\u7531\u65bc\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9700\u8981\u984d\u5916\u5132\u5b58\u6307\u6a19\uff0c\u56e0\u6b64\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u4f54\u7528\u7684\u7a7a\u9593\u76f8\u5c0d\u8f03\u5927\u3002

    \u7d9c\u4e0a\uff0c\u6211\u5011\u4e0d\u80fd\u7c21\u55ae\u5730\u78ba\u5b9a\u54ea\u7a2e\u5be6\u73fe\u66f4\u52a0\u7bc0\u7701\u8a18\u61b6\u9ad4\uff0c\u9700\u8981\u91dd\u5c0d\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

    "},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u5806\u758a\u7684\u5178\u578b\u61c9\u7528","text":"
    • \u700f\u89bd\u5668\u4e2d\u7684\u5f8c\u9000\u8207\u524d\u9032\u3001\u8edf\u9ad4\u4e2d\u7684\u64a4\u92b7\u8207\u53cd\u64a4\u92b7\u3002\u6bcf\u7576\u6211\u5011\u958b\u555f\u65b0\u7684\u7db2\u9801\uff0c\u700f\u89bd\u5668\u5c31\u6703\u5c0d\u4e0a\u4e00\u500b\u7db2\u9801\u57f7\u884c\u5165\u5806\u758a\uff0c\u9019\u6a23\u6211\u5011\u5c31\u53ef\u4ee5\u901a\u904e\u5f8c\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u500b\u7db2\u9801\u3002\u5f8c\u9000\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u5728\u57f7\u884c\u51fa\u5806\u758a\u3002\u5982\u679c\u8981\u540c\u6642\u652f\u6301\u5f8c\u9000\u548c\u524d\u9032\uff0c\u90a3\u9ebc\u9700\u8981\u5169\u500b\u5806\u758a\u4f86\u914d\u5408\u5be6\u73fe\u3002
    • \u7a0b\u5f0f\u8a18\u61b6\u9ad4\u7ba1\u7406\u3002\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u5728\u5806\u758a\u9802\u65b0\u589e\u4e00\u500b\u5806\u758a\u5e40\uff0c\u7528\u65bc\u8a18\u9304\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u8a0a\u3002\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u5411\u4e0b\u905e\u63a8\u968e\u6bb5\u6703\u4e0d\u65b7\u57f7\u884c\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u968e\u6bb5\u5247\u6703\u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u758a\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5806\u758a\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
    • \u5728\u6642\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u5177\u6709\u8f03\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u64f4\u5bb9\u904e\u7a0b\u4e2d\uff0c\u55ae\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5806\u758a\u7684\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5177\u6709\u66f4\u70ba\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002
    • \u5728\u7a7a\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u53ef\u80fd\u5c0e\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6bd4\u9663\u5217\u5143\u7d20\u66f4\u5927\u3002
    • \u4f47\u5217\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u540c\u6a23\u53ef\u4ee5\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u7684\u5c0d\u6bd4\u4e0a\uff0c\u4f47\u5217\u7684\u7d50\u8ad6\u8207\u524d\u8ff0\u5806\u758a\u7684\u7d50\u8ad6\u76f8\u4f3c\u3002
    • \u96d9\u5411\u4f47\u5217\u662f\u4e00\u7a2e\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u4f47\u5217\uff0c\u5b83\u5141\u8a31\u5728\u5169\u7aef\u9032\u884c\u5143\u7d20\u7684\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u662f\u5426\u662f\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1f

    \u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u529f\u80fd\u672c\u8cea\u4e0a\u662f\u201c\u5806\u758a\u201d\u7684\u9ad4\u73fe\u3002\u7576\u7528\u6236\u8a2a\u554f\u4e00\u500b\u65b0\u9801\u9762\u6642\uff0c\u8a72\u9801\u9762\u6703\u88ab\u65b0\u589e\u5230\u5806\u758a\u9802\uff1b\u7576\u7528\u6236\u9ede\u9078\u5f8c\u9000\u6309\u9215\u6642\uff0c\u8a72\u9801\u9762\u6703\u5f9e\u5806\u758a\u9802\u5f48\u51fa\u3002\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u64cd\u4f5c\uff0c\u9019\u500b\u5728\u201c\u96d9\u5411\u4f47\u5217\u201d\u7ae0\u7bc0\u6709\u63d0\u5230\u3002

    Q\uff1a\u5728\u51fa\u5806\u758a\u5f8c\uff0c\u662f\u5426\u9700\u8981\u91cb\u653e\u51fa\u5806\u758a\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\uff1f

    \u5982\u679c\u5f8c\u7e8c\u4ecd\u9700\u8981\u4f7f\u7528\u5f48\u51fa\u7bc0\u9ede\uff0c\u5247\u4e0d\u9700\u8981\u91cb\u653e\u8a18\u61b6\u9ad4\u3002\u82e5\u4e4b\u5f8c\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8a9e\u8a00\u64c1\u6709\u81ea\u52d5\u5783\u573e\u56de\u6536\u6a5f\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\u3002

    Q\uff1a\u96d9\u5411\u4f47\u5217\u50cf\u662f\u5169\u500b\u5806\u758a\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u9ebc\uff1f

    \u96d9\u5411\u4f47\u5217\u5c31\u50cf\u662f\u5806\u758a\u548c\u4f47\u5217\u7684\u7d44\u5408\u6216\u5169\u500b\u5806\u758a\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73fe\u7684\u662f\u5806\u758a + \u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u53ef\u4ee5\u5be6\u73fe\u5806\u758a\u8207\u4f47\u5217\u7684\u6240\u6709\u61c9\u7528\uff0c\u4e26\u4e14\u66f4\u52a0\u9748\u6d3b\u3002

    Q\uff1a\u64a4\u92b7\uff08undo\uff09\u548c\u53cd\u64a4\u92b7\uff08redo\uff09\u5177\u9ad4\u662f\u5982\u4f55\u5be6\u73fe\u7684\uff1f

    \u4f7f\u7528\u5169\u500b\u5806\u758a\uff0c\u5806\u758a A \u7528\u65bc\u64a4\u92b7\uff0c\u5806\u758a B \u7528\u65bc\u53cd\u64a4\u92b7\u3002

    1. \u6bcf\u7576\u4f7f\u7528\u8005\u57f7\u884c\u4e00\u500b\u64cd\u4f5c\uff0c\u5c07\u9019\u500b\u64cd\u4f5c\u58d3\u5165\u5806\u758a A \uff0c\u4e26\u6e05\u7a7a\u5806\u758a B \u3002
    2. \u7576\u7528\u6236\u57f7\u884c\u201c\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a A \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a B \u3002
    3. \u7576\u7528\u6236\u57f7\u884c\u201c\u53cd\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a B \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a A \u3002
    "},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6a39","text":"

    Abstract

    \u53c3\u5929\u5927\u6a39\u5145\u6eff\u751f\u547d\u529b\uff0c\u6839\u6df1\u8449\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

    \u5b83\u70ba\u6211\u5011\u5c55\u73fe\u4e86\u8cc7\u6599\u5206\u6cbb\u7684\u751f\u52d5\u5f62\u614b\u3002

    "},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 7.1 \u00a0 \u4e8c\u5143\u6a39
    • 7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a
    • 7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a
    • 7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39
    • 7.5 \u00a0 AVL *
    • 7.6 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a","text":"

    \u5728\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u5132\u5b58\u55ae\u5143\u70ba\u7bc0\u9ede TreeNode \uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u6307\u6a19\u76f8\u9023\u7dda\u3002\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7684\u5404\u9805\u57fa\u672c\u64cd\u4f5c\u3002

    \u90a3\u9ebc\uff0c\u6211\u5011\u80fd\u5426\u7528\u9663\u5217\u4f86\u8868\u793a\u4e8c\u5143\u6a39\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\u5143\u6a39","text":"

    \u5148\u5206\u6790\u4e00\u500b\u7c21\u55ae\u6848\u4f8b\u3002\u7d66\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u6211\u5011\u5c07\u6240\u6709\u7bc0\u9ede\u6309\u7167\u5c64\u5e8f\u8d70\u8a2a\u7684\u9806\u5e8f\u5132\u5b58\u5728\u4e00\u500b\u9663\u5217\u4e2d\uff0c\u5247\u6bcf\u500b\u7bc0\u9ede\u90fd\u5c0d\u61c9\u552f\u4e00\u7684\u9663\u5217\u7d22\u5f15\u3002

    \u6839\u64da\u5c64\u5e8f\u8d70\u8a2a\u7684\u7279\u6027\uff0c\u6211\u5011\u53ef\u4ee5\u63a8\u5c0e\u51fa\u7236\u7bc0\u9ede\u7d22\u5f15\u8207\u5b50\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u201c\u5c0d\u6620\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(i\\) \uff0c\u5247\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 2\\) \u3002\u5716 7-12 \u5c55\u793a\u4e86\u5404\u500b\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u5c0d\u6620\u95dc\u4fc2\u3002

    \u5716 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u5c0d\u6620\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u7576\u65bc\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u7d66\u5b9a\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u7bc0\u9ede\uff0c\u6211\u5011\u90fd\u53ef\u4ee5\u900f\u904e\u5c0d\u6620\u516c\u5f0f\u4f86\u8a2a\u554f\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u5143\u6a39","text":"

    \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u4e00\u500b\u7279\u4f8b\uff0c\u5728\u4e8c\u5143\u6a39\u7684\u4e2d\u9593\u5c64\u901a\u5e38\u5b58\u5728\u8a31\u591a None \u3002\u7531\u65bc\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e26\u4e0d\u5305\u542b\u9019\u4e9b None \uff0c\u56e0\u6b64\u6211\u5011\u7121\u6cd5\u50c5\u6191\u8a72\u5e8f\u5217\u4f86\u63a8\u6e2c None \u7684\u6578\u91cf\u548c\u5206\u4f48\u4f4d\u7f6e\u3002\u9019\u610f\u5473\u8457\u5b58\u5728\u591a\u7a2e\u4e8c\u5143\u6a39\u7d50\u69cb\u90fd\u7b26\u5408\u8a72\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002

    \u5982\u5716 7-13 \u6240\u793a\uff0c\u7d66\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u4e0a\u8ff0\u9663\u5217\u8868\u793a\u65b9\u6cd5\u5df2\u7d93\u5931\u6548\u3002

    \u5716 7-13 \u00a0 \u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c0d\u61c9\u591a\u7a2e\u4e8c\u5143\u6a39\u53ef\u80fd\u6027

    \u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e2d\u986f\u5f0f\u5730\u5beb\u51fa\u6240\u6709 None \u3002\u5982\u5716 7-14 \u6240\u793a\uff0c\u9019\u6a23\u8655\u7406\u5f8c\uff0c\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u5143\u6a39\u4e86\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\n# \u4f7f\u7528 None \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6a19\u8a18\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88dd\u985e\u5225 Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 any \u578b\u5225\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 None \u4f86\u6a19\u8a18\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6a19\u8a18\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u7bc0\u9ede\u503c\u4e0d\u80fd\u70ba 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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    \n
    \n

    \u5716 7-14 \u00a0 \u4efb\u610f\u578b\u5225\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u4f7f\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u56de\u9867\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u5b9a\u7fa9\uff0cNone \u53ea\u51fa\u73fe\u5728\u6700\u5e95\u5c64\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73fe\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u672b\u5c3e\u3002

    \u9019\u610f\u5473\u8457\u4f7f\u7528\u9663\u5217\u8868\u793a\u5b8c\u5168\u4e8c\u5143\u6a39\u6642\uff0c\u53ef\u4ee5\u7701\u7565\u5132\u5b58\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u5716 7-15 \u7d66\u51fa\u4e86\u4e00\u500b\u4f8b\u5b50\u3002

    \u5716 7-15 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u68f5\u57fa\u65bc\u9663\u5217\u8868\u793a\u7684\u4e8c\u5143\u6a39\uff0c\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u64cd\u4f5c\u3002

    • \u7d66\u5b9a\u67d0\u7bc0\u9ede\uff0c\u7372\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3001\u7236\u7bc0\u9ede\u3002
    • \u7372\u53d6\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u3001\u5f8c\u5e8f\u8d70\u8a2a\u3001\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
    class ArrayBinaryTree:\n    \"\"\"\u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
    array_binary_tree.cpp
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u8d70\u8a2a */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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\u512a\u5148\u8d70\u8a2a */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
    array_binary_tree.java
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.go
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
    array_binary_tree.swift
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u5efa\u69cb\u5b50 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    #dfs(i, order, res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.ts
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.dart
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u4e32\u5217\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c64\u5e8f\u8d70\u8a2a */\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\u512a\u5148\u8d70\u8a2a */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u8d70\u8a2a */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u8d70\u8a2a */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u5f8c\u5e8f\u8d70\u8a2a */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
    array_binary_tree.rs
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\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\u8d70\u8a2a\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\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\u8d70\u8a2a */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\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\u8d70\u8a2a */\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/* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    [class]{ArrayBinaryTree}-[func]{}\n
    array_binary_tree.zig
    [class]{ArrayBinaryTree}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

    • \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u5c0d\u5feb\u53d6\u53cb\u597d\uff0c\u8a2a\u554f\u8207\u8d70\u8a2a\u901f\u5ea6\u8f03\u5feb\u3002
    • \u4e0d\u9700\u8981\u5132\u5b58\u6307\u6a19\uff0c\u6bd4\u8f03\u7bc0\u7701\u7a7a\u9593\u3002
    • \u5141\u8a31\u96a8\u6a5f\u8a2a\u554f\u7bc0\u9ede\u3002

    \u7136\u800c\uff0c\u9663\u5217\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002

    • \u9663\u5217\u5132\u5b58\u9700\u8981\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u5132\u5b58\u8cc7\u6599\u91cf\u904e\u5927\u7684\u6a39\u3002
    • \u589e\u522a\u7bc0\u9ede\u9700\u8981\u900f\u904e\u9663\u5217\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u5be6\u73fe\uff0c\u6548\u7387\u8f03\u4f4e\u3002
    • \u7576\u4e8c\u5143\u6a39\u4e2d\u5b58\u5728\u5927\u91cf None \u6642\uff0c\u9663\u5217\u4e2d\u5305\u542b\u7684\u7bc0\u9ede\u8cc7\u6599\u6bd4\u91cd\u8f03\u4f4e\uff0c\u7a7a\u9593\u5229\u7528\u7387\u8f03\u4f4e\u3002
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6a39 *","text":"

    \u5728\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7ae0\u7bc0\u4e2d\u6211\u5011\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5c07\u5f9e \\(O(\\log n)\\) \u52a3\u5316\u70ba \\(O(n)\\) \u3002

    \u5982\u5716 7-24 \u6240\u793a\uff0c\u7d93\u904e\u5169\u6b21\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\uff0c\u9019\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\u4fbf\u6703\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002

    \u5716 7-24 \u00a0 AVL \u6a39\u5728\u522a\u9664\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

    \u518d\u4f8b\u5982\uff0c\u5728\u5716 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u5169\u500b\u7bc0\u9ede\u5f8c\uff0c\u6a39\u5c07\u56b4\u91cd\u5411\u5de6\u50be\u659c\uff0c\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u96a8\u4e4b\u52a3\u5316\u3002

    \u5716 7-25 \u00a0 AVL \u6a39\u5728\u63d2\u5165\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

    1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8ad6\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6a39\u3002\u8ad6\u6587\u4e2d\u8a73\u7d30\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u78ba\u4fdd\u5728\u6301\u7e8c\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u4e0d\u6703\u9000\u5316\uff0c\u5f9e\u800c\u4f7f\u5f97\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7d1a\u5225\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u5728\u9700\u8981\u983b\u7e41\u9032\u884c\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u5834\u666f\u4e2d\uff0cAVL \u6a39\u80fd\u59cb\u7d42\u4fdd\u6301\u9ad8\u6548\u7684\u8cc7\u6599\u64cd\u4f5c\u6548\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u61c9\u7528\u50f9\u503c\u3002

    "},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6a39\u5e38\u898b\u8853\u8a9e","text":"

    AVL \u6a39\u65e2\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u5143\u6a39\uff0c\u540c\u6642\u6eff\u8db3\u9019\u5169\u985e\u4e8c\u5143\u6a39\u7684\u6240\u6709\u6027\u8cea\uff0c\u56e0\u6b64\u662f\u4e00\u7a2e\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff08balanced binary search tree\uff09\u3002

    "},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u7bc0\u9ede\u9ad8\u5ea6","text":"

    \u7531\u65bc AVL \u6a39\u7684\u76f8\u95dc\u64cd\u4f5c\u9700\u8981\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u70ba\u7bc0\u9ede\u985e\u5225\u65b0\u589e height \u8b8a\u6578\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL \u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u7bc0\u9ede\u503c\n        self.height: int = 0                # \u7bc0\u9ede\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nstruct TreeNode {\n    int val{};          // \u7bc0\u9ede\u503c\n    int height = 0;     // \u7bc0\u9ede\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u7bc0\u9ede\n    TreeNode *right{};  // \u53f3\u5b50\u7bc0\u9ede\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    public int val;        // \u7bc0\u9ede\u503c\n    public int height;     // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u7bc0\u9ede\n    public TreeNode right; // \u53f3\u5b50\u7bc0\u9ede\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val    int       // \u7bc0\u9ede\u503c\n    Height int       // \u7bc0\u9ede\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var height: Int // \u7bc0\u9ede\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    height; //\u7bc0\u9ede\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;            // \u7bc0\u9ede\u503c\n    height: number;         // \u7bc0\u9ede\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right: TreeNode | null; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    height: i32,                            // \u7bc0\u9ede\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\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 \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val height: Int = 0          // \u7bc0\u9ede\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\n}\n
    \n
    \n

    \u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u662f\u6307\u5f9e\u8a72\u7bc0\u9ede\u5230\u5b83\u7684\u6700\u9060\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u5373\u6240\u7d93\u904e\u7684\u201c\u908a\u201d\u7684\u6578\u91cf\u3002\u9700\u8981\u7279\u5225\u6ce8\u610f\u7684\u662f\uff0c\u8449\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(0\\) \uff0c\u800c\u7a7a\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(-1\\) \u3002\u6211\u5011\u5c07\u5efa\u7acb\u5169\u500b\u5de5\u5177\u51fd\u5f0f\uff0c\u5206\u5225\u7528\u65bc\u7372\u53d6\u548c\u66f4\u65b0\u7bc0\u9ede\u7684\u9ad8\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 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\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
    avl_tree.cpp
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
    avl_tree.java
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.cs
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
    avl_tree.go
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
    avl_tree.js
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.ts
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.dart
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.rs
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\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        // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
    avl_tree.c
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{height}\n\n[class]{AVLTree}-[func]{update_height}\n
    avl_tree.zig
    // \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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 \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50","text":"

    \u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u7fa9\u70ba\u7bc0\u9ede\u5de6\u5b50\u6a39\u7684\u9ad8\u5ea6\u6e1b\u53bb\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\uff0c\u540c\u6642\u898f\u5b9a\u7a7a\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u70ba \\(0\\) \u3002\u6211\u5011\u540c\u6a23\u5c07\u7372\u53d6\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node is None:\n        return 0\n    # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
    avl_tree.cpp
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == nullptr)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.java
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
    avl_tree.cs
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
    avl_tree.go
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node == nil {\n        return 0\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
    avl_tree.swift
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    guard let node = node else { return 0 }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
    avl_tree.js
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.ts
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.dart
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  if (node == null) return 0;\n  // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
    avl_tree.rs
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n        None => 0,\n        // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\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
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.kt
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{balance_factor}\n
    avl_tree.zig
    // \u7372\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

    Note

    \u8a2d\u5e73\u8861\u56e0\u5b50\u70ba \\(f\\) \uff0c\u5247\u4e00\u68f5 AVL \u6a39\u7684\u4efb\u610f\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6eff\u8db3 \\(-1 \\le f \\le 1\\) \u3002

    "},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6a39\u65cb\u8f49","text":"

    AVL \u6a39\u7684\u7279\u9ede\u5728\u65bc\u201c\u65cb\u8f49\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u5920\u5728\u4e0d\u5f71\u97ff\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u65cb\u8f49\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7684\u6027\u8cea\uff0c\u4e5f\u80fd\u4f7f\u6a39\u91cd\u65b0\u8b8a\u70ba\u201c\u5e73\u8861\u4e8c\u5143\u6a39\u201d\u3002

    \u6211\u5011\u5c07\u5e73\u8861\u56e0\u5b50\u7d55\u5c0d\u503c \\(> 1\\) \u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5931\u8861\u7bc0\u9ede\u201d\u3002\u6839\u64da\u7bc0\u9ede\u5931\u8861\u60c5\u6cc1\u7684\u4e0d\u540c\uff0c\u65cb\u8f49\u64cd\u4f5c\u5206\u70ba\u56db\u7a2e\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3002\u4e0b\u9762\u8a73\u7d30\u4ecb\u7d39\u9019\u4e9b\u65cb\u8f49\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

    \u5982\u5716 7-26 \u6240\u793a\uff0c\u7bc0\u9ede\u4e0b\u65b9\u70ba\u5e73\u8861\u56e0\u5b50\u3002\u5f9e\u5e95\u81f3\u9802\u770b\uff0c\u4e8c\u5143\u6a39\u4e2d\u9996\u500b\u5931\u8861\u7bc0\u9ede\u662f\u201c\u7bc0\u9ede 3\u201d\u3002\u6211\u5011\u95dc\u6ce8\u4ee5\u8a72\u5931\u8861\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\uff0c\u5c07\u8a72\u7bc0\u9ede\u8a18\u70ba node \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u8a18\u70ba child \uff0c\u57f7\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u5f8c\uff0c\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\uff0c\u4e26\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u3002

    <1><2><3><4>

    \u5716 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9a5f

    \u5982\u5716 7-27 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u53f3\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u5de6\u5b50\u7bc0\u9ede\u3002

    \u5716 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

    \u201c\u5411\u53f3\u65cb\u8f49\u201d\u662f\u4e00\u7a2e\u5f62\u8c61\u5316\u7684\u8aaa\u6cd5\uff0c\u5be6\u969b\u4e0a\u9700\u8981\u900f\u904e\u4fee\u6539\u7bc0\u9ede\u6307\u6a19\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{right_rotate}\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

    \u76f8\u61c9\u5730\uff0c\u5982\u679c\u8003\u616e\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u201c\u6620\u8c61\u201d\uff0c\u5247\u9700\u8981\u57f7\u884c\u5716 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

    \u5716 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

    \u540c\u7406\uff0c\u5982\u5716 7-29 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u5de6\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u53f3\u5b50\u7bc0\u9ede\u3002

    \u5716 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

    \u53ef\u4ee5\u89c0\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u908f\u8f2f\u4e0a\u662f\u6620\u8c61\u5c0d\u7a31\u7684\uff0c\u5b83\u5011\u5206\u5225\u89e3\u6c7a\u7684\u5169\u7a2e\u5931\u8861\u60c5\u6cc1\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u57fa\u65bc\u5c0d\u7a31\u6027\uff0c\u6211\u5011\u53ea\u9700\u5c07\u53f3\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u63db\u70ba right \uff0c\u5c07\u6240\u6709\u7684 right \u66ff\u63db\u70ba left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{left_rotate}\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb","text":"

    \u5c0d\u65bc\u5716 7-30 \u4e2d\u7684\u5931\u8861\u7bc0\u9ede 3 \uff0c\u50c5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u7121\u6cd5\u4f7f\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\u3002\u6b64\u6642\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u53f3\u65cb\u201d\u3002

    \u5716 7-30 \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb

    "},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb","text":"

    \u5982\u5716 7-31 \u6240\u793a\uff0c\u5c0d\u65bc\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u6620\u8c61\u60c5\u6cc1\uff0c\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u5de6\u65cb\u201d\u3002

    \u5716 7-31 \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

    "},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f49\u7684\u9078\u64c7","text":"

    \u5716 7-32 \u5c55\u793a\u7684\u56db\u7a2e\u5931\u8861\u60c5\u6cc1\u8207\u4e0a\u8ff0\u6848\u4f8b\u9010\u500b\u5c0d\u61c9\uff0c\u5206\u5225\u9700\u8981\u63a1\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

    \u5716 7-32 \u00a0 AVL \u6a39\u7684\u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u5011\u900f\u904e\u5224\u65b7\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f03\u9ad8\u4e00\u5074\u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8ca0\u865f\uff0c\u4f86\u78ba\u5b9a\u5931\u8861\u7bc0\u9ede\u5c6c\u65bc\u5716 7-32 \u4e2d\u7684\u54ea\u7a2e\u60c5\u6cc1\u3002

    \u8868 7-3 \u00a0 \u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1\u7684\u9078\u64c7\u689d\u4ef6

    \u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u61c9\u63a1\u7528\u7684\u65cb\u8f49\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(<0\\) \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(>0\\) \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

    \u70ba\u4e86\u4fbf\u65bc\u4f7f\u7528\uff0c\u6211\u5011\u5c07\u65cb\u8f49\u64cd\u4f5c\u5c01\u88dd\u6210\u4e00\u500b\u51fd\u5f0f\u3002\u6709\u4e86\u9019\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u5c31\u80fd\u5c0d\u5404\u7a2e\u5931\u8861\u60c5\u6cc1\u9032\u884c\u65cb\u8f49\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\"\"\"\n    # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
    avl_tree.cpp
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.java
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.cs
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.go
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u85a6\u77ed\u8b8a\u6578\uff0c\u9019\u88e1 bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.swift
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.js
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n#rotate(node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.ts
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.dart
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6a39\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6a39\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
    avl_tree.rs
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6a39\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\u5f8c\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\u6a39\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\u5f8c\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\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
    avl_tree.c
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.kt
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{rotate}\n
    avl_tree.zig
    // \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6a39\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

    AVL \u6a39\u7684\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u5728\u4e3b\u9ad4\u4e0a\u985e\u4f3c\u3002\u552f\u4e00\u7684\u5340\u5225\u5728\u65bc\uff0c\u5728 AVL \u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede\u5f8c\uff0c\u5f9e\u8a72\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u53ef\u80fd\u6703\u51fa\u73fe\u4e00\u7cfb\u5217\u5931\u8861\u7bc0\u9ede\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u5f9e\u9019\u500b\u7bc0\u9ede\u958b\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def insert(self, val):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.java
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.cs
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.go
    /* \u63d2\u5165\u7bc0\u9ede */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.swift
    /* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.js
    /* \u63d2\u5165\u7bc0\u9ede */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.ts
    /* \u63d2\u5165\u7bc0\u9ede */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.dart
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
    avl_tree.rs
    /* \u63d2\u5165\u7bc0\u9ede */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
    avl_tree.c
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.kt
    /* \u63d2\u5165\u7bc0\u9ede */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{insert}\n\n[class]{AVLTree}-[func]{insert_helper}\n
    avl_tree.zig
    // \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u985e\u4f3c\u5730\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u522a\u9664\u7bc0\u9ede\u65b9\u6cd5\u7684\u57fa\u790e\u4e0a\uff0c\u9700\u8981\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def remove(self, val: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.java
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.cs
    /* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.go
    /* \u522a\u9664\u7bc0\u9ede */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.swift
    /* \u522a\u9664\u7bc0\u9ede */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\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\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.js
    /* \u522a\u9664\u7bc0\u9ede */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.ts
    /* \u522a\u9664\u7bc0\u9ede */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.dart
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
    avl_tree.rs
    /* \u522a\u9664\u7bc0\u9ede */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.kt
    /* \u522a\u9664\u7bc0\u9ede */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{remove}\n\n[class]{AVLTree}-[func]{remove_helper}\n
    avl_tree.zig
    // \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\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\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    AVL \u6a39\u7684\u7bc0\u9ede\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

    "},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6a39\u5178\u578b\u61c9\u7528","text":"
    • \u7d44\u7e54\u548c\u5132\u5b58\u5927\u578b\u8cc7\u6599\uff0c\u9069\u7528\u65bc\u9ad8\u983b\u67e5\u8a62\u3001\u4f4e\u983b\u589e\u522a\u7684\u5834\u666f\u3002
    • \u7528\u65bc\u69cb\u5efa\u8cc7\u6599\u5eab\u4e2d\u7684\u7d22\u5f15\u7cfb\u7d71\u3002
    • \u7d05\u9ed1\u6a39\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\u3002\u76f8\u8f03\u65bc AVL \u6a39\uff0c\u7d05\u9ed1\u6a39\u7684\u5e73\u8861\u689d\u4ef6\u66f4\u5bec\u9b06\uff0c\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u6240\u9700\u7684\u65cb\u8f49\u64cd\u4f5c\u66f4\u5c11\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39","text":"

    \u5982\u5716 7-16 \u6240\u793a\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\uff08binary search tree\uff09\u6eff\u8db3\u4ee5\u4e0b\u689d\u4ef6\u3002

    1. \u5c0d\u65bc\u6839\u7bc0\u9ede\uff0c\u5de6\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c \\(<\\) \u6839\u7bc0\u9ede\u7684\u503c \\(<\\) \u53f3\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c\u3002
    2. \u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u3001\u53f3\u5b50\u6a39\u4e5f\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5373\u540c\u6a23\u6eff\u8db3\u689d\u4ef6 1. \u3002

    \u5716 7-16 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39

    "},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u64cd\u4f5c","text":"

    \u6211\u5011\u5c07\u4e8c\u5143\u641c\u5c0b\u6a39\u5c01\u88dd\u70ba\u4e00\u500b\u985e\u5225 BinarySearchTree \uff0c\u4e26\u5ba3\u544a\u4e00\u500b\u6210\u54e1\u8b8a\u6578 root \uff0c\u6307\u5411\u6a39\u7684\u6839\u7bc0\u9ede\u3002

    "},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    \u7d66\u5b9a\u76ee\u6a19\u7bc0\u9ede\u503c num \uff0c\u53ef\u4ee5\u6839\u64da\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u4f86\u67e5\u8a62\u3002\u5982\u5716 7-17 \u6240\u793a\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u7bc0\u9ede cur \uff0c\u5f9e\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede root \u51fa\u767c\uff0c\u8ff4\u5708\u6bd4\u8f03\u7bc0\u9ede\u503c cur.val \u548c num \u4e4b\u9593\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

    • \u82e5 cur.val < num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.right \u3002
    • \u82e5 cur.val > num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.left \u3002
    • \u82e5 cur.val = num \uff0c\u8aaa\u660e\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\u4e26\u8fd4\u56de\u8a72\u7bc0\u9ede\u3002
    <1><2><3><4>

    \u5716 7-17 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7bc0\u9ede\u793a\u4f8b

    \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f2a\u6392\u9664\u4e00\u534a\u60c5\u6cc1\u3002\u8ff4\u5708\u6b21\u6578\u6700\u591a\u70ba\u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff0c\u7576\u4e8c\u5143\u6a39\u5e73\u8861\u6642\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u8a62\u7bc0\u9ede\"\"\"\n    cur = self._root\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else:\n            break\n    return cur\n
    binary_search_tree.cpp
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.java
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.cs
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.go
    /* \u67e5\u8a62\u7bc0\u9ede */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return node\n}\n
    binary_search_tree.swift
    /* \u67e5\u8a62\u7bc0\u9ede */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
    binary_search_tree.js
    /* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num) {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.ts
    /* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.dart
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n  return cur;\n}\n
    binary_search_tree.rs
    /* \u67e5\u8a62\u7bc0\u9ede */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    cur\n}\n
    binary_search_tree.c
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.kt
    /* \u67e5\u8a62\u7bc0\u9ede */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{search}\n
    binary_search_tree.zig
    // \u67e5\u8a62\u7bc0\u9ede\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

    \u7d66\u5b9a\u4e00\u500b\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u70ba\u4e86\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-18 \u6240\u793a\u3002

    1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\uff1a\u8207\u67e5\u8a62\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5f9e\u6839\u7bc0\u9ede\u51fa\u767c\uff0c\u6839\u64da\u7576\u524d\u7bc0\u9ede\u503c\u548c num \u7684\u5927\u5c0f\u95dc\u4fc2\u8ff4\u5708\u5411\u4e0b\u641c\u5c0b\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\uff08\u8d70\u8a2a\u81f3 None \uff09\u6642\u8df3\u51fa\u8ff4\u5708\u3002
    2. \u5728\u8a72\u4f4d\u7f6e\u63d2\u5165\u7bc0\u9ede\uff1a\u521d\u59cb\u5316\u7bc0\u9ede num \uff0c\u5c07\u8a72\u7bc0\u9ede\u7f6e\u65bc None \u7684\u4f4d\u7f6e\u3002

    \u5716 7-18 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

    • \u4e8c\u5143\u641c\u5c0b\u6a39\u4e0d\u5141\u8a31\u5b58\u5728\u91cd\u8907\u7bc0\u9ede\uff0c\u5426\u5247\u5c07\u9055\u53cd\u5176\u5b9a\u7fa9\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u7bc0\u9ede\u5728\u6a39\u4e2d\u5df2\u5b58\u5728\uff0c\u5247\u4e0d\u57f7\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
    • \u70ba\u4e86\u5be6\u73fe\u63d2\u5165\u7bc0\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u7bc0\u9ede pre \u5132\u5b58\u4e0a\u4e00\u8f2a\u8ff4\u5708\u7684\u7bc0\u9ede\u3002\u9019\u6a23\u5728\u8d70\u8a2a\u81f3 None \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u7372\u53d6\u5230\u5176\u7236\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b8c\u6210\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid Insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\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\u7bc0\u9ede\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\u7bc0\u9ede */\nfunc insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\ninsert(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\ninsert(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\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\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nfun insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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
    [class]{BinarySearchTree}-[func]{insert}\n
    binary_search_tree.zig
    // \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8207\u67e5\u8a62\u7bc0\u9ede\u76f8\u540c\uff0c\u63d2\u5165\u7bc0\u9ede\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002

    "},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u5148\u5728\u4e8c\u5143\u6a39\u4e2d\u67e5\u8a62\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u518d\u5c07\u5176\u522a\u9664\u3002\u8207\u63d2\u5165\u7bc0\u9ede\u985e\u4f3c\uff0c\u6211\u5011\u9700\u8981\u4fdd\u8b49\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\u4ecd\u7136\u6eff\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6839\u64da\u76ee\u6a19\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u6578\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u7a2e\u60c5\u6cc1\uff0c\u57f7\u884c\u5c0d\u61c9\u7684\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u3002

    \u5982\u5716 7-19 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \u6642\uff0c\u8868\u793a\u8a72\u7bc0\u9ede\u662f\u8449\u7bc0\u9ede\uff0c\u53ef\u4ee5\u76f4\u63a5\u522a\u9664\u3002

    \u5716 7-19 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 0 \uff09

    \u5982\u5716 7-20 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(1\\) \u6642\uff0c\u5c07\u5f85\u522a\u9664\u7bc0\u9ede\u66ff\u63db\u70ba\u5176\u5b50\u7bc0\u9ede\u5373\u53ef\u3002

    \u5716 7-20 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 1 \uff09

    \u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(2\\) \u6642\uff0c\u6211\u5011\u7121\u6cd5\u76f4\u63a5\u522a\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u500b\u7bc0\u9ede\u66ff\u63db\u8a72\u7bc0\u9ede\u3002\u7531\u65bc\u8981\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u56e0\u6b64\u9019\u500b\u7bc0\u9ede\u53ef\u4ee5\u662f\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\u6216\u5de6\u5b50\u6a39\u7684\u6700\u5927\u7bc0\u9ede\u3002

    \u5047\u8a2d\u6211\u5011\u9078\u64c7\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\uff08\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\uff0c\u5247\u522a\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-21 \u6240\u793a\u3002

    1. \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\u5728\u201c\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff0c\u8a18\u70ba tmp \u3002
    2. \u7528 tmp \u7684\u503c\u8986\u84cb\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u503c\uff0c\u4e26\u5728\u6a39\u4e2d\u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp \u3002
    <1><2><3><4>

    \u5716 7-21 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 2 \uff09

    \u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u540c\u6a23\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\uff0c\u5176\u4e2d\u67e5\u8a62\u5f85\u522a\u9664\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\uff0c\u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u5f8c\u7e7c\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def remove(self, num: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        child = cur.left or cur.right\n        # \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            self._root = child\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else:\n        # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val\n
    binary_search_tree.cpp
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete cur;\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.java
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.cs
    /* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode? child = cur.left ?? cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.go
    /* \u522a\u9664\u7bc0\u9ede */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\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\u522a\u9664\u7bc0\u9ede\u5728\u53f3\u5b50\u6a39\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u5de6\u5b50\u6a39\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u70ba 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            bst.root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u70ba 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5f85\u522a\u9664\u7bc0\u9ede cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u84cb cur\n        cur.Val = tmp.Val\n    }\n}\n
    binary_search_tree.swift
    /* \u522a\u9664\u7bc0\u9ede */\nfunc remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        let child = cur?.left ?? cur?.right\n        // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur?.val = tmp!.val\n    }\n}\n
    binary_search_tree.js
    /* \u522a\u9664\u7bc0\u9ede */\nremove(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.ts
    /* \u522a\u9664\u7bc0\u9ede */\nremove(num: number): void {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp!.val;\n    }\n}\n
    binary_search_tree.dart
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    TreeNode? child = cur.left ?? cur.right;\n    // \u522a\u9664\u7bc0\u9ede cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      _root = child;\n    }\n  } else {\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val;\n  }\n}\n
    binary_search_tree.rs
    /* \u522a\u9664\u7bc0\u9ede */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\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\u7bc0\u9ede\u6578\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n                self.root = child;\n            }\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\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            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
    binary_search_tree.c
    /* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65b7\u5f85\u522a\u9664\u7bc0\u9ede\u662f\u5426\u5b58\u5728\u5b50\u7bc0\u9ede\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1 */\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(cur);\n    } else {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 2 */\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.kt
    /* \u522a\u9664\u7bc0\u9ede */\nfun remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur._val = tmp._val\n    }\n}\n
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{remove}\n
    binary_search_tree.zig
    // \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.?.val = tmp_val;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u8d70\u8a2a\u6709\u5e8f","text":"

    \u5982\u5716 7-22 \u6240\u793a\uff0c\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u8d70\u8a2a\u9806\u5e8f\uff0c\u800c\u4e8c\u5143\u641c\u5c0b\u6a39\u6eff\u8db3\u201c\u5de6\u5b50\u7bc0\u9ede \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u7bc0\u9ede\u201d\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

    \u9019\u610f\u5473\u8457\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u9032\u884c\u4e2d\u5e8f\u8d70\u8a2a\u6642\uff0c\u7e3d\u662f\u6703\u512a\u5148\u8d70\u8a2a\u4e0b\u4e00\u500b\u6700\u5c0f\u7bc0\u9ede\uff0c\u5f9e\u800c\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u6027\u8cea\uff1a\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

    \u5229\u7528\u4e2d\u5e8f\u8d70\u8a2a\u5347\u5e8f\u7684\u6027\u8cea\uff0c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u7372\u53d6\u6709\u5e8f\u8cc7\u6599\u50c5\u9700 \\(O(n)\\) \u6642\u9593\uff0c\u7121\u9808\u9032\u884c\u984d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

    \u5716 7-22 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217

    "},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387","text":"

    \u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528\u9663\u5217\u6216\u4e8c\u5143\u641c\u5c0b\u6a39\u5132\u5b58\u3002\u89c0\u5bdf\u8868 7-2 \uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u5404\u9805\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f\u5c0d\u6578\u968e\uff0c\u5177\u6709\u7a69\u5b9a\u4e14\u9ad8\u6548\u7684\u6548\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u983b\u65b0\u589e\u3001\u4f4e\u983b\u67e5\u8a62\u522a\u9664\u8cc7\u6599\u7684\u5834\u666f\u4e0b\uff0c\u9663\u5217\u6bd4\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387\u66f4\u9ad8\u3002

    \u8868 7-2 \u00a0 \u9663\u5217\u8207\u641c\u5c0b\u6a39\u7684\u6548\u7387\u5c0d\u6bd4

    \u7121\u5e8f\u9663\u5217 \u4e8c\u5143\u641c\u5c0b\u6a39 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

    \u5728\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f2a\u8ff4\u5708\u5167\u67e5\u8a62\u4efb\u610f\u7bc0\u9ede\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u4e0d\u65b7\u5730\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\uff0c\u53ef\u80fd\u5c0e\u81f4\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u5716 7-23 \u6240\u793a\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u9019\u6642\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u6703\u9000\u5316\u70ba \\(O(n)\\) \u3002

    \u5716 7-23 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316

    "},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u5e38\u898b\u61c9\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7d71\u4e2d\u7684\u591a\u7d1a\u7d22\u5f15\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u67e5\u8a62\u3001\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u70ba\u67d0\u4e9b\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002
    • \u7528\u65bc\u5132\u5b58\u8cc7\u6599\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72c0\u614b\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u5143\u6a39","text":"

    \u4e8c\u5143\u6a39\uff08binary tree\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u4e8c\u5143\u6a39\u7684\u57fa\u672c\u55ae\u5143\u662f\u7bc0\u9ede\uff0c\u6bcf\u500b\u7bc0\u9ede\u5305\u542b\u503c\u3001\u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\u548c\u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"\u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    int val;          // \u7bc0\u9ede\u503c\n    TreeNode *left;   // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode *right;  // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    int val;         // \u7bc0\u9ede\u503c\n    TreeNode left;   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u5efa\u69cb\u5b50 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n        Right: nil, // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n        Val:   v,   // \u7bc0\u9ede\u503c\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\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; // \u7bc0\u9ede\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\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\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct TreeNode {\n    int val;                // \u7bc0\u9ede\u503c\n    int height;             // \u7bc0\u9ede\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    struct TreeNode *right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\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\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    \n
    \n

    \u6bcf\u500b\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u5206\u5225\u6307\u5411\u5de6\u5b50\u7bc0\u9ede\uff08left-child node\uff09\u548c\u53f3\u5b50\u7bc0\u9ede\uff08right-child node\uff09\uff0c\u8a72\u7bc0\u9ede\u88ab\u7a31\u70ba\u9019\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff08parent node\uff09\u3002\u7576\u7d66\u5b9a\u4e00\u500b\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6642\uff0c\u6211\u5011\u5c07\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6a39\uff08right subtree\uff09\u3002

    \u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u9664\u8449\u7bc0\u9ede\u5916\uff0c\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\u90fd\u5305\u542b\u5b50\u7bc0\u9ede\u548c\u975e\u7a7a\u5b50\u6a39\u3002\u5982\u5716 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c07\u201c\u7bc0\u9ede 2\u201d\u8996\u70ba\u7236\u7bc0\u9ede\uff0c\u5247\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u5206\u5225\u662f\u201c\u7bc0\u9ede 4\u201d\u548c\u201c\u7bc0\u9ede 5\u201d\uff0c\u5de6\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 4 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\uff0c\u53f3\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 5 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\u3002

    \u5716 7-1 \u00a0 \u7236\u7bc0\u9ede\u3001\u5b50\u7bc0\u9ede\u3001\u5b50\u6a39

    "},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u5143\u6a39\u5e38\u898b\u8853\u8a9e","text":"

    \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e\u5982\u5716 7-2 \u6240\u793a\u3002

    • \u6839\u7bc0\u9ede\uff08root node\uff09\uff1a\u4f4d\u65bc\u4e8c\u5143\u6a39\u9802\u5c64\u7684\u7bc0\u9ede\uff0c\u6c92\u6709\u7236\u7bc0\u9ede\u3002
    • \u8449\u7bc0\u9ede\uff08leaf node\uff09\uff1a\u6c92\u6709\u5b50\u7bc0\u9ede\u7684\u7bc0\u9ede\uff0c\u5176\u5169\u500b\u6307\u6a19\u5747\u6307\u5411 None \u3002
    • \u908a\uff08edge\uff09\uff1a\u9023\u7dda\u5169\u500b\u7bc0\u9ede\u7684\u7dda\u6bb5\uff0c\u5373\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002
    • \u7bc0\u9ede\u6240\u5728\u7684\u5c64\uff08level\uff09\uff1a\u5f9e\u9802\u81f3\u5e95\u905e\u589e\uff0c\u6839\u7bc0\u9ede\u6240\u5728\u5c64\u70ba 1 \u3002
    • \u7bc0\u9ede\u7684\u5ea6\uff08degree\uff09\uff1a\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u7684\u6578\u91cf\u3002\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u7bc4\u570d\u662f 0\u30011\u30012 \u3002
    • \u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u6700\u9060\u8449\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
    • \u7bc0\u9ede\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
    • \u7bc0\u9ede\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u8ddd\u96e2\u8a72\u7bc0\u9ede\u6700\u9060\u7684\u8449\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002

    \u5716 7-2 \u00a0 \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e

    Tip

    \u8acb\u6ce8\u610f\uff0c\u6211\u5011\u901a\u5e38\u5c07\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u984c\u76ee\u6216\u6559\u6750\u53ef\u80fd\u6703\u5c07\u5176\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u7bc0\u9ede\u7684\u6578\u91cf\u201d\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\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\u5143\u6a39\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u5143\u6a39","text":"

    \u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u7bc0\u9ede\uff0c\u7136\u5f8c\u69cb\u5efa\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\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\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // \u521d\u59cb\u5316\u7bc0\u9ede\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede","text":"

    \u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u53ef\u4ee5\u900f\u904e\u4fee\u6539\u6307\u6a19\u4f86\u5be6\u73fe\u3002\u5716 7-3 \u7d66\u51fa\u4e86\u4e00\u500b\u793a\u4f8b\u3002

    \u5716 7-3 \u00a0 \u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = p\np.left = n2\n# \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.cpp
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.cs
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.go
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.js
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.ts
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.dart
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u522a\u9664\u7bc0\u9ede p\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Note

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u7bc0\u9ede\u53ef\u80fd\u6703\u6539\u8b8a\u4e8c\u5143\u6a39\u7684\u539f\u6709\u908f\u8f2f\u7d50\u69cb\uff0c\u800c\u522a\u9664\u7bc0\u9ede\u901a\u5e38\u610f\u5473\u8457\u522a\u9664\u8a72\u7bc0\u9ede\u53ca\u5176\u6240\u6709\u5b50\u6a39\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u63d2\u5165\u8207\u522a\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5be6\u73fe\u6709\u5be6\u969b\u610f\u7fa9\u7684\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u898b\u4e8c\u5143\u6a39\u578b\u5225","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff08perfect binary tree\uff09\u6240\u6709\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u5b8c\u5168\u586b\u6eff\u3002\u5728\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\uff0c\u8449\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u7684\u5ea6\u90fd\u70ba \\(2\\) \uff1b\u82e5\u6a39\u7684\u9ad8\u5ea6\u70ba \\(h\\) \uff0c\u5247\u7bc0\u9ede\u7e3d\u6578\u70ba \\(2^{h+1} - 1\\) \uff0c\u5448\u73fe\u6a19\u6e96\u7684\u6307\u6578\u7d1a\u95dc\u4fc2\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u898b\u7684\u7d30\u80de\u5206\u88c2\u73fe\u8c61\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u7fa4\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u5e38\u88ab\u7a31\u70ba\u6eff\u4e8c\u5143\u6a39\u3002

    \u5716 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c64\u7684\u7bc0\u9ede\u672a\u88ab\u586b\u6eff\uff0c\u4e14\u6700\u5e95\u5c64\u7bc0\u9ede\u5118\u91cf\u9760\u5de6\u586b\u5145\u3002

    \u5716 7-5 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-6 \u6240\u793a\uff0c\u5b8c\u6eff\u4e8c\u5143\u6a39\uff08full binary tree\uff09\u9664\u4e86\u8449\u7bc0\u9ede\u4e4b\u5916\uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5b50\u7bc0\u9ede\u3002

    \u5716 7-6 \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u5143\u6a39\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7d55\u5c0d\u503c\u4e0d\u8d85\u904e 1 \u3002

    \u5716 7-7 \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u5143\u6a39\u7684\u9000\u5316","text":"

    \u5716 7-8 \u5c55\u793a\u4e86\u4e8c\u5143\u6a39\u7684\u7406\u60f3\u7d50\u69cb\u8207\u9000\u5316\u7d50\u69cb\u3002\u7576\u4e8c\u5143\u6a39\u7684\u6bcf\u5c64\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u6642\uff0c\u9054\u5230\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff1b\u800c\u7576\u6240\u6709\u7bc0\u9ede\u90fd\u504f\u5411\u4e00\u5074\u6642\uff0c\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u201c\u93c8\u7d50\u4e32\u5217\u201d\u3002

    • \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u7406\u60f3\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5145\u5206\u767c\u63ee\u4e8c\u5143\u6a39\u201c\u5206\u6cbb\u201d\u7684\u512a\u52e2\u3002
    • \u93c8\u7d50\u4e32\u5217\u5247\u662f\u53e6\u4e00\u500b\u6975\u7aef\uff0c\u5404\u9805\u64cd\u4f5c\u90fd\u8b8a\u70ba\u7dda\u6027\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u5716 7-8 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

    \u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7d50\u69cb\u548c\u6700\u5dee\u7d50\u69cb\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf\u3001\u7bc0\u9ede\u7e3d\u6578\u3001\u9ad8\u5ea6\u7b49\u9054\u5230\u6975\u5927\u503c\u6216\u6975\u5c0f\u503c\u3002

    \u8868 7-1 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

    \u5b8c\u7f8e\u4e8c\u5143\u6a39 \u93c8\u7d50\u4e32\u5217 \u7b2c \\(i\\) \u5c64\u7684\u7bc0\u9ede\u6578\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u7bc0\u9ede\u7e3d\u6578 \\(2^{h+1} - 1\\) \\(h + 1\\) \u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \u7684\u6a39\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a","text":"

    \u5f9e\u7269\u7406\u7d50\u69cb\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u6a39\u662f\u4e00\u7a2e\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u56e0\u6b64\u5176\u8d70\u8a2a\u65b9\u5f0f\u662f\u900f\u904e\u6307\u6a19\u9010\u500b\u8a2a\u554f\u7bc0\u9ede\u3002\u7136\u800c\uff0c\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9019\u4f7f\u5f97\u8d70\u8a2a\u6a39\u6bd4\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u66f4\u52a0\u8907\u96dc\uff0c\u9700\u8981\u85c9\u52a9\u641c\u5c0b\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u3002

    \u4e8c\u5143\u6a39\u5e38\u898b\u7684\u8d70\u8a2a\u65b9\u5f0f\u5305\u62ec\u5c64\u5e8f\u8d70\u8a2a\u3001\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c64\u5e8f\u8d70\u8a2a","text":"

    \u5982\u5716 7-9 \u6240\u793a\uff0c\u5c64\u5e8f\u8d70\u8a2a\uff08level-order traversal\uff09\u5f9e\u9802\u90e8\u5230\u5e95\u90e8\u9010\u5c64\u8d70\u8a2a\u4e8c\u5143\u6a39\uff0c\u4e26\u5728\u6bcf\u4e00\u5c64\u6309\u7167\u5f9e\u5de6\u5230\u53f3\u7684\u9806\u5e8f\u8a2a\u554f\u7bc0\u9ede\u3002

    \u5c64\u5e8f\u8d70\u8a2a\u672c\u8cea\u4e0a\u5c6c\u65bc\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\uff08breadth-first traversal\uff09\uff0c\u4e5f\u7a31\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\u3002

    \u5716 7-9 \u00a0 \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a

    "},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u901a\u5e38\u85c9\u52a9\u201c\u4f47\u5217\u201d\u4f86\u5be6\u73fe\u3002\u4f47\u5217\u9075\u5faa\u201c\u5148\u9032\u5148\u51fa\u201d\u7684\u898f\u5247\uff0c\u800c\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5247\u9075\u5faa\u201c\u9010\u5c64\u63a8\u9032\u201d\u7684\u898f\u5247\uff0c\u5169\u8005\u80cc\u5f8c\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n    # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u968a\u5217\u51fa\u968a\n        res.append(node.val)  # \u5132\u5b58\u7bc0\u9ede\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    return res\n
    binary_tree_bfs.cpp
    /* \u5c64\u5e8f\u8d70\u8a2a */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u968a\u5217\u51fa\u968a\n        vec.push_back(node->val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return vec;\n}\n
    binary_tree_bfs.java
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u968a\u5217\u51fa\u968a\n        list.add(node.val);           // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.cs
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u968a\u5217\u51fa\u968a\n        list.Add(node.val!.Value);       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.go
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u5207\u7247\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u968a\u5217\u51fa\u968a\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
    binary_tree_bfs.swift
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u968a\u5217\u51fa\u968a\n        list.append(node.val) // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list\n}\n
    binary_tree_bfs.js
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.ts
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list;\n}\n
    binary_tree_bfs.dart
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u968a\u5217\u51fa\u968a\n    res.add(node!.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  }\n  return res;\n}\n
    binary_tree_bfs.rs
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u968a\u5217\u51fa\u968a\n        vec.push(node.borrow().val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        };\n    }\n    vec\n}\n
    binary_tree_bfs.c
    /* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f14\u52a9\u4f47\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f14\u52a9\u4f47\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u4f47\u5217\u6307\u6a19\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u7bc0\u9ede\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    /* \u8f14\u52a9\u9663\u5217 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u9663\u5217\u6307\u6a19\n    index = 0;\n    while (front < rear) {\n        // \u968a\u5217\u51fa\u968a\n        node = queue[front++];\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u9663\u5217\u9577\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91cb\u653e\u8f14\u52a9\u9663\u5217\u7a7a\u9593\n    free(queue);\n    return arr;\n}\n
    binary_tree_bfs.kt
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u968a\u5217\u51fa\u968a\n        list.add(node?._val!!)       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list\n}\n
    binary_tree_bfs.rb
    [class]{}-[func]{level_order}\n
    binary_tree_bfs.zig
    // \u5c64\u5e8f\u8d70\u8a2a\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\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\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u968a\u5217\u51fa\u968a\n        var node = queue_node.data;\n        try list.append(node.val);              // \u5132\u5b58\u7bc0\u9ede\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\u7bc0\u9ede\u5165\u5217\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\u7bc0\u9ede\u5165\u5217\n        }        \n    }\n    return list;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff0c\u5176\u4e2d \\(n\\) \u70ba\u7bc0\u9ede\u6578\u91cf\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6eff\u4e8c\u5143\u6a39\u6642\uff0c\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u6700\u591a\u540c\u6642\u5b58\u5728 \\((n + 1) / 2\\) \u500b\u7bc0\u9ede\uff0c\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\u3002
    "},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a","text":"

    \u76f8\u61c9\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\uff08depth-first traversal\uff09\uff0c\u4e5f\u7a31\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff08depth-first search, DFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002

    \u5716 7-10 \u5c55\u793a\u4e86\u5c0d\u4e8c\u5143\u6a39\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5c31\u50cf\u662f\u7e5e\u8457\u6574\u68f5\u4e8c\u5143\u6a39\u7684\u5916\u570d\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u500b\u7bc0\u9ede\u90fd\u6703\u9047\u5230\u4e09\u500b\u4f4d\u7f6e\uff0c\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u3002

    \u5716 7-10 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a

    "},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
    def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\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\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\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    \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
    binary_tree_dfs.cpp
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
    binary_tree_dfs.java
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
    binary_tree_dfs.cs
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
    binary_tree_dfs.go
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
    binary_tree_dfs.swift
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
    binary_tree_dfs.js
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.ts
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.dart
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
    binary_tree_dfs.rs
    /* \u524d\u5e8f\u8d70\u8a2a */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\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\u8d70\u8a2a */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\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/* \u5f8c\u5e8f\u8d70\u8a2a */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\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\u8d70\u8a2a */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
    binary_tree_dfs.kt
    /* \u524d\u5e8f\u8d70\u8a2a */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
    binary_tree_dfs.rb
    [class]{}-[func]{pre_order}\n\n[class]{}-[func]{in_order}\n\n[class]{}-[func]{post_order}\n
    binary_tree_dfs.zig
    // \u524d\u5e8f\u8d70\u8a2a\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u8d70\u8a2a\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u5f8c\u5e8f\u8d70\u8a2a\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4e5f\u53ef\u4ee5\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

    \u5716 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u8d70\u8a2a\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5176\u53ef\u5206\u70ba\u201c\u905e\u201d\u548c\u201c\u8ff4\u201d\u5169\u500b\u9006\u5411\u7684\u90e8\u5206\u3002

    1. \u201c\u905e\u201d\u8868\u793a\u958b\u555f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5f0f\u5728\u6b64\u904e\u7a0b\u4e2d\u8a2a\u554f\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002
    2. \u201c\u8ff4\u201d\u8868\u793a\u51fd\u5f0f\u8fd4\u56de\uff0c\u4ee3\u8868\u7576\u524d\u7bc0\u9ede\u5df2\u7d93\u8a2a\u554f\u5b8c\u7562\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5716 7-11 \u00a0 \u524d\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u904e\u7a0b

    "},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u7cfb\u7d71\u4f54\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u4e8c\u5143\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9ad4\u73fe\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u6bcf\u500b\u4e8c\u5143\u6a39\u7bc0\u9ede\u5305\u542b\u4e00\u500b\u503c\u4ee5\u53ca\u5169\u500b\u6307\u6a19\uff0c\u5206\u5225\u6307\u5411\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u3002
    • \u5c0d\u65bc\u4e8c\u5143\u6a39\u4e2d\u7684\u67d0\u500b\u7bc0\u9ede\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6a39\u88ab\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6a39\u3002
    • \u4e8c\u5143\u6a39\u7684\u76f8\u95dc\u8853\u8a9e\u5305\u62ec\u6839\u7bc0\u9ede\u3001\u8449\u7bc0\u9ede\u3001\u5c64\u3001\u5ea6\u3001\u908a\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
    • \u4e8c\u5143\u6a39\u7684\u521d\u59cb\u5316\u3001\u7bc0\u9ede\u63d2\u5165\u548c\u7bc0\u9ede\u522a\u9664\u64cd\u4f5c\u8207\u93c8\u7d50\u4e32\u5217\u64cd\u4f5c\u65b9\u6cd5\u985e\u4f3c\u3002
    • \u5e38\u898b\u7684\u4e8c\u5143\u6a39\u578b\u5225\u6709\u5b8c\u7f8e\u4e8c\u5143\u6a39\u3001\u5b8c\u5168\u4e8c\u5143\u6a39\u3001\u5b8c\u6eff\u4e8c\u5143\u6a39\u548c\u5e73\u8861\u4e8c\u5143\u6a39\u3002\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u6700\u7406\u60f3\u7684\u72c0\u614b\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u9000\u5316\u5f8c\u7684\u6700\u5dee\u72c0\u614b\u3002
    • \u4e8c\u5143\u6a39\u53ef\u4ee5\u7528\u9663\u5217\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c07\u7bc0\u9ede\u503c\u548c\u7a7a\u4f4d\u6309\u5c64\u5e8f\u8d70\u8a2a\u9806\u5e8f\u6392\u5217\uff0c\u4e26\u6839\u64da\u7236\u7bc0\u9ede\u8207\u5b50\u7bc0\u9ede\u4e4b\u9593\u7684\u7d22\u5f15\u5c0d\u6620\u95dc\u4fc2\u4f86\u5be6\u73fe\u6307\u6a19\u3002
    • \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a\u662f\u4e00\u7a2e\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u65b9\u6cd5\uff0c\u5b83\u9ad4\u73fe\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u900f\u904e\u4f47\u5217\u4f86\u5be6\u73fe\u3002
    • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u7686\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u5b83\u5011\u9ad4\u73fe\u4e86\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
    • \u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u4e00\u7a2e\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \u3002\u7576\u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u5404\u9805\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • AVL \u6a39\uff0c\u4e5f\u7a31\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5b83\u900f\u904e\u65cb\u8f49\u64cd\u4f5c\u78ba\u4fdd\u5728\u4e0d\u65b7\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\u6a39\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
    • AVL \u6a39\u7684\u65cb\u8f49\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\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u6703\u5f9e\u5e95\u5411\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5c0d\u65bc\u53ea\u6709\u4e00\u500b\u7bc0\u9ede\u7684\u4e8c\u5143\u6a39\uff0c\u6a39\u7684\u9ad8\u5ea6\u548c\u6839\u7bc0\u9ede\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u55ce\uff1f

    \u662f\u7684\uff0c\u56e0\u70ba\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\u3002

    Q\uff1a\u4e8c\u5143\u6a39\u4e2d\u7684\u63d2\u5165\u8207\u522a\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u9019\u88e1\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u9ebc\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u70ba\u8cc7\u6e90\u7684\u5b50\u7bc0\u9ede\u7684\u8cc7\u6e90\u91cb\u653e\u55ce\uff1f

    \u62ff\u4e8c\u5143\u641c\u5c0b\u6a39\u4f86\u8209\u4f8b\uff0c\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u8981\u5206\u4e09\u7a2e\u60c5\u6cc1\u8655\u7406\uff0c\u5176\u4e2d\u6bcf\u7a2e\u60c5\u6cc1\u90fd\u9700\u8981\u9032\u884c\u591a\u500b\u6b65\u9a5f\u7684\u7bc0\u9ede\u64cd\u4f5c\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc DFS \u8d70\u8a2a\u4e8c\u5143\u6a39\u6709\u524d\u3001\u4e2d\u3001\u5f8c\u4e09\u7a2e\u9806\u5e8f\uff0c\u5206\u5225\u6709\u4ec0\u9ebc\u7528\u5462\uff1f

    \u8207\u9806\u5e8f\u548c\u9006\u5e8f\u8d70\u8a2a\u9663\u5217\u985e\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u662f\u4e09\u7a2e\u4e8c\u5143\u6a39\u8d70\u8a2a\u65b9\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5b83\u5011\u5f97\u5230\u4e00\u500b\u7279\u5b9a\u9806\u5e8f\u7684\u8d70\u8a2a\u7d50\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\uff0c\u7531\u65bc\u7bc0\u9ede\u5927\u5c0f\u6eff\u8db3 \u5de6\u5b50\u7bc0\u9ede\u503c < \u6839\u7bc0\u9ede\u503c < \u53f3\u5b50\u7bc0\u9ede\u503c \uff0c\u56e0\u6b64\u6211\u5011\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u512a\u5148\u9806\u5e8f\u8d70\u8a2a\u6a39\uff0c\u5c31\u53ef\u4ee5\u7372\u5f97\u6709\u5e8f\u7684\u7bc0\u9ede\u5e8f\u5217\u3002

    Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u8655\u7406\u5931\u8861\u7bc0\u9ede node\u3001child\u3001grand_child \u4e4b\u9593\u7684\u95dc\u4fc2\uff0c\u90a3 node \u7684\u7236\u7bc0\u9ede\u548c node \u539f\u4f86\u7684\u9023\u7dda\u4e0d\u9700\u8981\u7dad\u8b77\u55ce\uff1f\u53f3\u65cb\u64cd\u4f5c\u5f8c\u8c48\u4e0d\u662f\u65b7\u6389\u4e86\uff1f

    \u6211\u5011\u9700\u8981\u5f9e\u905e\u8ff4\u7684\u8996\u89d2\u4f86\u770b\u9019\u500b\u554f\u984c\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u50b3\u5165\u7684\u662f\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u6700\u7d42 return child \u8fd4\u56de\u65cb\u8f49\u4e4b\u5f8c\u7684\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u548c\u5176\u7236\u7bc0\u9ede\u7684\u9023\u7dda\u662f\u5728\u8a72\u51fd\u5f0f\u8fd4\u56de\u5f8c\u5b8c\u6210\u7684\uff0c\u4e0d\u5c6c\u65bc\u53f3\u65cb\u64cd\u4f5c\u7684\u7dad\u8b77\u7bc4\u570d\u3002

    Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u5f0f\u88ab\u5283\u5206\u5230 private \u548c public \u4e2d\uff0c\u9019\u65b9\u9762\u6709\u4ec0\u9ebc\u8003\u91cf\u55ce\uff1f\u70ba\u4ec0\u9ebc\u8981\u5c07 height() \u51fd\u5f0f\u548c updateHeight() \u51fd\u5f0f\u5206\u5225\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

    \u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u7bc4\u570d\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u985e\u5225\u5167\u90e8\u4f7f\u7528\uff0c\u90a3\u9ebc\u5c31\u8a2d\u8a08\u70ba private \u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u8005\u55ae\u7368\u547c\u53eb updateHeight() \u662f\u6c92\u6709\u610f\u7fa9\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8a2a\u554f\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u985e\u4f3c\u65bc vector.size() \uff0c\u56e0\u6b64\u8a2d\u5b9a\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

    Q\uff1a\u5982\u4f55\u5f9e\u4e00\u7d44\u8f38\u5165\u8cc7\u6599\u69cb\u5efa\u4e00\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\uff1f\u6839\u7bc0\u9ede\u7684\u9078\u64c7\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

    \u662f\u7684\uff0c\u69cb\u5efa\u6a39\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7a0b\u5f0f\u78bc\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7d66\u51fa\u3002\u81f3\u65bc\u6839\u7bc0\u9ede\u7684\u9078\u64c7\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u8f38\u5165\u8cc7\u6599\u6392\u5e8f\uff0c\u7136\u5f8c\u5c07\u4e2d\u9ede\u5143\u7d20\u4f5c\u70ba\u6839\u7bc0\u9ede\uff0c\u518d\u905e\u8ff4\u5730\u69cb\u5efa\u5de6\u53f3\u5b50\u6a39\u3002\u9019\u6a23\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8b49\u6a39\u7684\u5e73\u8861\u6027\u3002

    Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u4e32\u5c0d\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

    \u5728 Java \u4e2d\uff0c\u5c0d\u65bc\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c== \u7528\u65bc\u5c0d\u6bd4\u5169\u500b\u8b8a\u6578\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5c0d\u65bc\u5f15\u7528\u578b\u5225\uff0c\u5169\u7a2e\u7b26\u865f\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

    • == \uff1a\u7528\u4f86\u6bd4\u8f03\u5169\u500b\u8b8a\u6578\u662f\u5426\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u5373\u5b83\u5011\u5728\u8a18\u61b6\u9ad4\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
    • equals()\uff1a\u7528\u4f86\u5c0d\u6bd4\u5169\u500b\u7269\u4ef6\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

    \u56e0\u6b64\uff0c\u5982\u679c\u8981\u5c0d\u6bd4\u503c\uff0c\u6211\u5011\u61c9\u8a72\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u900f\u904e String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u4e32\u90fd\u5132\u5b58\u5728\u5b57\u4e32\u5e38\u6578\u6c60\u4e2d\uff0c\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u4f86\u6bd4\u8f03\u5169\u500b\u5b57\u4e32\u7684\u5167\u5bb9\u3002

    Q\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u7684\u7bc0\u9ede\u6578\u91cf\u662f \\(2^h\\) \u55ce\uff1f

    \u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6eff\u4e8c\u5143\u6a39\uff0c\u5176\u7bc0\u9ede\u7e3d\u6578 \\(n = 7\\) \uff0c\u5247\u5e95\u5c64\u7bc0\u9ede\u6578\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\u9304","text":""},{"location":"chapter_appendix/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd
    • 16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c
    • 16.3 \u00a0 \u8853\u8a9e\u8868
    "},{"location":"chapter_appendix/contribution/","title":"16.2 \u00a0 \u4e00\u8d77\u53c3\u8207\u5275\u4f5c","text":"

    \u7531\u65bc\u7b46\u8005\u80fd\u529b\u6709\u9650\uff0c\u66f8\u4e2d\u96e3\u514d\u5b58\u5728\u4e00\u4e9b\u907a\u6f0f\u548c\u932f\u8aa4\uff0c\u8acb\u60a8\u8ad2\u89e3\u3002\u5982\u679c\u60a8\u767c\u73fe\u4e86\u7b46\u8aa4\u3001\u9023\u7d50\u5931\u6548\u3001\u5167\u5bb9\u7f3a\u5931\u3001\u6587\u5b57\u6b67\u7fa9\u3001\u89e3\u91cb\u4e0d\u6e05\u6670\u6216\u884c\u6587\u7d50\u69cb\u4e0d\u5408\u7406\u7b49\u554f\u984c\uff0c\u8acb\u5354\u52a9\u6211\u5011\u9032\u884c\u4fee\u6b63\uff0c\u4ee5\u7d66\u8b80\u8005\u63d0\u4f9b\u66f4\u512a\u8cea\u7684\u5b78\u7fd2\u8cc7\u6e90\u3002

    \u6240\u6709\u64b0\u7a3f\u4eba\u7684 GitHub ID \u5c07\u5728\u672c\u66f8\u5009\u5eab\u3001\u7db2\u9801\u7248\u548c PDF \u7248\u7684\u4e3b\u9801\u4e0a\u9032\u884c\u5c55\u793a\uff0c\u4ee5\u611f\u8b1d\u4ed6\u5011\u5c0d\u958b\u6e90\u793e\u7fa4\u7684\u7121\u79c1\u5949\u737b\u3002

    \u958b\u6e90\u7684\u9b45\u529b

    \u7d19\u8cea\u5716\u66f8\u7684\u5169\u6b21\u5370\u5237\u7684\u9593\u9694\u6642\u9593\u5f80\u5f80\u8f03\u4e45\uff0c\u5167\u5bb9\u66f4\u65b0\u975e\u5e38\u4e0d\u65b9\u4fbf\u3002

    \u800c\u5728\u672c\u958b\u6e90\u66f8\u4e2d\uff0c\u5167\u5bb9\u66f4\u8fed\u7684\u6642\u9593\u88ab\u7e2e\u77ed\u81f3\u6578\u65e5\u751a\u81f3\u5e7e\u500b\u5c0f\u6642\u3002

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

    \u5982\u5716 16-3 \u6240\u793a\uff0c\u6bcf\u500b\u9801\u9762\u7684\u53f3\u4e0a\u89d2\u90fd\u6709\u201c\u7de8\u8f2f\u5716\u793a\u201d\u3002\u60a8\u53ef\u4ee5\u6309\u7167\u4ee5\u4e0b\u6b65\u9a5f\u4fee\u6539\u6587\u5b57\u6216\u7a0b\u5f0f\u78bc\u3002

    1. \u9ede\u9078\u201c\u7de8\u8f2f\u5716\u793a\u201d\uff0c\u5982\u679c\u9047\u5230\u201c\u9700\u8981 Fork \u6b64\u5009\u5eab\u201d\u7684\u63d0\u793a\uff0c\u8acb\u540c\u610f\u8a72\u64cd\u4f5c\u3002
    2. \u4fee\u6539 Markdown \u6e90\u6a94\u6848\u5167\u5bb9\uff0c\u6aa2\u67e5\u5167\u5bb9\u7684\u6b63\u78ba\u6027\uff0c\u4e26\u5118\u91cf\u4fdd\u6301\u6392\u7248\u683c\u5f0f\u7684\u7d71\u4e00\u3002
    3. \u5728\u9801\u9762\u5e95\u90e8\u586b\u5beb\u4fee\u6539\u8aaa\u660e\uff0c\u7136\u5f8c\u9ede\u9078\u201cPropose file change\u201d\u6309\u9215\u3002\u9801\u9762\u8df3\u8f49\u5f8c\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002

    \u5716 16-3 \u00a0 \u9801\u9762\u7de8\u8f2f\u6309\u9375

    \u5716\u7247\u7121\u6cd5\u76f4\u63a5\u4fee\u6539\uff0c\u9700\u8981\u900f\u904e\u65b0\u5efa Issue \u6216\u8a55\u8ad6\u7559\u8a00\u4f86\u63cf\u8ff0\u554f\u984c\uff0c\u6211\u5011\u6703\u76e1\u5feb\u91cd\u65b0\u7e6a\u88fd\u4e26\u66ff\u63db\u5716\u7247\u3002

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

    \u5982\u679c\u60a8\u6709\u8208\u8da3\u53c3\u8207\u6b64\u958b\u6e90\u5c08\u6848\uff0c\u5305\u62ec\u5c07\u7a0b\u5f0f\u78bc\u7ffb\u8b6f\u6210\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u3001\u64f4\u5c55\u6587\u7ae0\u5167\u5bb9\u7b49\uff0c\u90a3\u9ebc\u9700\u8981\u5be6\u65bd\u4ee5\u4e0b Pull Request \u5de5\u4f5c\u6d41\u7a0b\u3002

    1. \u767b\u5165 GitHub \uff0c\u5c07\u672c\u66f8\u7684\u7a0b\u5f0f\u78bc\u5009\u5eab Fork \u5230\u500b\u4eba\u5e33\u865f\u4e0b\u3002
    2. \u9032\u5165\u60a8\u7684 Fork \u5009\u5eab\u7db2\u9801\uff0c\u4f7f\u7528 git clone \u547d\u4ee4\u5c07\u5009\u5eab\u514b\u9686\u81f3\u672c\u5730\u3002
    3. \u5728\u672c\u5730\u9032\u884c\u5167\u5bb9\u5275\u4f5c\uff0c\u4e26\u9032\u884c\u5b8c\u6574\u6e2c\u8a66\uff0c\u9a57\u8b49\u7a0b\u5f0f\u78bc\u7684\u6b63\u78ba\u6027\u3002
    4. \u5c07\u672c\u5730\u6240\u505a\u66f4\u6539 Commit \uff0c\u7136\u5f8c Push \u81f3\u9060\u7aef\u5009\u5eab\u3002
    5. \u91cd\u65b0\u6574\u7406\u5009\u5eab\u7db2\u9801\uff0c\u9ede\u9078\u201cCreate pull request\u201d\u6309\u9215\u5373\u53ef\u767c\u8d77\u62c9\u53d6\u8acb\u6c42\u3002
    "},{"location":"chapter_appendix/contribution/#3-docker","title":"3. \u00a0 Docker \u90e8\u7f72","text":"

    \u5728 hello-algo \u6839\u76ee\u9304\u4e0b\uff0c\u57f7\u884c\u4ee5\u4e0b Docker \u6307\u4ee4\u78bc\uff0c\u5373\u53ef\u5728 http://localhost:8000 \u8a2a\u554f\u672c\u5c08\u6848\uff1a

    docker-compose up -d\n

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

    docker-compose down\n
    "},{"location":"chapter_appendix/installation/","title":"16.1 \u00a0 \u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u5b89\u88dd","text":""},{"location":"chapter_appendix/installation/#1611-ide","title":"16.1.1 \u00a0 \u5b89\u88dd IDE","text":"

    \u63a8\u85a6\u4f7f\u7528\u958b\u6e90\u3001\u8f15\u91cf\u7684 VS Code \u4f5c\u70ba\u672c\u5730\u6574\u5408\u958b\u767c\u74b0\u5883\uff08IDE\uff09\u3002\u8a2a\u554f VS Code \u5b98\u7db2\uff0c\u6839\u64da\u4f5c\u696d\u7cfb\u7d71\u9078\u64c7\u76f8\u61c9\u7248\u672c\u7684 VS Code \u9032\u884c\u4e0b\u8f09\u548c\u5b89\u88dd\u3002

    \u5716 16-1 \u00a0 \u5f9e\u5b98\u7db2\u4e0b\u8f09 VS Code

    VS Code \u64c1\u6709\u5f37\u5927\u7684\u64f4\u5c55\u5305\u751f\u614b\u7cfb\u7d71\uff0c\u652f\u6301\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u7684\u57f7\u884c\u548c\u9664\u932f\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5b89\u88dd\u201cPython Extension Pack\u201d\u64f4\u5c55\u5305\u4e4b\u5f8c\uff0c\u5373\u53ef\u9032\u884c Python \u7a0b\u5f0f\u78bc\u9664\u932f\u3002\u5b89\u88dd\u6b65\u9a5f\u5982\u5716 16-2 \u6240\u793a\u3002

    \u5716 16-2 \u00a0 \u5b89\u88dd VS Code \u64f4\u5c55\u5305

    "},{"location":"chapter_appendix/installation/#1612","title":"16.1.2 \u00a0 \u5b89\u88dd\u8a9e\u8a00\u74b0\u5883","text":""},{"location":"chapter_appendix/installation/#1-python","title":"1. \u00a0 Python \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Miniconda3 \uff0c\u9700\u8981 Python 3.10 \u6216\u66f4\u65b0\u7248\u672c\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 python \uff0c\u5b89\u88dd Python Extension Pack \u3002
    3. \uff08\u53ef\u9078\uff09\u5728\u547d\u4ee4\u5217\u8f38\u5165 pip install black \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#2-cc","title":"2. \u00a0 C/C++ \u74b0\u5883","text":"
    1. Windows \u7cfb\u7d71\u9700\u8981\u5b89\u88dd MinGW\uff08\u914d\u7f6e\u6559\u7a0b\uff09\uff1bMacOS \u81ea\u5e36 Clang \uff0c\u7121\u9808\u5b89\u88dd\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 c++ \uff0c\u5b89\u88dd C/C++ Extension Pack \u3002
    3. \uff08\u53ef\u9078\uff09\u958b\u555f Settings \u9801\u9762\uff0c\u641c\u5c0b Clang_format_fallback Style \u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u9078\u9805\uff0c\u8a2d\u5b9a\u70ba { BasedOnStyle: Microsoft, BreakBeforeBraces: Attach } \u3002
    "},{"location":"chapter_appendix/installation/#3-java","title":"3. \u00a0 Java \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd OpenJDK\uff08\u7248\u672c\u9700\u6eff\u8db3 > JDK 9\uff09\u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 java \uff0c\u5b89\u88dd Extension Pack for Java \u3002
    "},{"location":"chapter_appendix/installation/#4-c","title":"4. \u00a0 C# \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd .Net 8.0 \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 C# Dev Kit \uff0c\u5b89\u88dd C# Dev Kit \uff08\u914d\u7f6e\u6559\u7a0b\uff09\u3002
    3. \u4e5f\u53ef\u4f7f\u7528 Visual Studio\uff08\u5b89\u88dd\u6559\u7a0b\uff09\u3002
    "},{"location":"chapter_appendix/installation/#5-go","title":"5. \u00a0 Go \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd go \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 go \uff0c\u5b89\u88dd Go \u3002
    3. \u6309\u5feb\u6377\u9375 Ctrl + Shift + P \u64a5\u51fa\u547d\u4ee4\u6b04\uff0c\u8f38\u5165 go \uff0c\u9078\u64c7 Go: Install/Update Tools \uff0c\u5168\u90e8\u52fe\u9078\u4e26\u5b89\u88dd\u5373\u53ef\u3002
    "},{"location":"chapter_appendix/installation/#6-swift","title":"6. \u00a0 Swift \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Swift \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 swift \uff0c\u5b89\u88dd Swift for Visual Studio Code \u3002
    "},{"location":"chapter_appendix/installation/#7-javascript","title":"7. \u00a0 JavaScript \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Node.js \u3002
    2. \uff08\u53ef\u9078\uff09\u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 Prettier \uff0c\u5b89\u88dd\u7a0b\u5f0f\u78bc\u683c\u5f0f\u5316\u5de5\u5177\u3002
    "},{"location":"chapter_appendix/installation/#8-typescript","title":"8. \u00a0 TypeScript \u74b0\u5883","text":"
    1. \u540c JavaScript \u74b0\u5883\u5b89\u88dd\u6b65\u9a5f\u3002
    2. \u5b89\u88dd TypeScript Execute (tsx) \u3002
    3. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 typescript \uff0c\u5b89\u88dd Pretty TypeScript Errors \u3002
    "},{"location":"chapter_appendix/installation/#9-dart","title":"9. \u00a0 Dart \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Dart \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 dart \uff0c\u5b89\u88dd Dart \u3002
    "},{"location":"chapter_appendix/installation/#10-rust","title":"10. \u00a0 Rust \u74b0\u5883","text":"
    1. \u4e0b\u8f09\u4e26\u5b89\u88dd Rust \u3002
    2. \u5728 VS Code \u7684\u64f4\u5145\u529f\u80fd\u5e02\u5834\u4e2d\u641c\u7d22 rust \uff0c\u5b89\u88dd rust-analyzer \u3002
    "},{"location":"chapter_appendix/terminology/","title":"16.3 \u00a0 \u8853\u8a9e\u8868","text":"

    \u8868 16-1 \u5217\u51fa\u4e86\u66f8\u4e2d\u51fa\u73fe\u7684\u91cd\u8981\u8853\u8a9e\uff0c\u503c\u5f97\u6ce8\u610f\u4ee5\u4e0b\u5e7e\u9ede\u3002

    • \u5efa\u8b70\u8a18\u4f4f\u540d\u8a5e\u7684\u82f1\u6587\u53eb\u6cd5\uff0c\u4ee5\u4fbf\u95b1\u8b80\u82f1\u6587\u6587\u737b\u3002
    • \u90e8\u5206\u540d\u8a5e\u5728\u7c21\u9ad4\u4e2d\u6587\u548c\u7e41\u9ad4\u4e2d\u6587\u4e0b\u7684\u53eb\u6cd5\u4e0d\u540c\u3002

    \u8868 16-1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u91cd\u8981\u540d\u8a5e

    English \u7c21\u9ad4\u4e2d\u6587 \u7e41\u9ad4\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 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 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217","text":"

    Abstract

    \u8cc7\u6599\u7d50\u69cb\u7684\u4e16\u754c\u5982\u540c\u4e00\u5835\u539a\u5be6\u7684\u78da\u7246\u3002

    \u9663\u5217\u7684\u78da\u584a\u6574\u9f4a\u6392\u5217\uff0c\u9010\u500b\u7dca\u8cbc\u3002\u93c8\u7d50\u4e32\u5217\u7684\u78da\u584a\u5206\u6563\u5404\u8655\uff0c\u9023\u7dda\u7684\u85e4\u8513\u81ea\u7531\u5730\u7a7f\u68ad\u65bc\u78da\u7e2b\u4e4b\u9593\u3002

    "},{"location":"chapter_array_and_linkedlist/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 4.1 \u00a0 \u9663\u5217
    • 4.2 \u00a0 \u93c8\u7d50\u4e32\u5217
    • 4.3 \u00a0 \u4e32\u5217
    • 4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *
    • 4.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_array_and_linkedlist/array/","title":"4.1 \u00a0 \u9663\u5217","text":"

    \u9663\u5217\uff08array\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5c07\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\u3002\u6211\u5011\u5c07\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u4f4d\u7f6e\u7a31\u70ba\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff08index\uff09\u3002\u5716 4-1 \u5c55\u793a\u4e86\u9663\u5217\u7684\u4e3b\u8981\u6982\u5ff5\u548c\u5132\u5b58\u65b9\u5f0f\u3002

    \u5716 4-1 \u00a0 \u9663\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

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

    \u6211\u5011\u53ef\u4ee5\u6839\u64da\u9700\u6c42\u9078\u7528\u9663\u5217\u7684\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u5f0f\uff1a\u7121\u521d\u59cb\u503c\u3001\u7d66\u5b9a\u521d\u59cb\u503c\u3002\u5728\u672a\u6307\u5b9a\u521d\u59cb\u503c\u7684\u60c5\u6cc1\u4e0b\uff0c\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u6703\u5c07\u9663\u5217\u5143\u7d20\u521d\u59cb\u5316\u70ba \\(0\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    # \u521d\u59cb\u5316\u9663\u5217\narr: list[int] = [0] * 5  # [ 0, 0, 0, 0, 0 ]\nnums: list[int] = [1, 3, 2, 5, 4]  \n
    array.cpp
    /* \u521d\u59cb\u5316\u9663\u5217 */\n// \u5132\u5b58\u5728\u5806\u758a\u4e0a\nint arr[5];\nint nums[5] = { 1, 3, 2, 5, 4 };\n// \u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff08\u9700\u8981\u624b\u52d5\u91cb\u653e\u7a7a\u9593\uff09\nint* arr1 = new int[5];\nint* nums1 = new int[5] { 1, 3, 2, 5, 4 };\n
    array.java
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // { 0, 0, 0, 0, 0 }\nint[] nums = { 1, 3, 2, 5, 4 };\n
    array.cs
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint[] arr = new int[5]; // [ 0, 0, 0, 0, 0 ]\nint[] nums = [1, 3, 2, 5, 4];\n
    array.go
    /* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr [5]int\n// \u5728 Go \u4e2d\uff0c\u6307\u5b9a\u9577\u5ea6\u6642\uff08[5]int\uff09\u70ba\u9663\u5217\uff0c\u4e0d\u6307\u5b9a\u9577\u5ea6\u6642\uff08[]int\uff09\u70ba\u5207\u7247\n// \u7531\u65bc Go \u7684\u9663\u5217\u88ab\u8a2d\u8a08\u70ba\u5728\u7de8\u8b6f\u671f\u78ba\u5b9a\u9577\u5ea6\uff0c\u56e0\u6b64\u53ea\u80fd\u4f7f\u7528\u5e38\u6578\u4f86\u6307\u5b9a\u9577\u5ea6\n// \u70ba\u4e86\u65b9\u4fbf\u5be6\u73fe\u64f4\u5bb9 extend() \u65b9\u6cd5\uff0c\u4ee5\u4e0b\u5c07\u5207\u7247\uff08Slice\uff09\u770b\u4f5c\u9663\u5217\uff08Array\uff09\nnums := []int{1, 3, 2, 5, 4}\n
    array.swift
    /* \u521d\u59cb\u5316\u9663\u5217 */\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\u9663\u5217 */\nvar arr = new Array(5).fill(0);\nvar nums = [1, 3, 2, 5, 4];\n
    array.ts
    /* \u521d\u59cb\u5316\u9663\u5217 */\nlet arr: number[] = new Array(5).fill(0);\nlet nums: number[] = [1, 3, 2, 5, 4];\n
    array.dart
    /* \u521d\u59cb\u5316\u9663\u5217 */\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\u9663\u5217 */\nlet arr: Vec<i32> = vec![0; 5]; // [0, 0, 0, 0, 0]\nlet nums: Vec<i32> = vec![1, 3, 2, 5, 4];\n
    array.c
    /* \u521d\u59cb\u5316\u9663\u5217 */\nint arr[5] = { 0 }; // { 0, 0, 0, 0, 0 }\nint nums[5] = { 1, 3, 2, 5, 4 };\n
    array.kt
    /* \u521d\u59cb\u5316\u9663\u5217 */\nvar arr = IntArray(5) // { 0, 0, 0, 0, 0 }\nvar nums = intArrayOf(1, 3, 2, 5, 4)\n
    array.rb
    # \u521d\u59cb\u5316\u9663\u5217\narr = Array.new(5, 0)\nnums = [1, 3, 2, 5, 4]\n
    array.zig
    // \u521d\u59cb\u5316\u9663\u5217\nvar arr = [_]i32{0} ** 5; // { 0, 0, 0, 0, 0 }\nvar nums = [_]i32{ 1, 3, 2, 5, 4 };\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u9663\u5217\u5143\u7d20\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u9019\u610f\u5473\u8457\u8a08\u7b97\u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u975e\u5e38\u5bb9\u6613\u3002\u7d66\u5b9a\u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09\u548c\u67d0\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5716 4-2 \u6240\u793a\u7684\u516c\u5f0f\u8a08\u7b97\u5f97\u5230\u8a72\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u76f4\u63a5\u8a2a\u554f\u8a72\u5143\u7d20\u3002

    \u5716 4-2 \u00a0 \u9663\u5217\u5143\u7d20\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a08\u7b97

    \u89c0\u5bdf\u5716 4-2 \uff0c\u6211\u5011\u767c\u73fe\u9663\u5217\u9996\u500b\u5143\u7d20\u7684\u7d22\u5f15\u70ba \\(0\\) \uff0c\u9019\u4f3c\u4e4e\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\u6703\u66f4\u81ea\u7136\u3002\u4f46\u5f9e\u4f4d\u5740\u8a08\u7b97\u516c\u5f0f\u7684\u89d2\u5ea6\u770b\uff0c\u7d22\u5f15\u672c\u8cea\u4e0a\u662f\u8a18\u61b6\u9ad4\u4f4d\u5740\u7684\u504f\u79fb\u91cf\u3002\u9996\u500b\u5143\u7d20\u7684\u4f4d\u5740\u504f\u79fb\u91cf\u662f \\(0\\) \uff0c\u56e0\u6b64\u5b83\u7684\u7d22\u5f15\u70ba \\(0\\) \u662f\u5408\u7406\u7684\u3002

    \u5728\u9663\u5217\u4e2d\u8a2a\u554f\u5143\u7d20\u975e\u5e38\u9ad8\u6548\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u96a8\u6a5f\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u5143\u7d20\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u9663\u5217\u5143\u7d20\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u201c\u7dca\u6328\u8457\u7684\u201d\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u7a7a\u9593\u518d\u5b58\u653e\u4efb\u4f55\u8cc7\u6599\u3002\u5982\u5716 4-3 \u6240\u793a\uff0c\u5982\u679c\u60f3\u5728\u9663\u5217\u4e2d\u9593\u63d2\u5165\u4e00\u500b\u5143\u7d20\uff0c\u5247\u9700\u8981\u5c07\u8a72\u5143\u7d20\u4e4b\u5f8c\u7684\u6240\u6709\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u4e4b\u5f8c\u518d\u628a\u5143\u7d20\u8ce6\u503c\u7d66\u8a72\u7d22\u5f15\u3002

    \u5716 4-3 \u00a0 \u9663\u5217\u63d2\u5165\u5143\u7d20\u793a\u4f8b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u56e0\u6b64\u63d2\u5165\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u6703\u5c0e\u81f4\u9663\u5217\u5c3e\u90e8\u5143\u7d20\u201c\u4e1f\u5931\u201d\u3002\u6211\u5011\u5c07\u9019\u500b\u554f\u984c\u7684\u89e3\u6c7a\u65b9\u6848\u7559\u5728\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u4e2d\u8a0e\u8ad6\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u540c\u7406\uff0c\u5982\u5716 4-4 \u6240\u793a\uff0c\u82e5\u60f3\u522a\u9664\u7d22\u5f15 \\(i\\) \u8655\u7684\u5143\u7d20\uff0c\u5247\u9700\u8981\u628a\u7d22\u5f15 \\(i\\) \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\u3002

    \u5716 4-4 \u00a0 \u9663\u5217\u522a\u9664\u5143\u7d20\u793a\u4f8b

    \u8acb\u6ce8\u610f\uff0c\u522a\u9664\u5143\u7d20\u5b8c\u6210\u5f8c\uff0c\u539f\u5148\u672b\u5c3e\u7684\u5143\u7d20\u8b8a\u5f97\u201c\u7121\u610f\u7fa9\u201d\u4e86\uff0c\u6240\u4ee5\u6211\u5011\u7121\u9808\u7279\u610f\u53bb\u4fee\u6539\u5b83\u3002

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u7684\u4f86\u770b\uff0c\u9663\u5217\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u6709\u4ee5\u4e0b\u7f3a\u9ede\u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u9ad8\uff1a\u9663\u5217\u7684\u63d2\u5165\u548c\u522a\u9664\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u9577\u5ea6\u3002
    • \u4e1f\u5931\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5728\u63d2\u5165\u5143\u7d20\u5f8c\uff0c\u8d85\u51fa\u9663\u5217\u9577\u5ea6\u7bc4\u570d\u7684\u5143\u7d20\u6703\u4e1f\u5931\u3002
    • \u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff1a\u6211\u5011\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u500b\u6bd4\u8f03\u9577\u7684\u9663\u5217\uff0c\u53ea\u7528\u524d\u9762\u4e00\u90e8\u5206\uff0c\u9019\u6a23\u5728\u63d2\u5165\u8cc7\u6599\u6642\uff0c\u4e1f\u5931\u7684\u672b\u5c3e\u5143\u7d20\u90fd\u662f\u201c\u7121\u610f\u7fa9\u201d\u7684\uff0c\u4f46\u9019\u6a23\u505a\u6703\u9020\u6210\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#5","title":"5. \u00a0 \u8d70\u8a2a\u9663\u5217","text":"

    \u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u65e2\u53ef\u4ee5\u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u9663\u5217\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u7372\u53d6\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u5728\u9663\u5217\u4e2d\u67e5\u8a62\u6307\u5b9a\u5143\u7d20\u9700\u8981\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u5224\u65b7\u5143\u7d20\u503c\u662f\u5426\u5339\u914d\uff0c\u82e5\u5339\u914d\u5247\u8f38\u51fa\u5c0d\u61c9\u7d22\u5f15\u3002

    \u56e0\u70ba\u9663\u5217\u662f\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u6240\u4ee5\u4e0a\u8ff0\u67e5\u8a62\u64cd\u4f5c\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u67e5\u8a62\u201d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def find(nums: list[int], target: int) -> int:\n    \"\"\"\u5728\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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\u9663\u5217\u4e2d\u67e5\u8a62\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#7","title":"7. \u00a0 \u64f4\u5bb9\u9663\u5217","text":"

    \u5728\u8907\u96dc\u7684\u7cfb\u7d71\u74b0\u5883\u4e2d\uff0c\u7a0b\u5f0f\u96e3\u4ee5\u4fdd\u8b49\u9663\u5217\u4e4b\u5f8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u53ef\u7528\u7684\uff0c\u5f9e\u800c\u7121\u6cd5\u5b89\u5168\u5730\u64f4\u5c55\u9663\u5217\u5bb9\u91cf\u3002\u56e0\u6b64\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u9663\u5217\u7684\u9577\u5ea6\u662f\u4e0d\u53ef\u8b8a\u7684\u3002

    \u5982\u679c\u6211\u5011\u5e0c\u671b\u64f4\u5bb9\u9663\u5217\uff0c\u5247\u9700\u91cd\u65b0\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u7136\u5f8c\u628a\u539f\u9663\u5217\u5143\u7d20\u4f9d\u6b21\u8907\u88fd\u5230\u65b0\u9663\u5217\u3002\u9019\u662f\u4e00\u500b \\(O(n)\\) \u7684\u64cd\u4f5c\uff0c\u5728\u9663\u5217\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\u975e\u5e38\u8017\u6642\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array.py
    def extend(nums: list[int], enlarge: int) -> list[int]:\n    \"\"\"\u64f4\u5c55\u9663\u5217\u9577\u5ea6\"\"\"\n    # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res = [0] * (len(nums) + enlarge)\n    # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in range(len(nums)):\n        res[i] = nums[i]\n    # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n
    array.cpp
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = new int[size + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete[] nums;\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.java
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.cs
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint[] Extend(int[] nums, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int[] res = new int[nums.Length + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < nums.Length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.go
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums []int, enlarge int) []int {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    res := make([]int, len(nums)+enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i, num := range nums {\n        res[i] = num\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.swift
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfunc extend(nums: [Int], enlarge: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = Array(repeating: 0, count: nums.count + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for i in nums.indices {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.js
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cJavaScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums, enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.ts
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\n// \u8acb\u6ce8\u610f\uff0cTypeScript \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n// \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\nfunction extend(nums: number[], enlarge: number): number[] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    const res = new Array(nums.length + enlarge).fill(0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (let i = 0; i < nums.length; i++) {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.dart
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nList<int> extend(List<int> nums, int enlarge) {\n  // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  List<int> res = List.filled(nums.length + enlarge, 0);\n  // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for (var i = 0; i < nums.length; i++) {\n    res[i] = nums[i];\n  }\n  // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  return res;\n}\n
    array.rs
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfn extend(nums: Vec<i32>, enlarge: usize) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    let mut res: Vec<i32> = vec![0; nums.len() + enlarge];\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\n    for i in 0..nums.len() {\n        res[i] = nums[i];\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    res\n}\n
    array.c
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nint *extend(int *nums, int size, int enlarge) {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    int *res = (int *)malloc(sizeof(int) * (size + enlarge));\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (int i = 0; i < size; i++) {\n        res[i] = nums[i];\n    }\n    // \u521d\u59cb\u5316\u64f4\u5c55\u5f8c\u7684\u7a7a\u9593\n    for (int i = size; i < size + enlarge; i++) {\n        res[i] = 0;\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    array.kt
    /* \u64f4\u5c55\u9663\u5217\u9577\u5ea6 */\nfun extend(nums: IntArray, enlarge: Int): IntArray {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    val res = IntArray(nums.size + enlarge)\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    for (i in nums.indices) {\n        res[i] = nums[i]\n    }\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res\n}\n
    array.rb
    ### \u64f4\u5c55\u9663\u5217\u9577\u5ea6 ###\n# \u8acb\u6ce8\u610f\uff0cRuby \u7684 Array \u662f\u52d5\u614b\u9663\u5217\uff0c\u53ef\u4ee5\u76f4\u63a5\u64f4\u5c55\n# \u70ba\u4e86\u65b9\u4fbf\u5b78\u7fd2\uff0c\u672c\u51fd\u5f0f\u5c07 Array \u770b\u4f5c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u9663\u5217\ndef extend(nums, enlarge)\n  # \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n  res = Array.new(nums.length + enlarge, 0)\n\n  # \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n  for i in 0...nums.length\n    res[i] = nums[i]\n  end\n\n  # \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n  res\nend\n
    array.zig
    // \u64f4\u5c55\u9663\u5217\u9577\u5ea6\nfn extend(mem_allocator: std.mem.Allocator, nums: []i32, enlarge: usize) ![]i32 {\n    // \u521d\u59cb\u5316\u4e00\u500b\u64f4\u5c55\u9577\u5ea6\u5f8c\u7684\u9663\u5217\n    var res = try mem_allocator.alloc(i32, nums.len + enlarge);\n    @memset(res, 0);\n    // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n    std.mem.copy(i32, res, nums);\n    // \u8fd4\u56de\u64f4\u5c55\u5f8c\u7684\u65b0\u9663\u5217\n    return res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/array/#412","title":"4.1.2 \u00a0 \u9663\u5217\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u4e14\u5143\u7d20\u578b\u5225\u76f8\u540c\u3002\u9019\u7a2e\u505a\u6cd5\u5305\u542b\u8c50\u5bcc\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u7cfb\u7d71\u53ef\u4ee5\u5229\u7528\u9019\u4e9b\u8cc7\u8a0a\u4f86\u6700\u4f73\u5316\u8cc7\u6599\u7d50\u69cb\u7684\u64cd\u4f5c\u6548\u7387\u3002

    • \u7a7a\u9593\u6548\u7387\u9ad8\uff1a\u9663\u5217\u70ba\u8cc7\u6599\u5206\u914d\u4e86\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u584a\uff0c\u7121\u9808\u984d\u5916\u7684\u7d50\u69cb\u958b\u92b7\u3002
    • \u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff1a\u9663\u5217\u5141\u8a31\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u4efb\u4f55\u5143\u7d20\u3002
    • \u5feb\u53d6\u5340\u57df\u6027\uff1a\u7576\u8a2a\u554f\u9663\u5217\u5143\u7d20\u6642\uff0c\u8a08\u7b97\u6a5f\u4e0d\u50c5\u6703\u8f09\u5165\u5b83\uff0c\u9084\u6703\u5feb\u53d6\u5176\u5468\u570d\u7684\u5176\u4ed6\u8cc7\u6599\uff0c\u5f9e\u800c\u85c9\u52a9\u9ad8\u901f\u5feb\u53d6\u4f86\u63d0\u5347\u5f8c\u7e8c\u64cd\u4f5c\u7684\u57f7\u884c\u901f\u5ea6\u3002

    \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u662f\u4e00\u628a\u96d9\u5203\u528d\uff0c\u5176\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

    • \u63d2\u5165\u8207\u522a\u9664\u6548\u7387\u4f4e\uff1a\u7576\u9663\u5217\u4e2d\u5143\u7d20\u8f03\u591a\u6642\uff0c\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u9700\u8981\u79fb\u52d5\u5927\u91cf\u7684\u5143\u7d20\u3002
    • \u9577\u5ea6\u4e0d\u53ef\u8b8a\uff1a\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u5c31\u56fa\u5b9a\u4e86\uff0c\u64f4\u5bb9\u9663\u5217\u9700\u8981\u5c07\u6240\u6709\u8cc7\u6599\u8907\u88fd\u5230\u65b0\u9663\u5217\uff0c\u958b\u92b7\u5f88\u5927\u3002
    • \u7a7a\u9593\u6d6a\u8cbb\uff1a\u5982\u679c\u9663\u5217\u5206\u914d\u7684\u5927\u5c0f\u8d85\u904e\u5be6\u969b\u6240\u9700\uff0c\u90a3\u9ebc\u591a\u9918\u7684\u7a7a\u9593\u5c31\u88ab\u6d6a\u8cbb\u4e86\u3002
    "},{"location":"chapter_array_and_linkedlist/array/#413","title":"4.1.3 \u00a0 \u9663\u5217\u5178\u578b\u61c9\u7528","text":"

    \u9663\u5217\u662f\u4e00\u7a2e\u57fa\u790e\u4e14\u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u65e2\u983b\u7e41\u61c9\u7528\u5728\u5404\u985e\u6f14\u7b97\u6cd5\u4e4b\u4e2d\uff0c\u4e5f\u53ef\u7528\u65bc\u5be6\u73fe\u5404\u7a2e\u8907\u96dc\u8cc7\u6599\u7d50\u69cb\u3002

    • \u96a8\u6a5f\u8a2a\u554f\uff1a\u5982\u679c\u6211\u5011\u60f3\u96a8\u6a5f\u62bd\u53d6\u4e00\u4e9b\u6a23\u672c\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7528\u9663\u5217\u5132\u5b58\uff0c\u4e26\u751f\u6210\u4e00\u500b\u96a8\u6a5f\u5e8f\u5217\uff0c\u6839\u64da\u7d22\u5f15\u5be6\u73fe\u96a8\u6a5f\u62bd\u6a23\u3002
    • \u6392\u5e8f\u548c\u641c\u5c0b\uff1a\u9663\u5217\u662f\u6392\u5e8f\u548c\u641c\u5c0b\u6f14\u7b97\u6cd5\u6700\u5e38\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u4e8c\u5206\u641c\u5c0b\u7b49\u90fd\u4e3b\u8981\u5728\u9663\u5217\u4e0a\u9032\u884c\u3002
    • \u67e5\u8a62\u8868\uff1a\u7576\u9700\u8981\u5feb\u901f\u67e5\u8a62\u4e00\u500b\u5143\u7d20\u6216\u5176\u5c0d\u61c9\u95dc\u4fc2\u6642\uff0c\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u4f5c\u70ba\u67e5\u8a62\u8868\u3002\u5047\u5982\u6211\u5011\u60f3\u5be6\u73fe\u5b57\u5143\u5230 ASCII \u78bc\u7684\u5c0d\u6620\uff0c\u5247\u53ef\u4ee5\u5c07\u5b57\u5143\u7684 ASCII \u78bc\u503c\u4f5c\u70ba\u7d22\u5f15\uff0c\u5c0d\u61c9\u7684\u5143\u7d20\u5b58\u653e\u5728\u9663\u5217\u4e2d\u7684\u5c0d\u61c9\u4f4d\u7f6e\u3002
    • \u6a5f\u5668\u5b78\u7fd2\uff1a\u795e\u7d93\u7db2\u8def\u4e2d\u5927\u91cf\u4f7f\u7528\u4e86\u5411\u91cf\u3001\u77e9\u9663\u3001\u5f35\u91cf\u4e4b\u9593\u7684\u7dda\u6027\u4ee3\u6578\u904b\u7b97\uff0c\u9019\u4e9b\u8cc7\u6599\u90fd\u662f\u4ee5\u9663\u5217\u7684\u5f62\u5f0f\u69cb\u5efa\u7684\u3002\u9663\u5217\u662f\u795e\u7d93\u7db2\u8def\u7a0b\u5f0f\u8a2d\u8a08\u4e2d\u6700\u5e38\u4f7f\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff1a\u9663\u5217\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002\u4f8b\u5982\uff0c\u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a\u5be6\u969b\u4e0a\u662f\u4e00\u500b\u4e8c\u7dad\u9663\u5217\u3002
    "},{"location":"chapter_array_and_linkedlist/linked_list/","title":"4.2 \u00a0 \u93c8\u7d50\u4e32\u5217","text":"

    \u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u516c\u5171\u8cc7\u6e90\uff0c\u5728\u4e00\u500b\u8907\u96dc\u7684\u7cfb\u7d71\u57f7\u884c\u74b0\u5883\u4e0b\uff0c\u7a7a\u9592\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u80fd\u6563\u843d\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u6211\u5011\u77e5\u9053\uff0c\u5132\u5b58\u9663\u5217\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5fc5\u9808\u662f\u9023\u7e8c\u7684\uff0c\u800c\u7576\u9663\u5217\u975e\u5e38\u5927\u6642\uff0c\u8a18\u61b6\u9ad4\u53ef\u80fd\u7121\u6cd5\u63d0\u4f9b\u5982\u6b64\u5927\u7684\u9023\u7e8c\u7a7a\u9593\u3002\u6b64\u6642\u93c8\u7d50\u4e32\u5217\u7684\u9748\u6d3b\u6027\u512a\u52e2\u5c31\u9ad4\u73fe\u51fa\u4f86\u4e86\u3002

    \u93c8\u7d50\u4e32\u5217\uff08linked list\uff09\u662f\u4e00\u7a2e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u662f\u4e00\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u5404\u500b\u7bc0\u9ede\u900f\u904e\u201c\u5f15\u7528\u201d\u76f8\u9023\u7dda\u3002\u5f15\u7528\u8a18\u9304\u4e86\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u900f\u904e\u5b83\u53ef\u4ee5\u5f9e\u7576\u524d\u7bc0\u9ede\u8a2a\u554f\u5230\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002

    \u93c8\u7d50\u4e32\u5217\u7684\u8a2d\u8a08\u4f7f\u5f97\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u5b83\u5011\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

    \u5716 4-5 \u00a0 \u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f

    \u89c0\u5bdf\u5716 4-5 \uff0c\u93c8\u7d50\u4e32\u5217\u7684\u7d44\u6210\u55ae\u4f4d\u662f\u7bc0\u9ede\uff08node\uff09\u7269\u4ef6\u3002\u6bcf\u500b\u7bc0\u9ede\u90fd\u5305\u542b\u5169\u9805\u8cc7\u6599\uff1a\u7bc0\u9ede\u7684\u201c\u503c\u201d\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u201c\u5f15\u7528\u201d\u3002

    • \u93c8\u7d50\u4e32\u5217\u7684\u9996\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u982d\u7bc0\u9ede\u201d\uff0c\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u88ab\u7a31\u70ba\u201c\u5c3e\u7bc0\u9ede\u201d\u3002
    • \u5c3e\u7bc0\u9ede\u6307\u5411\u7684\u662f\u201c\u7a7a\u201d\uff0c\u5b83\u5728 Java\u3001C++ \u548c Python \u4e2d\u5206\u5225\u88ab\u8a18\u70ba null\u3001nullptr \u548c None \u3002
    • \u5728 C\u3001C++\u3001Go \u548c Rust \u7b49\u652f\u6301\u6307\u6a19\u7684\u8a9e\u8a00\u4e2d\uff0c\u4e0a\u8ff0\u201c\u5f15\u7528\u201d\u61c9\u88ab\u66ff\u63db\u70ba\u201c\u6307\u6a19\u201d\u3002

    \u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede ListNode \u9664\u4e86\u5305\u542b\u503c\uff0c\u9084\u9700\u984d\u5916\u5132\u5b58\u4e00\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u56e0\u6b64\u5728\u76f8\u540c\u8cc7\u6599\u91cf\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u6bd4\u9663\u5217\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val               # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  //\u5efa\u69cb\u5b50\n    int val = x;         // \u7bc0\u9ede\u503c\n    ListNode? next;      // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype ListNode struct {\n    Val  int       // \u7bc0\u9ede\u503c\n    Next *ListNode // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n// NewListNode \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u93c8\u7d50\u4e32\u5217\nfunc NewListNode(val int) *ListNode {\n    return &ListNode{\n        Val:  val,\n        Next: nil,\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next) {\n        this.val = (val === undefined ? 0 : val);       // \u7bc0\u9ede\u503c\n        this.next = (next === undefined ? null : next); // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    val: number;\n    next: ListNode | null;\n    constructor(val?: number, next?: ListNode | null) {\n        this.val = val === undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next === undefined ? null : next;  // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n  ListNode(this.val, [this.next]); // \u5efa\u69cb\u5b50\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n/* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n}\n
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\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
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x          // \u7bc0\u9ede\u503c\n    val next: ListNode? = null // \u6307\u5411\u4e0b\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    # \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val  # \u7bc0\u9ede\u503c\n  attr_accessor :next # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n  def initialize(val=0, next_node=nil)\n    @val = val\n    @next = next_node\n  end\nend\n
    // \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\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 \u93c8\u7d50\u4e32\u5217\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_array_and_linkedlist/linked_list/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217","text":"

    \u5efa\u7acb\u93c8\u7d50\u4e32\u5217\u5206\u70ba\u5169\u6b65\uff0c\u7b2c\u4e00\u6b65\u662f\u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\u7269\u4ef6\uff0c\u7b2c\u4e8c\u6b65\u662f\u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\u95dc\u4fc2\u3002\u521d\u59cb\u5316\u5b8c\u6210\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f9e\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u900f\u904e\u5f15\u7528\u6307\u5411 next \u4f9d\u6b21\u8a2a\u554f\u6240\u6709\u7bc0\u9ede\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    # \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode(1)\nn1 = ListNode(3)\nn2 = ListNode(2)\nn3 = ListNode(5)\nn4 = ListNode(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.cpp
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.java
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.cs
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = new(1);\nListNode n1 = new(3);\nListNode n2 = new(2);\nListNode n3 = new(5);\nListNode n4 = new(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.go
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 := NewListNode(1)\nn1 := NewListNode(3)\nn2 := NewListNode(2)\nn3 := NewListNode(5)\nn4 := NewListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.Next = n1\nn1.Next = n2\nn2.Next = n3\nn3.Next = n4\n
    linked_list.swift
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.js
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.ts
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.dart
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\\\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode n0 = ListNode(1);\nListNode n1 = ListNode(3);\nListNode n2 = ListNode(2);\nListNode n3 = ListNode(5);\nListNode n4 = ListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rs
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\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\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nListNode* n0 = newListNode(1);\nListNode* n1 = newListNode(3);\nListNode* n2 = newListNode(2);\nListNode* n3 = newListNode(5);\nListNode* n4 = newListNode(4);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0->next = n1;\nn1->next = n2;\nn2->next = n3;\nn3->next = n4;\n
    linked_list.kt
    /* \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4 */\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nval n0 = ListNode(1)\nval n1 = ListNode(3)\nval n2 = ListNode(2)\nval n3 = ListNode(5)\nval n4 = ListNode(4)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1;\nn1.next = n2;\nn2.next = n3;\nn3.next = n4;\n
    linked_list.rb
    # \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217 1 -> 3 -> 2 -> 5 -> 4\n# \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\nn0 = ListNode.new(1)\nn1 = ListNode.new(3)\nn2 = ListNode.new(2)\nn3 = ListNode.new(5)\nn4 = ListNode.new(4)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = n1\nn1.next = n2\nn2.next = n3\nn3.next = n4\n
    linked_list.zig
    // \u521d\u59cb\u5316\u93c8\u7d50\u4e32\u5217\n// \u521d\u59cb\u5316\u5404\u500b\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\nn0.next = &n1;\nn1.next = &n2;\nn2.next = &n3;\nn3.next = &n4;\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9663\u5217\u6574\u9ad4\u662f\u4e00\u500b\u8b8a\u6578\uff0c\u6bd4\u5982\u9663\u5217 nums \u5305\u542b\u5143\u7d20 nums[0] \u548c nums[1] \u7b49\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u7531\u591a\u500b\u7368\u7acb\u7684\u7bc0\u9ede\u7269\u4ef6\u7d44\u6210\u7684\u3002\u6211\u5011\u901a\u5e38\u5c07\u982d\u7bc0\u9ede\u7576\u4f5c\u93c8\u7d50\u4e32\u5217\u7684\u4ee3\u7a31\uff0c\u6bd4\u5982\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u53ef\u8a18\u4f5c\u93c8\u7d50\u4e32\u5217 n0 \u3002

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

    \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u7bc0\u9ede\u975e\u5e38\u5bb9\u6613\u3002\u5982\u5716 4-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u60f3\u5728\u76f8\u9130\u7684\u5169\u500b\u7bc0\u9ede n0 \u548c n1 \u4e4b\u9593\u63d2\u5165\u4e00\u500b\u65b0\u7bc0\u9ede P \uff0c\u5247\u53ea\u9700\u6539\u8b8a\u5169\u500b\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    \u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5728\u9663\u5217\u4e2d\u63d2\u5165\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6548\u7387\u8f03\u4f4e\u3002

    \u5716 4-6 \u00a0 \u93c8\u7d50\u4e32\u5217\u63d2\u5165\u7bc0\u9ede\u793a\u4f8b

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def insert(n0: ListNode, P: ListNode):\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P\"\"\"\n    n1 = n0.next\n    P.next = n1\n    n0.next = P\n
    linked_list.cpp
    /* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede P */\nfunction insert(n0, P) {\n    const n1 = n0.next;\n    P.next = n1;\n    n0.next = P;\n}\n
    linked_list.ts
    /* \u5728\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede _p ###\n# Ruby \u7684 `p` \u662f\u4e00\u500b\u5167\u5efa\u51fd\u5f0f\uff0c `P` \u662f\u4e00\u500b\u5e38\u6578\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\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u63d2\u5165\u7bc0\u9ede 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u5982\u5716 4-7 \u6240\u793a\uff0c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u7bc0\u9ede\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u53ea\u9700\u6539\u8b8a\u4e00\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u3002

    \u8acb\u6ce8\u610f\uff0c\u5118\u7ba1\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\u7bc0\u9ede P \u4ecd\u7136\u6307\u5411 n1 \uff0c\u4f46\u5be6\u969b\u4e0a\u8d70\u8a2a\u6b64\u93c8\u7d50\u4e32\u5217\u5df2\u7d93\u7121\u6cd5\u8a2a\u554f\u5230 P \uff0c\u9019\u610f\u5473\u8457 P \u5df2\u7d93\u4e0d\u518d\u5c6c\u65bc\u8a72\u93c8\u7d50\u4e32\u5217\u4e86\u3002

    \u5716 4-7 \u00a0 \u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def remove(n0: ListNode):\n    \"\"\"\u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\"\"\"\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delete P;\n}\n
    linked_list.java
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(P);\n}\n
    linked_list.kt
    /* \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede */\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
    ### \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede ###\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
    // \u522a\u9664\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede n0 \u4e4b\u5f8c\u7684\u9996\u500b\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#4","title":"4. \u00a0 \u8a2a\u554f\u7bc0\u9ede","text":"

    \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u8a2a\u554f\u7bc0\u9ede\u7684\u6548\u7387\u8f03\u4f4e\u3002\u5982\u4e0a\u4e00\u7bc0\u6240\u8ff0\uff0c\u6211\u5011\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u4e0b\u8a2a\u554f\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5143\u7d20\u3002\u93c8\u7d50\u4e32\u5217\u5247\u4e0d\u7136\uff0c\u7a0b\u5f0f\u9700\u8981\u5f9e\u982d\u7bc0\u9ede\u51fa\u767c\uff0c\u9010\u500b\u5411\u5f8c\u8d70\u8a2a\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u7684\u7b2c \\(i\\) \u500b\u7bc0\u9ede\u9700\u8981\u8ff4\u5708 \\(i - 1\\) \u8f2a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def access(head: ListNode, index: int) -> ListNode | None:\n    \"\"\"\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\"\"\"\n    for _ in range(index):\n        if not head:\n            return None\n        head = head.next\n    return head\n
    linked_list.cpp
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    /* \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede */\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
    ### \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede ###\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
    // \u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u4e2d\u7d22\u5f15\u70ba index \u7684\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#5","title":"5. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u67e5\u8a62\u5176\u4e2d\u503c\u70ba target \u7684\u7bc0\u9ede\uff0c\u8f38\u51fa\u8a72\u7bc0\u9ede\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u6b64\u904e\u7a0b\u4e5f\u5c6c\u65bc\u7dda\u6027\u67e5\u8a62\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linked_list.py
    def find(head: ListNode, target: int) -> int:\n    \"\"\"\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\"\"\"\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede */\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede ###\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\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u503c\u70ba target \u7684\u9996\u500b\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/linked_list/#422-vs","title":"4.2.2 \u00a0 \u9663\u5217 vs. \u93c8\u7d50\u4e32\u5217","text":"

    \u8868 4-1 \u7e3d\u7d50\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7684\u5404\u9805\u7279\u9ede\u4e26\u5c0d\u6bd4\u4e86\u64cd\u4f5c\u6548\u7387\u3002\u7531\u65bc\u5b83\u5011\u63a1\u7528\u5169\u7a2e\u76f8\u53cd\u7684\u5132\u5b58\u7b56\u7565\uff0c\u56e0\u6b64\u5404\u7a2e\u6027\u8cea\u548c\u64cd\u4f5c\u6548\u7387\u4e5f\u5448\u73fe\u5c0d\u7acb\u7684\u7279\u9ede\u3002

    \u8868 4-1 \u00a0 \u9663\u5217\u8207\u93c8\u7d50\u4e32\u5217\u7684\u6548\u7387\u5c0d\u6bd4

    \u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u5132\u5b58\u65b9\u5f0f \u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5206\u6563\u8a18\u61b6\u9ad4\u7a7a\u9593 \u5bb9\u91cf\u64f4\u5c55 \u9577\u5ea6\u4e0d\u53ef\u8b8a \u53ef\u9748\u6d3b\u64f4\u5c55 \u8a18\u61b6\u9ad4\u6548\u7387 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u5c11\u3001\u4f46\u53ef\u80fd\u6d6a\u8cbb\u7a7a\u9593 \u5143\u7d20\u4f54\u7528\u8a18\u61b6\u9ad4\u591a \u8a2a\u554f\u5143\u7d20 \\(O(1)\\) \\(O(n)\\) \u65b0\u589e\u5143\u7d20 \\(O(n)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(1)\\)"},{"location":"chapter_array_and_linkedlist/linked_list/#423","title":"4.2.3 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u578b\u5225","text":"

    \u5982\u5716 4-8 \u6240\u793a\uff0c\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u4e09\u7a2e\u3002

    • \u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u5373\u524d\u9762\u4ecb\u7d39\u7684\u666e\u901a\u93c8\u7d50\u4e32\u5217\u3002\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5305\u542b\u503c\u548c\u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\u5169\u9805\u8cc7\u6599\u3002\u6211\u5011\u5c07\u9996\u500b\u7bc0\u9ede\u7a31\u70ba\u982d\u7bc0\u9ede\uff0c\u5c07\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7a31\u70ba\u5c3e\u7bc0\u9ede\uff0c\u5c3e\u7bc0\u9ede\u6307\u5411\u7a7a None \u3002
    • \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff1a\u5982\u679c\u6211\u5011\u4ee4\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5c3e\u7bc0\u9ede\u6307\u5411\u982d\u7bc0\u9ede\uff08\u9996\u5c3e\u76f8\u63a5\uff09\uff0c\u5247\u5f97\u5230\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u5728\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u4efb\u610f\u7bc0\u9ede\u90fd\u53ef\u4ee5\u8996\u4f5c\u982d\u7bc0\u9ede\u3002
    • \u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff1a\u8207\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u76f8\u6bd4\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u8a18\u9304\u4e86\u5169\u500b\u65b9\u5411\u7684\u5f15\u7528\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7bc0\u9ede\u5b9a\u7fa9\u540c\u6642\u5305\u542b\u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\uff08\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\u548c\u524d\u9a45\u7bc0\u9ede\uff08\u4e0a\u4e00\u500b\u7bc0\u9ede\uff09\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u76f8\u8f03\u65bc\u55ae\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u66f4\u5177\u9748\u6d3b\u6027\uff0c\u53ef\u4ee5\u671d\u5169\u500b\u65b9\u5411\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u76f8\u61c9\u5730\u4e5f\u9700\u8981\u4f54\u7528\u66f4\u591a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.next: ListNode | None = None  # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        self.prev: ListNode | None = None  # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct ListNode {\n    int val;         // \u7bc0\u9ede\u503c\n    ListNode *next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode *prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n    ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}  // \u5efa\u69cb\u5b50\n};\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(int x) { val = x; }  // \u5efa\u69cb\u5b50\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode(int x) {  // \u5efa\u69cb\u5b50\n    int val = x;    // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype DoublyListNode struct {\n    Val  int             // \u7bc0\u9ede\u503c\n    Next *DoublyListNode // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    Prev *DoublyListNode // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    var prev: ListNode? // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n\n    init(x: Int) { // \u5efa\u69cb\u5b50\n        val = x\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    constructor(val, next, prev) {\n        this.val = val  ===  undefined ? 0 : val;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\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;        // \u7bc0\u9ede\u503c\n        this.next = next  ===  undefined ? null : next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n        this.prev = prev  ===  undefined ? null : prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\nclass ListNode {\n    int val;        // \u7bc0\u9ede\u503c\n    ListNode next;  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode prev;  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n    ListNode(this.val, [this.next, this.prev]);  // \u5efa\u69cb\u5b50\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u578b\u5225 */\n#[derive(Debug)]\nstruct ListNode {\n    val: i32, // \u7bc0\u9ede\u503c\n    next: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    prev: Option<Rc<RefCell<ListNode>>>, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n}\n\n/* \u5efa\u69cb\u5b50 */\nimpl ListNode {\n    fn new(val: i32) -> Self {\n        ListNode {\n            val,\n            next: None,\n            prev: None,\n        }\n    }\n}\n
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct ListNode {\n    int val;               // \u7bc0\u9ede\u503c\n    struct ListNode *next; // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n    struct ListNode *prev; // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n} ListNode;\n\n/* \u5efa\u69cb\u5b50 */\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225 */\n// \u5efa\u69cb\u5b50\nclass ListNode(x: Int) {\n    val _val: Int = x           // \u7bc0\u9ede\u503c\n    val next: ListNode? = null  // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n    val prev: ListNode? = null  // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u5f15\u7528\n}\n
    # \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\nclass ListNode\n  attr_accessor :val    # \u7bc0\u9ede\u503c\n  attr_accessor :next   # \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u5f15\u7528\n  attr_accessor :prev   # \u6307\u5411\u524d\u9a45\u7bc0\u9ede\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
    // \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u985e\u5225\npub fn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = 0, // \u7bc0\u9ede\u503c\n        next: ?*Self = null, // \u6307\u5411\u5f8c\u7e7c\u7bc0\u9ede\u7684\u6307\u6a19\n        prev: ?*Self = null, // \u6307\u5411\u524d\u9a45\u7bc0\u9ede\u7684\u6307\u6a19\n\n        // \u5efa\u69cb\u5b50\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

    \u5716 4-8 \u00a0 \u5e38\u898b\u93c8\u7d50\u4e32\u5217\u7a2e\u985e

    "},{"location":"chapter_array_and_linkedlist/linked_list/#424","title":"4.2.4 \u00a0 \u93c8\u7d50\u4e32\u5217\u5178\u578b\u61c9\u7528","text":"

    \u55ae\u5411\u93c8\u7d50\u4e32\u5217\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u548c\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u3002

    • \u5806\u758a\u8207\u4f47\u5217\uff1a\u7576\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u90fd\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\u6642\uff0c\u5b83\u8868\u73fe\u51fa\u5148\u9032\u5f8c\u51fa\u7684\u7279\u6027\uff0c\u5c0d\u61c9\u5806\u758a\uff1b\u7576\u63d2\u5165\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u4e00\u7aef\u9032\u884c\uff0c\u522a\u9664\u64cd\u4f5c\u5728\u93c8\u7d50\u4e32\u5217\u7684\u53e6\u4e00\u7aef\u9032\u884c\uff0c\u5b83\u8868\u73fe\u51fa\u5148\u9032\u5148\u51fa\u7684\u7279\u6027\uff0c\u5c0d\u61c9\u4f47\u5217\u3002
    • \u96dc\u6e4a\u8868\uff1a\u93c8\u5f0f\u4f4d\u5740\u662f\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\u7684\u4e3b\u6d41\u65b9\u6848\u4e4b\u4e00\uff0c\u5728\u8a72\u65b9\u6848\u4e2d\uff0c\u6240\u6709\u885d\u7a81\u7684\u5143\u7d20\u90fd\u6703\u88ab\u653e\u5230\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
    • \u5716\uff1a\u9130\u63a5\u8868\u662f\u8868\u793a\u5716\u7684\u4e00\u7a2e\u5e38\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d\u5716\u7684\u6bcf\u500b\u9802\u9ede\u90fd\u8207\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u76f8\u95dc\u806f\uff0c\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u90fd\u4ee3\u8868\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u5176\u4ed6\u9802\u9ede\u3002

    \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u5feb\u901f\u67e5\u8a62\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u5143\u7d20\u7684\u5834\u666f\u3002

    • \u9ad8\u968e\u8cc7\u6599\u7d50\u69cb\uff1a\u6bd4\u5982\u5728\u7d05\u9ed1\u6a39\u3001B \u6a39\u4e2d\uff0c\u6211\u5011\u9700\u8981\u8a2a\u554f\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5728\u7bc0\u9ede\u4e2d\u5132\u5b58\u4e00\u500b\u6307\u5411\u7236\u7bc0\u9ede\u7684\u5f15\u7528\u4f86\u5be6\u73fe\uff0c\u985e\u4f3c\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
    • \u700f\u89bd\u5668\u6b77\u53f2\uff1a\u5728\u7db2\u9801\u700f\u89bd\u5668\u4e2d\uff0c\u7576\u7528\u6236\u9ede\u9078\u524d\u9032\u6216\u5f8c\u9000\u6309\u9215\u6642\uff0c\u700f\u89bd\u5668\u9700\u8981\u77e5\u9053\u4f7f\u7528\u8005\u8a2a\u554f\u904e\u7684\u524d\u4e00\u500b\u548c\u5f8c\u4e00\u500b\u7db2\u9801\u3002\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u7279\u6027\u4f7f\u5f97\u9019\u7a2e\u64cd\u4f5c\u8b8a\u5f97\u7c21\u55ae\u3002
    • LRU \u6f14\u7b97\u6cd5\uff1a\u5728\u5feb\u53d6\u6dd8\u6c70\uff08LRU\uff09\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5feb\u901f\u627e\u5230\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u652f\u6301\u5feb\u901f\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u3002\u9019\u6642\u5019\u4f7f\u7528\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5c31\u975e\u5e38\u5408\u9069\u3002

    \u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u5e38\u7528\u65bc\u9700\u8981\u9031\u671f\u6027\u64cd\u4f5c\u7684\u5834\u666f\uff0c\u6bd4\u5982\u4f5c\u696d\u7cfb\u7d71\u7684\u8cc7\u6e90\u6392\u7a0b\u3002

    • \u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\uff1a\u5728\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\u6642\u9593\u7247\u8f2a\u8f49\u6392\u7a0b\u6f14\u7b97\u6cd5\u662f\u4e00\u7a2e\u5e38\u898b\u7684 CPU \u6392\u7a0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u9700\u8981\u5c0d\u4e00\u7d44\u7a0b\u5e8f\u9032\u884c\u8ff4\u5708\u3002\u6bcf\u500b\u7a0b\u5e8f\u88ab\u8ce6\u4e88\u4e00\u500b\u6642\u9593\u7247\uff0c\u7576\u6642\u9593\u7247\u7528\u5b8c\u6642\uff0cCPU \u5c07\u5207\u63db\u5230\u4e0b\u4e00\u500b\u7a0b\u5e8f\u3002\u9019\u7a2e\u8ff4\u5708\u64cd\u4f5c\u53ef\u4ee5\u900f\u904e\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
    • \u8cc7\u6599\u7de9\u885d\u5340\uff1a\u5728\u67d0\u4e9b\u8cc7\u6599\u7de9\u885d\u5340\u7684\u5be6\u73fe\u4e2d\uff0c\u4e5f\u53ef\u80fd\u6703\u4f7f\u7528\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3002\u6bd4\u5982\u5728\u97f3\u8a0a\u3001\u5f71\u7247\u64ad\u653e\u5668\u4e2d\uff0c\u8cc7\u6599\u6d41\u53ef\u80fd\u6703\u88ab\u5206\u6210\u591a\u500b\u7de9\u885d\u584a\u4e26\u653e\u5165\u4e00\u500b\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\uff0c\u4ee5\u4fbf\u5be6\u73fe\u7121\u7e2b\u64ad\u653e\u3002
    "},{"location":"chapter_array_and_linkedlist/list/","title":"4.3 \u00a0 \u4e32\u5217","text":"

    \u4e32\u5217\uff08list\uff09\u662f\u4e00\u500b\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\u6982\u5ff5\uff0c\u5b83\u8868\u793a\u5143\u7d20\u7684\u6709\u5e8f\u96c6\u5408\uff0c\u652f\u6301\u5143\u7d20\u8a2a\u554f\u3001\u4fee\u6539\u3001\u65b0\u589e\u3001\u522a\u9664\u548c\u8d70\u8a2a\u7b49\u64cd\u4f5c\uff0c\u7121\u9808\u4f7f\u7528\u8005\u8003\u616e\u5bb9\u91cf\u9650\u5236\u7684\u554f\u984c\u3002\u4e32\u5217\u53ef\u4ee5\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u5be6\u73fe\u3002

    • \u93c8\u7d50\u4e32\u5217\u5929\u7136\u53ef\u4ee5\u770b\u4f5c\u4e00\u500b\u4e32\u5217\uff0c\u5176\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\u64cd\u4f5c\uff0c\u4e26\u4e14\u53ef\u4ee5\u9748\u6d3b\u52d5\u614b\u64f4\u5bb9\u3002
    • \u9663\u5217\u4e5f\u652f\u6301\u5143\u7d20\u589e\u522a\u67e5\u6539\uff0c\u4f46\u7531\u65bc\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u53ea\u80fd\u770b\u4f5c\u4e00\u500b\u5177\u6709\u9577\u5ea6\u9650\u5236\u7684\u4e32\u5217\u3002

    \u7576\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u4e32\u5217\u6642\uff0c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u7684\u6027\u8cea\u6703\u5c0e\u81f4\u4e32\u5217\u7684\u5be6\u7528\u6027\u964d\u4f4e\u3002\u9019\u662f\u56e0\u70ba\u6211\u5011\u901a\u5e38\u7121\u6cd5\u4e8b\u5148\u78ba\u5b9a\u9700\u8981\u5132\u5b58\u591a\u5c11\u8cc7\u6599\uff0c\u5f9e\u800c\u96e3\u4ee5\u9078\u64c7\u5408\u9069\u7684\u4e32\u5217\u9577\u5ea6\u3002\u82e5\u9577\u5ea6\u904e\u5c0f\uff0c\u5247\u5f88\u53ef\u80fd\u7121\u6cd5\u6eff\u8db3\u4f7f\u7528\u9700\u6c42\uff1b\u82e5\u9577\u5ea6\u904e\u5927\uff0c\u5247\u6703\u9020\u6210\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002

    \u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff08dynamic array\uff09\u4f86\u5be6\u73fe\u4e32\u5217\u3002\u5b83\u7e7c\u627f\u4e86\u9663\u5217\u7684\u5404\u9805\u512a\u9ede\uff0c\u4e26\u4e14\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u9032\u884c\u52d5\u614b\u64f4\u5bb9\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u6a19\u6e96\u5eab\u63d0\u4f9b\u7684\u4e32\u5217\u662f\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\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\u4f86\u7684\u8a0e\u8ad6\u4e2d\uff0c\u6211\u5011\u5c07\u628a\u201c\u4e32\u5217\u201d\u548c\u201c\u52d5\u614b\u9663\u5217\u201d\u8996\u70ba\u7b49\u540c\u7684\u6982\u5ff5\u3002

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

    \u6211\u5011\u901a\u5e38\u4f7f\u7528\u201c\u7121\u521d\u59cb\u503c\u201d\u548c\u201c\u6709\u521d\u59cb\u503c\u201d\u9019\u5169\u7a2e\u521d\u59cb\u5316\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u521d\u59cb\u5316\u4e32\u5217\n# \u7121\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\u4e32\u5217 */\n// \u9700\u6ce8\u610f\uff0cC++ \u4e2d vector \u5373\u662f\u672c\u6587\u63cf\u8ff0\u7684 nums\n// \u7121\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\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nList<Integer> nums1 = new ArrayList<>();\n// \u6709\u521d\u59cb\u503c\uff08\u6ce8\u610f\u9663\u5217\u7684\u5143\u7d20\u578b\u5225\u9700\u70ba int[] \u7684\u5305\u88dd\u985e\u5225 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\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nnums1 := []int{}\n// \u6709\u521d\u59cb\u503c\nnums := []int{1, 3, 2, 5, 4}\n
    list.swift
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nlet nums1: [Int] = []\n// \u6709\u521d\u59cb\u503c\nvar nums = [1, 3, 2, 5, 4]\n
    list.js
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\u521d\u59cb\u503c\nconst nums1 = [];\n// \u6709\u521d\u59cb\u503c\nconst nums = [1, 3, 2, 5, 4];\n
    list.ts
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\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\u4e32\u5217 */\n// \u7121\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\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u521d\u59cb\u5316\u4e32\u5217 */\n// \u7121\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\u4e32\u5217\n# \u7121\u521d\u59cb\u503c\nnums1 = []\n# \u6709\u521d\u59cb\u503c\nnums = [1, 3, 2, 5, 4]\n
    list.zig
    // \u521d\u59cb\u5316\u4e32\u5217\nvar nums = std.ArrayList(i32).init(std.heap.page_allocator);\ndefer nums.deinit();\ntry nums.appendSlice(&[_]i32{ 1, 3, 2, 5, 4 });\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u4e32\u5217\u672c\u8cea\u4e0a\u662f\u9663\u5217\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u8a2a\u554f\u548c\u66f4\u65b0\u5143\u7d20\uff0c\u6548\u7387\u5f88\u9ad8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u8a2a\u554f\u5143\u7d20\nnum: int = nums[1]  # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0    # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.cpp
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.java
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums.get(1);  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums.set(1, 0);  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.cs
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list_test.go
    /* \u8a2a\u554f\u5143\u7d20 */\nnum := nums[1]  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0     // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.swift
    /* \u8a2a\u554f\u5143\u7d20 */\nlet num = nums[1] // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0 // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.js
    /* \u8a2a\u554f\u5143\u7d20 */\nconst num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.ts
    /* \u8a2a\u554f\u5143\u7d20 */\nconst num: number = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.dart
    /* \u8a2a\u554f\u5143\u7d20 */\nint num = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;  // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.rs
    /* \u8a2a\u554f\u5143\u7d20 */\nlet num: i32 = nums[1];  // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0;             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u8a2a\u554f\u5143\u7d20 */\nval num = nums[1]       // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n/* \u66f4\u65b0\u5143\u7d20 */\nnums[1] = 0             // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.rb
    # \u8a2a\u554f\u5143\u7d20\nnum = nums[1] # \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n# \u66f4\u65b0\u5143\u7d20\nnums[1] = 0 # \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    list.zig
    // \u8a2a\u554f\u5143\u7d20\nvar num = nums.items[1]; // \u8a2a\u554f\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\n\n// \u66f4\u65b0\u5143\u7d20\nnums.items[1] = 0; // \u5c07\u7d22\u5f15 1 \u8655\u7684\u5143\u7d20\u66f4\u65b0\u70ba 0\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u76f8\u8f03\u65bc\u9663\u5217\uff0c\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5730\u65b0\u589e\u8207\u522a\u9664\u5143\u7d20\u3002\u5728\u4e32\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u7684\u6548\u7387\u4ecd\u8207\u9663\u5217\u76f8\u540c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6e05\u7a7a\u4e32\u5217\nnums.clear()\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6)  # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.pop(3)        # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.cpp
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(nums.begin() + 3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.erase(nums.begin() + 3);      // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.java
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.cs
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.Clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.Add(1);\nnums.Add(3);\nnums.Add(2);\nnums.Add(5);\nnums.Add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.Insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.RemoveAt(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list_test.go
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums = nil\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20 */\nnums = append(nums[:3], append([]int{6}, nums[3:]...)...) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums = append(nums[:3], nums[4:]...) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.swift
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.removeAll()\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.append(1)\nnums.append(3)\nnums.append(2)\nnums.append(5)\nnums.append(4)\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(6, at: 3) // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(at: 3) // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.js
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.ts
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.length = 0;\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.splice(3, 0, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.splice(3, 1);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.dart
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.removeAt(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.rs
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.push(1);\nnums.push(3);\nnums.push(2);\nnums.push(5);\nnums.push(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.insert(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);    // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u6e05\u7a7a\u4e32\u5217 */\nnums.clear();\n\n/* \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20 */\nnums.add(1);\nnums.add(3);\nnums.add(2);\nnums.add(5);\nnums.add(4);\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nnums.add(3, 6);  // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n/* \u522a\u9664\u5143\u7d20 */\nnums.remove(3);  // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.rb
    # \u6e05\u7a7a\u4e32\u5217\nnums.clear\n\n# \u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\nnums << 1\nnums << 3\nnums << 2\nnums << 5\nnums << 4\n\n# \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20\nnums.insert(3, 6) # \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n# \u522a\u9664\u5143\u7d20\nnums.delete_at(3) # \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    list.zig
    // \u6e05\u7a7a\u4e32\u5217\nnums.clearRetainingCapacity();\n\n// \u5728\u5c3e\u90e8\u65b0\u589e\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\u9593\u63d2\u5165\u5143\u7d20\ntry nums.insert(3, 6); // \u5728\u7d22\u5f15 3 \u8655\u63d2\u5165\u6578\u5b57 6\n\n// \u522a\u9664\u5143\u7d20\n_ = nums.orderedRemove(3); // \u522a\u9664\u7d22\u5f15 3 \u8655\u7684\u5143\u7d20\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#4","title":"4. \u00a0 \u8d70\u8a2a\u4e32\u5217","text":"

    \u8207\u9663\u5217\u4e00\u6a23\uff0c\u4e32\u5217\u53ef\u4ee5\u6839\u64da\u7d22\u5f15\u8d70\u8a2a\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8d70\u8a2a\u5404\u5143\u7d20\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in range(len(nums)):\n    count += nums[i]\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\nfor num in nums:\n    count += num\n
    list.cpp
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (int num : nums) {\n    count += num;\n}\n
    list.java
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.size(); i++) {\n    count += nums.get(i);\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (int num : nums) {\n    count += num;\n}\n
    list.cs
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (int i = 0; i < nums.Count; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nforeach (int num in nums) {\n    count += num;\n}\n
    list_test.go
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\ncount := 0\nfor i := 0; i < len(nums); i++ {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor _, num := range nums {\n    count += num\n}\n
    list.swift
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor i in nums.indices {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0\nfor num in nums {\n    count += num\n}\n
    list.js
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.ts
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nlet count = 0;\nfor (let i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (const num of nums) {\n    count += num;\n}\n
    list.dart
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nint count = 0;\nfor (var i = 0; i < nums.length; i++) {\n    count += nums[i];\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\ncount = 0;\nfor (var num in nums) {\n    count += num;\n}\n
    list.rs
    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nlet mut _count = 0;\nfor i in 0..nums.len() {\n    _count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\n_count = 0;\nfor num in &nums {\n    _count += num;\n}\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217 */\nvar count = 0\nfor (i in nums.indices) {\n    count += nums[i]\n}\n\n/* \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20 */\nfor (num in nums) {\n    count += num\n}\n
    list.rb
    # \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\ncount = 0\nfor i in 0...nums.length\n    count += nums[i]\nend\n\n# \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0\nfor num in nums\n    count += num\nend\n
    list.zig
    // \u900f\u904e\u7d22\u5f15\u8d70\u8a2a\u4e32\u5217\nvar count: i32 = 0;\nvar i: i32 = 0;\nwhile (i < nums.items.len) : (i += 1) {\n    count += nums[i];\n}\n\n// \u76f4\u63a5\u8d70\u8a2a\u4e32\u5217\u5143\u7d20\ncount = 0;\nfor (nums.items) |num| {\n    count += num;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7d66\u5b9a\u4e00\u500b\u65b0\u4e32\u5217 nums1 \uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u62fc\u63a5\u5230\u539f\u4e32\u5217\u7684\u5c3e\u90e8\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1: list[int] = [6, 8, 7, 10, 9]\nnums += nums1  # \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.cpp
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nvector<int> nums1 = { 6, 8, 7, 10, 9 };\n// \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\nnums.insert(nums.end(), nums1.begin(), nums1.end());\n
    list.java
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<Integer> nums1 = new ArrayList<>(Arrays.asList(new Integer[] { 6, 8, 7, 10, 9 }));\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.cs
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.AddRange(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list_test.go
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nnums1 := []int{6, 8, 7, 10, 9}\nnums = append(nums, nums1...)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.swift
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1 = [6, 8, 7, 10, 9]\nnums.append(contentsOf: nums1) // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.js
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1 = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.ts
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nconst nums1: number[] = [6, 8, 7, 10, 9];\nnums.push(...nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.dart
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nList<int> nums1 = [6, 8, 7, 10, 9];\nnums.addAll(nums1);  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.rs
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nlet nums1: Vec<i32> = vec![6, 8, 7, 10, 9];\nnums.extend(nums1);\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u62fc\u63a5\u5169\u500b\u4e32\u5217 */\nval nums1 = intArrayOf(6, 8, 7, 10, 9).toMutableList()\nnums.addAll(nums1)  // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    list.rb
    # \u62fc\u63a5\u5169\u500b\u4e32\u5217\nnums1 = [6, 8, 7, 10, 9]\nnums += nums1\n
    list.zig
    // \u62fc\u63a5\u5169\u500b\u4e32\u5217\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); // \u5c07\u4e32\u5217 nums1 \u62fc\u63a5\u5230 nums \u4e4b\u5f8c\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u5b8c\u6210\u4e32\u5217\u6392\u5e8f\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u4ee5\u4f7f\u7528\u5728\u9663\u5217\u985e\u5225\u6f14\u7b97\u6cd5\u984c\u4e2d\u7d93\u5e38\u8003\u67e5\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u548c\u201c\u96d9\u6307\u6a19\u201d\u6f14\u7b97\u6cd5\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig list.py
    # \u6392\u5e8f\u4e32\u5217\nnums.sort()  # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.cpp
    /* \u6392\u5e8f\u4e32\u5217 */\nsort(nums.begin(), nums.end());  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.java
    /* \u6392\u5e8f\u4e32\u5217 */\nCollections.sort(nums);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.cs
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.Sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list_test.go
    /* \u6392\u5e8f\u4e32\u5217 */\nsort.Ints(nums)  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.swift
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.js
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.ts
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort((a, b) => a - b);  // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.dart
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.rs
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort(); // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u52d5\u614b\u9663\u5217\n
    list.kt
    /* \u6392\u5e8f\u4e32\u5217 */\nnums.sort() // \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.rb
    # \u6392\u5e8f\u4e32\u5217\nnums = nums.sort { |a, b| a <=> b } # \u6392\u5e8f\u5f8c\uff0c\u4e32\u5217\u5143\u7d20\u5f9e\u5c0f\u5230\u5927\u6392\u5217\n
    list.zig
    // \u6392\u5e8f\u4e32\u5217\nstd.sort.sort(i32, nums.items, {}, comptime std.sort.asc(i32));\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/list/#432","title":"4.3.2 \u00a0 \u4e32\u5217\u5be6\u73fe","text":"

    \u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u4e86\u4e32\u5217\uff0c\u4f8b\u5982 Java\u3001C++\u3001Python \u7b49\u3002\u5b83\u5011\u7684\u5be6\u73fe\u6bd4\u8f03\u8907\u96dc\uff0c\u5404\u500b\u53c3\u6578\u7684\u8a2d\u5b9a\u4e5f\u975e\u5e38\u8003\u7a76\uff0c\u4f8b\u5982\u521d\u59cb\u5bb9\u91cf\u3001\u64f4\u5bb9\u500d\u6578\u7b49\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u539f\u59cb\u78bc\u9032\u884c\u5b78\u7fd2\u3002

    \u70ba\u4e86\u52a0\u6df1\u5c0d\u4e32\u5217\u5de5\u4f5c\u539f\u7406\u7684\u7406\u89e3\uff0c\u6211\u5011\u5617\u8a66\u5be6\u73fe\u4e00\u500b\u7c21\u6613\u7248\u4e32\u5217\uff0c\u5305\u62ec\u4ee5\u4e0b\u4e09\u500b\u91cd\u9ede\u8a2d\u8a08\u3002

    • \u521d\u59cb\u5bb9\u91cf\uff1a\u9078\u53d6\u4e00\u500b\u5408\u7406\u7684\u9663\u5217\u521d\u59cb\u5bb9\u91cf\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u9078\u64c7 10 \u4f5c\u70ba\u521d\u59cb\u5bb9\u91cf\u3002
    • \u6578\u91cf\u8a18\u9304\uff1a\u5ba3\u544a\u4e00\u500b\u8b8a\u6578 size \uff0c\u7528\u65bc\u8a18\u9304\u4e32\u5217\u7576\u524d\u5143\u7d20\u6578\u91cf\uff0c\u4e26\u96a8\u8457\u5143\u7d20\u63d2\u5165\u548c\u522a\u9664\u5be6\u6642\u66f4\u65b0\u3002\u6839\u64da\u6b64\u8b8a\u6578\uff0c\u6211\u5011\u53ef\u4ee5\u5b9a\u4f4d\u4e32\u5217\u5c3e\u90e8\uff0c\u4ee5\u53ca\u5224\u65b7\u662f\u5426\u9700\u8981\u64f4\u5bb9\u3002
    • \u64f4\u5bb9\u6a5f\u5236\uff1a\u82e5\u63d2\u5165\u5143\u7d20\u6642\u4e32\u5217\u5bb9\u91cf\u5df2\u6eff\uff0c\u5247\u9700\u8981\u9032\u884c\u64f4\u5bb9\u3002\u5148\u6839\u64da\u64f4\u5bb9\u500d\u6578\u5efa\u7acb\u4e00\u500b\u66f4\u5927\u7684\u9663\u5217\uff0c\u518d\u5c07\u7576\u524d\u9663\u5217\u7684\u6240\u6709\u5143\u7d20\u4f9d\u6b21\u79fb\u52d5\u81f3\u65b0\u9663\u5217\u3002\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u5011\u898f\u5b9a\u6bcf\u6b21\u5c07\u9663\u5217\u64f4\u5bb9\u81f3\u4e4b\u524d\u7684 2 \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_list.py
    class MyList:\n    \"\"\"\u4e32\u5217\u985e\u5225\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._capacity: int = 10  # \u4e32\u5217\u5bb9\u91cf\n        self._arr: list[int] = [0] * self._capacity  # \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        self._size: int = 0  # \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        self._extend_ratio: int = 2  # \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\"\"\"\n        return self._size\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return self._capacity\n\n    def get(self, index: int) -> int:\n        \"\"\"\u8a2a\u554f\u5143\u7d20\"\"\"\n        # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20\"\"\"\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\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\u9593\u63d2\u5165\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self._size == self.capacity():\n            self.extend_capacity()\n        # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        self._size += 1\n\n    def remove(self, index: int) -> int:\n        \"\"\"\u522a\u9664\u5143\u7d20\"\"\"\n        if index < 0 or index >= self._size:\n            raise IndexError(\"\u7d22\u5f15\u8d8a\u754c\")\n        num = self._arr[index]\n        # \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in range(index, self._size - 1):\n            self._arr[j] = self._arr[j + 1]\n        # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self._size -= 1\n        # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n\n    def extend_capacity(self):\n        \"\"\"\u4e32\u5217\u64f4\u5bb9\"\"\"\n        # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        self._arr = self._arr + [0] * self.capacity() * (self._extend_ratio - 1)\n        # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self._capacity = len(self._arr)\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217\"\"\"\n        return self._arr[: self._size]\n
    my_list.cpp
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  private:\n    int *arr;             // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int arrCapacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    int arrSize = 0;      // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    int extendRatio = 2;   // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~MyList() {\n        delete[] arr;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    int size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    int capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        arr[size()] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size() == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\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        // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size() - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\n        int newCapacity = capacity() * extendRatio;\n        int *tmp = arr;\n        arr = new int[newCapacity];\n        // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n        for (int i = 0; i < size(); i++) {\n            arr[i] = tmp[i];\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete[] tmp;\n        arrCapacity = newCapacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Vector \u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    private int size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private int extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[capacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    public int size() {\n        return size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int capacity() {\n        return capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public void add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        arr[size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < size - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = Arrays.copyOf(arr, capacity() * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] toArray() {\n        int size = size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private int[] arr;           // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private int arrCapacity = 10;    // \u4e32\u5217\u5bb9\u91cf\n    private int arrSize = 0;         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private readonly int extendRatio = 2;  // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    public MyList() {\n        arr = new int[arrCapacity];\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public int Size() {\n        return arrSize;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public int Capacity() {\n        return arrCapacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public int Get(int index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public void Add(int num) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        arr[arrSize] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (arrSize == arrCapacity)\n            ExtendCapacity();\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        arrSize++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (int j = index; j < arrSize - 1; j++) {\n            arr[j] = arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        arrSize--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public void ExtendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba arrCapacity * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        Array.Resize(ref arr, arrCapacity * extendRatio);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        arrCapacity = arr.Length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\ntype myList struct {\n    arrCapacity int\n    arr         []int\n    arrSize     int\n    extendRatio int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newMyList() *myList {\n    return &myList{\n        arrCapacity: 10,              // \u4e32\u5217\u5bb9\u91cf\n        arr:         make([]int, 10), // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrSize:     0,               // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: 2,               // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n    }\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\nfunc (l *myList) size() int {\n    return l.arrSize\n}\n\n/*  \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nfunc (l *myList) capacity() int {\n    return l.arrCapacity\n}\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfunc (l *myList) get(index int) int {\n    // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\nfunc (l *myList) add(num int) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    l.arr[l.arrSize] = num\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if l.arrSize == l.arrCapacity {\n        l.extendCapacity()\n    }\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    l.arrSize++\n}\n\n/* \u522a\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    // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n    l.arrSize--\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return num\n}\n\n/* \u4e32\u5217\u64f4\u5bb9 */\nfunc (l *myList) extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    l.arr = append(l.arr, make([]int, l.arrCapacity*(l.extendRatio-1))...)\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    l.arrCapacity = len(l.arr)\n}\n\n/* \u8fd4\u56de\u6709\u6548\u9577\u5ea6\u7684\u4e32\u5217 */\nfunc (l *myList) toArray() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n    return l.arr[:l.arrSize]\n}\n
    my_list.swift
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: [Int] // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var _capacity: Int // \u4e32\u5217\u5bb9\u91cf\n    private var _size: Int // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private let extendRatio: Int // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init() {\n        _capacity = 10\n        _size = 0\n        extendRatio = 2\n        arr = Array(repeating: 0, count: _capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    func size() -> Int {\n        _size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    func capacity() -> Int {\n        _capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    func get(index: Int) -> Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\u5247\u4e1f\u64f2\u932f\u8aa4\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\u65b0\u589e\u5143\u7d20 */\n    func add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        arr[size()] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if size() == capacity() {\n            extendCapacity()\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        _size += 1\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in index ..< (size() - 1) {\n            arr[j] = arr[j + 1]\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        _size -= 1\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    func extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr + Array(repeating: 0, count: capacity() * (extendRatio - 1))\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        _capacity = arr.count\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    func toArray() -> [Int] {\n        Array(arr.prefix(size()))\n    }\n}\n
    my_list.js
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    #arr = new Array(); // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    #capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n    #size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    #extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#arr = new Array(this.#capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    size() {\n        return this.#size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    capacity() {\n        return this.#capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    get(index) {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    add(num) {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.#arr[this.#size] = num;\n        this.#size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this.#size === this.#capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        this.#arr[index] = num;\n        this.#size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n        this.#size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.#arr = this.#arr.concat(\n            new Array(this.capacity() * (this.#extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this.#capacity = this.#arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    toArray() {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private arr: Array<number>; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private _capacity: number = 10; // \u4e32\u5217\u5bb9\u91cf\n    private _size: number = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private extendRatio: number = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.arr = new Array(this._capacity);\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    public size(): number {\n        return this._size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    public capacity(): number {\n        return this._capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    public get(index: number): number {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    public add(num: number): void {\n        // \u5982\u679c\u9577\u5ea6\u7b49\u65bc\u5bb9\u91cf\uff0c\u5247\u9700\u8981\u64f4\u5bb9\n        if (this._size === this._capacity) this.extendCapacity();\n        // \u5c07\u65b0\u5143\u7d20\u65b0\u589e\u5230\u4e32\u5217\u5c3e\u90e8\n        this.arr[this._size] = num;\n        this._size++;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (this._size === this._capacity) {\n            this.extendCapacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        this.arr[index] = num;\n        this._size++;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n        this._size--;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    public extendCapacity(): void {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        this.arr = this.arr.concat(\n            new Array(this.capacity() * (this.extendRatio - 1))\n        );\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        this._capacity = this.arr.length;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    public toArray(): number[] {\n        let size = this.size();\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n  late List<int> _arr; // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n  int _capacity = 10; // \u4e32\u5217\u5bb9\u91cf\n  int _size = 0; // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  int _extendRatio = 2; // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n  /* \u5efa\u69cb\u5b50 */\n  MyList() {\n    _arr = List.filled(_capacity, 0);\n  }\n\n  /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n  int size() => _size;\n\n  /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n  int capacity() => _capacity;\n\n  /* \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 */\n  void add(int _num) {\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    _arr[_size] = _num;\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size++;\n  }\n\n  /* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\n  void insert(int index, int _num) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (_size == _capacity) extendCapacity();\n    // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    _size++;\n  }\n\n  /* \u522a\u9664\u5143\u7d20 */\n  int remove(int index) {\n    if (index >= _size) throw RangeError('\u7d22\u5f15\u8d8a\u754c');\n    int _num = _arr[index];\n    // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for (var j = index; j < _size - 1; j++) {\n      _arr[j] = _arr[j + 1];\n    }\n    // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    _size--;\n    // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    return _num;\n  }\n\n  /* \u4e32\u5217\u64f4\u5bb9 */\n  void extendCapacity() {\n    // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 _extendRatio \u500d\u7684\u65b0\u9663\u5217\n    final _newNums = List.filled(_capacity * _extendRatio, 0);\n    // \u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    List.copyRange(_newNums, 0, _arr);\n    // \u66f4\u65b0 _arr \u7684\u5f15\u7528\n    _arr = _newNums;\n    // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    _capacity = _arr.length;\n  }\n\n  /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\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
    /* \u4e32\u5217\u985e\u5225 */\n#[allow(dead_code)]\nstruct MyList {\n    arr: Vec<i32>,       // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    capacity: usize,     // \u4e32\u5217\u5bb9\u91cf\n    size: usize,         // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    extend_ratio: usize, // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n}\n\n#[allow(unused, unused_comparisons)]\nimpl MyList {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09*/\n    pub fn size(&self) -> usize {\n        return self.size;\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        return self.capacity;\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    pub fn get(&self, index: usize) -> i32 {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    pub fn add(&mut self, num: i32) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        self.arr[self.size] = num;\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if self.size == self.capacity() {\n            self.extend_capacity();\n        }\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        self.size += 1;\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for j in (index..self.size - 1) {\n            self.arr[j] = self.arr[j + 1];\n        }\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        self.size -= 1;\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num;\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    pub fn extend_capacity(&mut self) {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        let new_capacity = self.capacity * self.extend_ratio;\n        self.arr.resize(new_capacity, 0);\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        self.capacity = new_capacity;\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    pub fn to_array(&mut self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    /* \u4e32\u5217\u985e\u5225 */\ntypedef struct {\n    int *arr;        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    int capacity;    // \u4e32\u5217\u5bb9\u91cf\n    int size;        // \u4e32\u5217\u5927\u5c0f\n    int extendRatio; // \u4e32\u5217\u6bcf\u6b21\u64f4\u5bb9\u7684\u500d\u6578\n} MyList;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delMyList(MyList *nums) {\n    free(nums->arr);\n    free(nums);\n}\n\n/* \u7372\u53d6\u4e32\u5217\u9577\u5ea6 */\nint size(MyList *nums) {\n    return nums->size;\n}\n\n/* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\nint capacity(MyList *nums) {\n    return nums->capacity;\n}\n\n/* \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 */\nvoid add(MyList *nums, int num) {\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\u5bb9\n    }\n    nums->arr[size(nums)] = num;\n    nums->size++;\n}\n\n/* \u5728\u4e2d\u9593\u63d2\u5165\u5143\u7d20 */\nvoid insert(MyList *nums, int index, int num) {\n    assert(index >= 0 && index < size(nums));\n    // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    if (size(nums) == capacity(nums)) {\n        extendCapacity(nums); // \u64f4\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/* \u522a\u9664\u5143\u7d20 */\n// \u6ce8\u610f\uff1astdio.h \u4f54\u7528\u4e86 remove \u95dc\u9375\u8a5e\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/* \u4e32\u5217\u64f4\u5bb9 */\nvoid extendCapacity(MyList *nums) {\n    // \u5148\u5206\u914d\u7a7a\u9593\n    int newCapacity = capacity(nums) * nums->extendRatio;\n    int *extend = (int *)malloc(sizeof(int) * newCapacity);\n    int *temp = nums->arr;\n\n    // \u8907\u88fd\u820a\u8cc7\u6599\u5230\u65b0\u8cc7\u6599\n    for (int i = 0; i < size(nums); i++)\n        extend[i] = nums->arr[i];\n\n    // \u91cb\u653e\u820a\u8cc7\u6599\n    free(temp);\n\n    // \u66f4\u65b0\u65b0\u8cc7\u6599\n    nums->arr = extend;\n    nums->capacity = newCapacity;\n}\n\n/* \u5c07\u4e32\u5217\u8f49\u63db\u70ba Array \u7528\u65bc\u5217\u5370 */\nint *toArray(MyList *nums) {\n    return nums->arr;\n}\n
    my_list.kt
    /* \u4e32\u5217\u985e\u5225 */\nclass MyList {\n    private var arr: IntArray = intArrayOf() // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n    private var capacity: Int = 10 // \u4e32\u5217\u5bb9\u91cf\n    private var size: Int = 0 // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n    private var extendRatio: Int = 2 // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        arr = IntArray(capacity)\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09 */\n    fun size(): Int {\n        return size\n    }\n\n    /* \u7372\u53d6\u4e32\u5217\u5bb9\u91cf */\n    fun capacity(): Int {\n        return capacity\n    }\n\n    /* \u8a2a\u554f\u5143\u7d20 */\n    fun get(index: Int): Int {\n        // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20 */\n    fun add(num: Int) {\n        // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        arr[size] = num\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size++\n    }\n\n    /* \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n        if (size == capacity())\n            extendCapacity()\n        // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n        size++\n    }\n\n    /* \u522a\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        // \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n        for (j in index..<size - 1)\n            arr[j] = arr[j + 1]\n        // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n        size--\n        // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n        return num\n    }\n\n    /* \u4e32\u5217\u64f4\u5bb9 */\n    fun extendCapacity() {\n        // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extendRatio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n        arr = arr.copyOf(capacity() * extendRatio)\n        // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n        capacity = arr.size\n    }\n\n    /* \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 */\n    fun toArray(): IntArray {\n        val size = size()\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    ### \u4e32\u5217\u985e\u5225 ###\nclass MyList\n  attr_reader :size       # \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n  attr_reader :capacity   # \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @capacity = 10\n    @size = 0\n    @extend_ratio = 2\n    @arr = Array.new(capacity)\n  end\n\n  ### \u8a2a\u554f\u5143\u7d20 ###\n  def get(index)\n    # \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\u5e38\uff0c\u4e0b\u540c\n    raise IndexError, \"\u7d22\u5f15\u8d8a\u754c\" if index < 0 || index >= size\n    @arr[index]\n  end\n\n  ### \u8a2a\u554f\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\u65b0\u589e\u5143\u7d20 ###\n  def add(num)\n    # \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n    @arr[size] = num\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n    extend_capacity if size == capacity\n\n    # \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n    @size += 1\n  end\n\n  ### \u522a\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    # \u5c07\u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\u4e00\u4f4d\n    for j in index...size\n      @arr[j] = @arr[j + 1]\n    end\n\n    # \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n    @size -= 1\n\n    # \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n    num\n  end\n\n  ### \u4e32\u5217\u64f4\u5bb9 ###\n  def extend_capacity\n    # \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba\u539f\u9663\u5217 extend_ratio \u500d\u7684\u65b0\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n    arr = @arr.dup + Array.new(capacity * (@extend_ratio - 1))\n    # \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n    @capacity = arr.length\n  end\n\n  ### \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217 ###\n  def to_array\n    sz = size\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    // \u4e32\u5217\u985e\u5225\nfn MyList(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        arr: []T = undefined,                        // \u9663\u5217\uff08\u5132\u5b58\u4e32\u5217\u5143\u7d20\uff09\n        arrCapacity: usize = 10,                     // \u4e32\u5217\u5bb9\u91cf\n        numSize: usize = 0,                           // \u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        extendRatio: usize = 2,                       // \u6bcf\u6b21\u4e32\u5217\u64f4\u5bb9\u7684\u500d\u6578\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined, // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4e32\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.arr = try self.mem_allocator.alloc(T, self.arrCapacity);\n            @memset(self.arr, @as(T, 0));\n        }\n\n        // \u6790\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u9577\u5ea6\uff08\u7576\u524d\u5143\u7d20\u6578\u91cf\uff09\n        pub fn size(self: *Self) usize {\n            return self.numSize;\n        }\n\n        // \u7372\u53d6\u4e32\u5217\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.arrCapacity;\n        }\n\n        // \u8a2a\u554f\u5143\u7d20\n        pub fn get(self: *Self, index: usize) T {\n            // \u7d22\u5f15\u5982\u679c\u8d8a\u754c\uff0c\u5247\u4e1f\u64f2\u7570\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\u5247\u4e1f\u64f2\u7570\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\u65b0\u589e\u5143\u7d20\n        pub fn add(self: *Self, num: T) !void {\n            // \u5143\u7d20\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            self.arr[self.size()] = num;\n            // \u66f4\u65b0\u5143\u7d20\u6578\u91cf\n            self.numSize += 1;\n        }  \n\n        // \u5728\u4e2d\u9593\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\u6578\u91cf\u8d85\u51fa\u5bb9\u91cf\u6642\uff0c\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\n            if (self.size() == self.capacity()) try self.extendCapacity();\n            // \u5c07\u7d22\u5f15 index \u4ee5\u53ca\u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u5f8c\u79fb\u52d5\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\u6578\u91cf\n            self.numSize += 1;\n        }\n\n        // \u522a\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            // \u5c07\u7d22\u5f15 index \u4e4b\u5f8c\u7684\u5143\u7d20\u90fd\u5411\u524d\u79fb\u52d5\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\u6578\u91cf\n            self.numSize -= 1;\n            // \u8fd4\u56de\u88ab\u522a\u9664\u7684\u5143\u7d20\n            return num;\n        }\n\n        // \u4e32\u5217\u64f4\u5bb9\n        pub fn extendCapacity(self: *Self) !void {\n            // \u65b0\u5efa\u4e00\u500b\u9577\u5ea6\u70ba size * extendRatio \u7684\u9663\u5217\uff0c\u4e26\u5c07\u539f\u9663\u5217\u8907\u88fd\u5230\u65b0\u9663\u5217\n            var newCapacity = self.capacity() * self.extendRatio;\n            var extend = try self.mem_allocator.alloc(T, newCapacity);\n            @memset(extend, @as(T, 0));\n            // \u5c07\u539f\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\u8907\u88fd\u5230\u65b0\u9663\u5217\n            std.mem.copy(T, extend, self.arr);\n            self.arr = extend;\n            // \u66f4\u65b0\u4e32\u5217\u5bb9\u91cf\n            self.arrCapacity = newCapacity;\n        }\n\n        // \u5c07\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/","title":"4.4 \u00a0 \u8a18\u61b6\u9ad4\u8207\u5feb\u53d6 *","text":"

    \u5728\u672c\u7ae0\u7684\u524d\u5169\u7bc0\u4e2d\uff0c\u6211\u5011\u63a2\u8a0e\u4e86\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u9019\u5169\u7a2e\u57fa\u790e\u4e14\u91cd\u8981\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b83\u5011\u5206\u5225\u4ee3\u8868\u4e86\u201c\u9023\u7e8c\u5132\u5b58\u201d\u548c\u201c\u5206\u6563\u5132\u5b58\u201d\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u3002

    \u5be6\u969b\u4e0a\uff0c\u7269\u7406\u7d50\u69cb\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u6c7a\u5b9a\u4e86\u7a0b\u5f0f\u5c0d\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u7684\u4f7f\u7528\u6548\u7387\uff0c\u9032\u800c\u5f71\u97ff\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u7684\u6574\u9ad4\u6548\u80fd\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#441","title":"4.4.1 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u88dd\u7f6e","text":"

    \u8a08\u7b97\u6a5f\u4e2d\u5305\u62ec\u4e09\u7a2e\u985e\u578b\u7684\u5132\u5b58\u88dd\u7f6e\uff1a\u786c\u789f\uff08hard disk\uff09\u3001\u8a18\u61b6\u9ad4\uff08random-access memory, RAM\uff09\u3001\u5feb\u53d6\uff08cache memory\uff09\u3002\u8868 4-2 \u5c55\u793a\u4e86\u5b83\u5011\u5728\u8a08\u7b97\u6a5f\u7cfb\u7d71\u4e2d\u7684\u4e0d\u540c\u89d2\u8272\u548c\u6548\u80fd\u7279\u9ede\u3002

    \u8868 4-2 \u00a0 \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u88dd\u7f6e

    \u786c\u789f \u8a18\u61b6\u9ad4 \u5feb\u53d6 \u7528\u9014 \u9577\u671f\u5132\u5b58\u8cc7\u6599\uff0c\u5305\u62ec\u4f5c\u696d\u7cfb\u7d71\u3001\u7a0b\u5f0f\u3001\u6a94\u6848\u7b49 \u81e8\u6642\u5132\u5b58\u7576\u524d\u57f7\u884c\u7684\u7a0b\u5f0f\u548c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599 \u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u6e1b\u5c11 CPU \u8a2a\u554f\u8a18\u61b6\u9ad4\u7684\u6b21\u6578 \u6613\u5931\u6027 \u65b7\u96fb\u5f8c\u8cc7\u6599\u4e0d\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u65b7\u96fb\u5f8c\u8cc7\u6599\u6703\u4e1f\u5931 \u5bb9\u91cf \u8f03\u5927\uff0cTB \u7d1a\u5225 \u8f03\u5c0f\uff0cGB \u7d1a\u5225 \u975e\u5e38\u5c0f\uff0cMB \u7d1a\u5225 \u901f\u5ea6 \u8f03\u6162\uff0c\u5e7e\u767e\u5230\u5e7e\u5343 MB/s \u8f03\u5feb\uff0c\u5e7e\u5341 GB/s \u975e\u5e38\u5feb\uff0c\u5e7e\u5341\u5230\u5e7e\u767e GB/s \u50f9\u683c \u8f03\u4fbf\u5b9c\uff0c\u5e7e\u6bdb\u5230\u5e7e\u5143 / GB \u8f03\u8cb4\uff0c\u5e7e\u5341\u5230\u5e7e\u767e\u5143 / GB \u975e\u5e38\u8cb4\uff0c\u96a8 CPU \u6253\u5305\u8a08\u50f9

    \u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71\u60f3\u8c61\u70ba\u5716 4-9 \u6240\u793a\u7684\u91d1\u5b57\u5854\u7d50\u69cb\u3002\u8d8a\u9760\u8fd1\u91d1\u5b57\u5854\u9802\u7aef\u7684\u5132\u5b58\u88dd\u7f6e\u7684\u901f\u5ea6\u8d8a\u5feb\u3001\u5bb9\u91cf\u8d8a\u5c0f\u3001\u6210\u672c\u8d8a\u9ad8\u3002\u9019\u7a2e\u591a\u5c64\u7d1a\u7684\u8a2d\u8a08\u4e26\u975e\u5076\u7136\uff0c\u800c\u662f\u8a08\u7b97\u6a5f\u79d1\u5b78\u5bb6\u548c\u5de5\u7a0b\u5e2b\u5011\u7d93\u904e\u6df1\u601d\u719f\u616e\u7684\u7d50\u679c\u3002

    • \u786c\u789f\u96e3\u4ee5\u88ab\u8a18\u61b6\u9ad4\u53d6\u4ee3\u3002\u9996\u5148\uff0c\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u5728\u65b7\u96fb\u5f8c\u6703\u4e1f\u5931\uff0c\u56e0\u6b64\u5b83\u4e0d\u9069\u5408\u9577\u671f\u5132\u5b58\u8cc7\u6599\uff1b\u5176\u6b21\uff0c\u8a18\u61b6\u9ad4\u7684\u6210\u672c\u662f\u786c\u789f\u7684\u5e7e\u5341\u500d\uff0c\u9019\u4f7f\u5f97\u5b83\u96e3\u4ee5\u5728\u6d88\u8cbb\u8005\u5e02\u5834\u666e\u53ca\u3002
    • \u5feb\u53d6\u7684\u5927\u5bb9\u91cf\u548c\u9ad8\u901f\u5ea6\u96e3\u4ee5\u517c\u5f97\u3002\u96a8\u8457 L1\u3001L2\u3001L3 \u5feb\u53d6\u7684\u5bb9\u91cf\u9010\u6b65\u589e\u5927\uff0c\u5176\u7269\u7406\u5c3a\u5bf8\u6703\u8b8a\u5927\uff0c\u8207 CPU \u6838\u5fc3\u4e4b\u9593\u7684\u7269\u7406\u8ddd\u96e2\u6703\u8b8a\u9060\uff0c\u5f9e\u800c\u5c0e\u81f4\u8cc7\u6599\u50b3\u8f38\u6642\u9593\u589e\u52a0\uff0c\u5143\u7d20\u8a2a\u554f\u5ef6\u9072\u8b8a\u9ad8\u3002\u5728\u7576\u524d\u6280\u8853\u4e0b\uff0c\u591a\u5c64\u7d1a\u7684\u5feb\u53d6\u7d50\u69cb\u662f\u5bb9\u91cf\u3001\u901f\u5ea6\u548c\u6210\u672c\u4e4b\u9593\u7684\u6700\u4f73\u5e73\u8861\u9ede\u3002

    \u5716 4-9 \u00a0 \u8a08\u7b97\u6a5f\u5132\u5b58\u7cfb\u7d71

    Note

    \u8a08\u7b97\u6a5f\u7684\u5132\u5b58\u5c64\u6b21\u7d50\u69cb\u9ad4\u73fe\u4e86\u901f\u5ea6\u3001\u5bb9\u91cf\u548c\u6210\u672c\u4e09\u8005\u4e4b\u9593\u7684\u7cbe\u5999\u5e73\u8861\u3002\u5be6\u969b\u4e0a\uff0c\u9019\u7a2e\u6b0a\u8861\u666e\u904d\u5b58\u5728\u65bc\u6240\u6709\u5de5\u696d\u9818\u57df\uff0c\u5b83\u8981\u6c42\u6211\u5011\u5728\u4e0d\u540c\u7684\u512a\u52e2\u548c\u9650\u5236\u4e4b\u9593\u627e\u5230\u6700\u4f73\u5e73\u8861\u9ede\u3002

    \u7e3d\u7684\u4f86\u8aaa\uff0c\u786c\u789f\u7528\u65bc\u9577\u671f\u5132\u5b58\u5927\u91cf\u8cc7\u6599\uff0c\u8a18\u61b6\u9ad4\u7528\u65bc\u81e8\u6642\u5132\u5b58\u7a0b\u5f0f\u57f7\u884c\u4e2d\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\uff0c\u800c\u5feb\u53d6\u5247\u7528\u65bc\u5132\u5b58\u7d93\u5e38\u8a2a\u554f\u7684\u8cc7\u6599\u548c\u6307\u4ee4\uff0c\u4ee5\u63d0\u9ad8\u7a0b\u5f0f\u57f7\u884c\u6548\u7387\u3002\u4e09\u8005\u5171\u540c\u5354\u4f5c\uff0c\u78ba\u4fdd\u8a08\u7b97\u6a5f\u7cfb\u7d71\u9ad8\u6548\u57f7\u884c\u3002

    \u5982\u5716 4-10 \u6240\u793a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u6703\u5f9e\u786c\u789f\u4e2d\u88ab\u8b80\u53d6\u5230\u8a18\u61b6\u9ad4\u4e2d\uff0c\u4f9b CPU \u8a08\u7b97\u4f7f\u7528\u3002\u5feb\u53d6\u53ef\u4ee5\u770b\u4f5c CPU \u7684\u4e00\u90e8\u5206\uff0c\u5b83\u900f\u904e\u667a\u6167\u5730\u5f9e\u8a18\u61b6\u9ad4\u8f09\u5165\u8cc7\u6599\uff0c\u7d66 CPU \u63d0\u4f9b\u9ad8\u901f\u7684\u8cc7\u6599\u8b80\u53d6\uff0c\u5f9e\u800c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\uff0c\u6e1b\u5c11\u5c0d\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u7684\u4f9d\u8cf4\u3002

    \u5716 4-10 \u00a0 \u786c\u789f\u3001\u8a18\u61b6\u9ad4\u548c\u5feb\u53d6\u4e4b\u9593\u7684\u8cc7\u6599\u6d41\u901a

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#442","title":"4.4.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u8a18\u61b6\u9ad4\u6548\u7387","text":"

    \u5728\u8a18\u61b6\u9ad4\u7a7a\u9593\u5229\u7528\u65b9\u9762\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5404\u81ea\u5177\u6709\u512a\u52e2\u548c\u4fb7\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u8a18\u61b6\u9ad4\u662f\u6709\u9650\u7684\uff0c\u4e14\u540c\u4e00\u584a\u8a18\u61b6\u9ad4\u4e0d\u80fd\u88ab\u591a\u500b\u7a0b\u5f0f\u5171\u4eab\uff0c\u56e0\u6b64\u6211\u5011\u5e0c\u671b\u8cc7\u6599\u7d50\u69cb\u80fd\u5920\u5118\u53ef\u80fd\u9ad8\u6548\u5730\u5229\u7528\u7a7a\u9593\u3002\u9663\u5217\u7684\u5143\u7d20\u7dca\u5bc6\u6392\u5217\uff0c\u4e0d\u9700\u8981\u984d\u5916\u7684\u7a7a\u9593\u4f86\u5132\u5b58\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u56e0\u6b64\u7a7a\u9593\u6548\u7387\u66f4\u9ad8\u3002\u7136\u800c\uff0c\u9663\u5217\u9700\u8981\u4e00\u6b21\u6027\u5206\u914d\u8db3\u5920\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u9019\u53ef\u80fd\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d6a\u8cbb\uff0c\u9663\u5217\u64f4\u5bb9\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u6210\u672c\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u93c8\u7d50\u4e32\u5217\u4ee5\u201c\u7bc0\u9ede\u201d\u70ba\u55ae\u4f4d\u9032\u884c\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u548c\u56de\u6536\uff0c\u63d0\u4f9b\u4e86\u66f4\u5927\u7684\u9748\u6d3b\u6027\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u96a8\u8457\u53cd\u8986\u7533\u8acb\u8207\u91cb\u653e\u8a18\u61b6\u9ad4\uff0c\u7a7a\u9592\u8a18\u61b6\u9ad4\u7684\u788e\u7247\u5316\u7a0b\u5ea6\u6703\u8d8a\u4f86\u8d8a\u9ad8\uff0c\u5f9e\u800c\u5c0e\u81f4\u8a18\u61b6\u9ad4\u7684\u5229\u7528\u6548\u7387\u964d\u4f4e\u3002\u9663\u5217\u7531\u65bc\u5176\u9023\u7e8c\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u76f8\u5c0d\u4e0d\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002\u76f8\u53cd\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u5143\u7d20\u662f\u5206\u6563\u5132\u5b58\u7684\uff0c\u5728\u983b\u7e41\u7684\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u4e2d\uff0c\u66f4\u5bb9\u6613\u5c0e\u81f4\u8a18\u61b6\u9ad4\u788e\u7247\u5316\u3002

    "},{"location":"chapter_array_and_linkedlist/ram_and_cache/#443","title":"4.4.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u5feb\u53d6\u6548\u7387","text":"

    \u5feb\u53d6\u96d6\u7136\u5728\u7a7a\u9593\u5bb9\u91cf\u4e0a\u9060\u5c0f\u65bc\u8a18\u61b6\u9ad4\uff0c\u4f46\u5b83\u6bd4\u8a18\u61b6\u9ad4\u5feb\u5f97\u591a\uff0c\u5728\u7a0b\u5f0f\u57f7\u884c\u901f\u5ea6\u4e0a\u8d77\u8457\u81f3\u95dc\u91cd\u8981\u7684\u4f5c\u7528\u3002\u7531\u65bc\u5feb\u53d6\u7684\u5bb9\u91cf\u6709\u9650\uff0c\u53ea\u80fd\u5132\u5b58\u4e00\u5c0f\u90e8\u5206\u983b\u7e41\u8a2a\u554f\u7684\u8cc7\u6599\uff0c\u56e0\u6b64\u7576 CPU \u5617\u8a66\u8a2a\u554f\u7684\u8cc7\u6599\u4e0d\u5728\u5feb\u53d6\u4e2d\u6642\uff0c\u5c31\u6703\u767c\u751f\u5feb\u53d6\u672a\u547d\u4e2d\uff08cache miss\uff09\uff0c\u6b64\u6642 CPU \u4e0d\u5f97\u4e0d\u5f9e\u901f\u5ea6\u8f03\u6162\u7684\u8a18\u61b6\u9ad4\u4e2d\u8f09\u5165\u6240\u9700\u8cc7\u6599\u3002

    \u986f\u7136\uff0c\u201c\u5feb\u53d6\u672a\u547d\u4e2d\u201d\u8d8a\u5c11\uff0cCPU \u8b80\u5beb\u8cc7\u6599\u7684\u6548\u7387\u5c31\u8d8a\u9ad8\uff0c\u7a0b\u5f0f\u6548\u80fd\u4e5f\u5c31\u8d8a\u597d\u3002\u6211\u5011\u5c07 CPU \u5f9e\u5feb\u53d6\u4e2d\u6210\u529f\u7372\u53d6\u8cc7\u6599\u7684\u6bd4\u4f8b\u7a31\u70ba\u5feb\u53d6\u547d\u4e2d\u7387\uff08cache hit rate\uff09\uff0c\u9019\u500b\u6307\u6a19\u901a\u5e38\u7528\u4f86\u8861\u91cf\u5feb\u53d6\u6548\u7387\u3002

    \u70ba\u4e86\u5118\u53ef\u80fd\u9054\u5230\u66f4\u9ad8\u7684\u6548\u7387\uff0c\u5feb\u53d6\u6703\u63a1\u53d6\u4ee5\u4e0b\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\u3002

    • \u5feb\u53d6\u884c\uff1a\u5feb\u53d6\u4e0d\u662f\u55ae\u500b\u4f4d\u5143\u7d44\u5730\u5132\u5b58\u8207\u8f09\u5165\u8cc7\u6599\uff0c\u800c\u662f\u4ee5\u5feb\u53d6\u884c\u70ba\u55ae\u4f4d\u3002\u76f8\u6bd4\u65bc\u55ae\u500b\u4f4d\u5143\u7d44\u7684\u50b3\u8f38\uff0c\u5feb\u53d6\u884c\u7684\u50b3\u8f38\u5f62\u5f0f\u66f4\u52a0\u9ad8\u6548\u3002
    • \u9810\u53d6\u6a5f\u5236\uff1a\u8655\u7406\u5668\u6703\u5617\u8a66\u9810\u6e2c\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\uff08\u4f8b\u5982\u9806\u5e8f\u8a2a\u554f\u3001\u56fa\u5b9a\u6b65\u9577\u8df3\u8e8d\u8a2a\u554f\u7b49\uff09\uff0c\u4e26\u6839\u64da\u7279\u5b9a\u6a21\u5f0f\u5c07\u8cc7\u6599\u8f09\u5165\u81f3\u5feb\u53d6\u4e4b\u4e2d\uff0c\u5f9e\u800c\u63d0\u5347\u547d\u4e2d\u7387\u3002
    • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u9644\u8fd1\u7684\u8cc7\u6599\u53ef\u80fd\u8fd1\u671f\u4e5f\u6703\u88ab\u8a2a\u554f\u3002\u56e0\u6b64\uff0c\u5feb\u53d6\u5728\u8f09\u5165\u67d0\u4e00\u8cc7\u6599\u6642\uff0c\u4e5f\u6703\u8f09\u5165\u5176\u9644\u8fd1\u7684\u8cc7\u6599\uff0c\u4ee5\u63d0\u9ad8\u547d\u4e2d\u7387\u3002
    • \u6642\u9593\u5340\u57df\u6027\uff1a\u5982\u679c\u4e00\u500b\u6578\u64da\u88ab\u8a2a\u554f\uff0c\u90a3\u9ebc\u5b83\u5728\u4e0d\u4e45\u7684\u5c07\u4f86\u5f88\u53ef\u80fd\u518d\u6b21\u88ab\u8a2a\u554f\u3002\u5feb\u53d6\u5229\u7528\u9019\u4e00\u539f\u7406\uff0c\u900f\u904e\u4fdd\u7559\u6700\u8fd1\u8a2a\u554f\u904e\u7684\u8cc7\u6599\u4f86\u63d0\u9ad8\u547d\u4e2d\u7387\u3002

    \u5be6\u969b\u4e0a\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u5c0d\u5feb\u53d6\u7684\u5229\u7528\u6548\u7387\u662f\u4e0d\u540c\u7684\uff0c\u4e3b\u8981\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5e7e\u500b\u65b9\u9762\u3002

    • \u4f54\u7528\u7a7a\u9593\uff1a\u93c8\u7d50\u4e32\u5217\u5143\u7d20\u6bd4\u9663\u5217\u5143\u7d20\u4f54\u7528\u7a7a\u9593\u66f4\u591a\uff0c\u5c0e\u81f4\u5feb\u53d6\u4e2d\u5bb9\u7d0d\u7684\u6709\u6548\u8cc7\u6599\u91cf\u66f4\u5c11\u3002
    • \u5feb\u53d6\u884c\uff1a\u93c8\u7d50\u4e32\u5217\u8cc7\u6599\u5206\u6563\u5728\u8a18\u61b6\u9ad4\u5404\u8655\uff0c\u800c\u5feb\u53d6\u662f\u201c\u6309\u884c\u8f09\u5165\u201d\u7684\uff0c\u56e0\u6b64\u8f09\u5165\u5230\u7121\u6548\u8cc7\u6599\u7684\u6bd4\u4f8b\u66f4\u9ad8\u3002
    • \u9810\u53d6\u6a5f\u5236\uff1a\u9663\u5217\u6bd4\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u8a2a\u554f\u6a21\u5f0f\u66f4\u5177\u201c\u53ef\u9810\u6e2c\u6027\u201d\uff0c\u5373\u7cfb\u7d71\u66f4\u5bb9\u6613\u731c\u51fa\u5373\u5c07\u88ab\u8f09\u5165\u7684\u8cc7\u6599\u3002
    • \u7a7a\u9593\u5340\u57df\u6027\uff1a\u9663\u5217\u88ab\u5132\u5b58\u5728\u96c6\u4e2d\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u56e0\u6b64\u88ab\u8f09\u5165\u8cc7\u6599\u9644\u8fd1\u7684\u8cc7\u6599\u66f4\u6709\u53ef\u80fd\u5373\u5c07\u88ab\u8a2a\u554f\u3002

    \u7e3d\u9ad4\u800c\u8a00\uff0c\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u5728\u64cd\u4f5c\u6548\u7387\u4e0a\u901a\u5e38\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u9019\u4f7f\u5f97\u5728\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u5f80\u5f80\u66f4\u53d7\u6b61\u8fce\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u9ad8\u5feb\u53d6\u6548\u7387\u4e26\u4e0d\u610f\u5473\u8457\u9663\u5217\u5728\u6240\u6709\u60c5\u6cc1\u4e0b\u90fd\u512a\u65bc\u93c8\u7d50\u4e32\u5217\u3002\u5be6\u969b\u61c9\u7528\u4e2d\u9078\u64c7\u54ea\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5be6\u73fe\u201c\u5806\u758a\u201d\u8cc7\u6599\u7d50\u69cb\uff08\u4e0b\u4e00\u7ae0\u6703\u8a73\u7d30\u4ecb\u7d39\uff09\uff0c\u4f46\u5b83\u5011\u9069\u7528\u65bc\u4e0d\u540c\u5834\u666f\u3002

    • \u5728\u505a\u6f14\u7b97\u6cd5\u984c\u6642\uff0c\u6211\u5011\u6703\u50be\u5411\u65bc\u9078\u64c7\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\uff0c\u56e0\u70ba\u5b83\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u64cd\u4f5c\u6548\u7387\u548c\u96a8\u6a5f\u8a2a\u554f\u7684\u80fd\u529b\uff0c\u4ee3\u50f9\u50c5\u662f\u9700\u8981\u9810\u5148\u70ba\u9663\u5217\u5206\u914d\u4e00\u5b9a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u5982\u679c\u8cc7\u6599\u91cf\u975e\u5e38\u5927\u3001\u52d5\u614b\u6027\u5f88\u9ad8\u3001\u5806\u758a\u7684\u9810\u671f\u5927\u5c0f\u96e3\u4ee5\u4f30\u8a08\uff0c\u90a3\u9ebc\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u66f4\u52a0\u5408\u9069\u3002\u93c8\u7d50\u4e32\u5217\u80fd\u5920\u5c07\u5927\u91cf\u8cc7\u6599\u5206\u6563\u5132\u5b58\u65bc\u8a18\u61b6\u9ad4\u7684\u4e0d\u540c\u90e8\u5206\uff0c\u4e26\u4e14\u907f\u514d\u4e86\u9663\u5217\u64f4\u5bb9\u7522\u751f\u7684\u984d\u5916\u958b\u92b7\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/","title":"4.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_array_and_linkedlist/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u662f\u5169\u7a2e\u57fa\u672c\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5206\u5225\u4ee3\u8868\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5169\u7a2e\u5132\u5b58\u65b9\u5f0f\uff1a\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\u3002\u5169\u8005\u7684\u7279\u9ede\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u6027\u3002
    • \u9663\u5217\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u5c11\uff1b\u4f46\u63d2\u5165\u548c\u522a\u9664\u5143\u7d20\u6548\u7387\u4f4e\uff0c\u4e14\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002
    • \u93c8\u7d50\u4e32\u5217\u900f\u904e\u66f4\u6539\u5f15\u7528\uff08\u6307\u6a19\uff09\u5be6\u73fe\u9ad8\u6548\u7684\u7bc0\u9ede\u63d2\u5165\u8207\u522a\u9664\uff0c\u4e14\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\uff1b\u4f46\u7bc0\u9ede\u8a2a\u554f\u6548\u7387\u4f4e\u3001\u4f54\u7528\u8a18\u61b6\u9ad4\u8f03\u591a\u3002\u5e38\u898b\u7684\u93c8\u7d50\u4e32\u5217\u578b\u5225\u5305\u62ec\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u3001\u74b0\u5f62\u93c8\u7d50\u4e32\u5217\u3001\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u3002
    • \u4e32\u5217\u662f\u4e00\u7a2e\u652f\u6301\u589e\u522a\u67e5\u6539\u7684\u5143\u7d20\u6709\u5e8f\u96c6\u5408\uff0c\u901a\u5e38\u57fa\u65bc\u52d5\u614b\u9663\u5217\u5be6\u73fe\u3002\u5b83\u4fdd\u7559\u4e86\u9663\u5217\u7684\u512a\u52e2\uff0c\u540c\u6642\u53ef\u4ee5\u9748\u6d3b\u8abf\u6574\u9577\u5ea6\u3002
    • \u4e32\u5217\u7684\u51fa\u73fe\u5927\u5e45\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u3002
    • \u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u9663\u5217\u53ef\u63d0\u4f9b\u66f4\u9ad8\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6548\u7387\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u5247\u5728\u8a18\u61b6\u9ad4\u4f7f\u7528\u4e0a\u66f4\u52a0\u9748\u6d3b\u3002
    • \u5feb\u53d6\u900f\u904e\u5feb\u53d6\u884c\u3001\u9810\u53d6\u6a5f\u5236\u4ee5\u53ca\u7a7a\u9593\u5340\u57df\u6027\u548c\u6642\u9593\u5340\u57df\u6027\u7b49\u8cc7\u6599\u8f09\u5165\u6a5f\u5236\uff0c\u70ba CPU \u63d0\u4f9b\u5feb\u901f\u8cc7\u6599\u8a2a\u554f\uff0c\u986f\u8457\u63d0\u5347\u7a0b\u5f0f\u7684\u57f7\u884c\u6548\u7387\u3002
    • \u7531\u65bc\u9663\u5217\u5177\u6709\u66f4\u9ad8\u7684\u5feb\u53d6\u547d\u4e2d\u7387\uff0c\u56e0\u6b64\u5b83\u901a\u5e38\u6bd4\u93c8\u7d50\u4e32\u5217\u66f4\u9ad8\u6548\u3002\u5728\u9078\u64c7\u8cc7\u6599\u7d50\u69cb\u6642\uff0c\u61c9\u6839\u64da\u5177\u9ad4\u9700\u6c42\u548c\u5834\u666f\u505a\u51fa\u6070\u7576\u9078\u64c7\u3002
    "},{"location":"chapter_array_and_linkedlist/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u9663\u5217\u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5132\u5b58\u5728\u5806\u7a4d\u4e0a\uff0c\u5c0d\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u5426\u6709\u5f71\u97ff\uff1f

    \u5132\u5b58\u5728\u5806\u758a\u4e0a\u548c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u90fd\u88ab\u5132\u5b58\u5728\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\uff0c\u8cc7\u6599\u64cd\u4f5c\u6548\u7387\u57fa\u672c\u4e00\u81f4\u3002\u7136\u800c\uff0c\u5806\u758a\u548c\u5806\u7a4d\u5177\u6709\u5404\u81ea\u7684\u7279\u9ede\uff0c\u5f9e\u800c\u5c0e\u81f4\u4ee5\u4e0b\u4e0d\u540c\u9ede\u3002

    1. \u5206\u914d\u548c\u91cb\u653e\u6548\u7387\uff1a\u5806\u758a\u662f\u4e00\u584a\u8f03\u5c0f\u7684\u8a18\u61b6\u9ad4\uff0c\u5206\u914d\u7531\u7de8\u8b6f\u5668\u81ea\u52d5\u5b8c\u6210\uff1b\u800c\u5806\u7a4d\u8a18\u61b6\u9ad4\u76f8\u5c0d\u66f4\u5927\uff0c\u53ef\u4ee5\u5728\u7a0b\u5f0f\u78bc\u4e2d\u52d5\u614b\u5206\u914d\uff0c\u66f4\u5bb9\u6613\u788e\u7247\u5316\u3002\u56e0\u6b64\uff0c\u5806\u7a4d\u4e0a\u7684\u5206\u914d\u548c\u91cb\u653e\u64cd\u4f5c\u901a\u5e38\u6bd4\u5806\u758a\u4e0a\u7684\u6162\u3002
    2. \u5927\u5c0f\u9650\u5236\uff1a\u5806\u758a\u8a18\u61b6\u9ad4\u76f8\u5c0d\u8f03\u5c0f\uff0c\u5806\u7a4d\u7684\u5927\u5c0f\u4e00\u822c\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\u3002\u56e0\u6b64\u5806\u7a4d\u66f4\u52a0\u9069\u5408\u5132\u5b58\u5927\u578b\u9663\u5217\u3002
    3. \u9748\u6d3b\u6027\uff1a\u5806\u758a\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u9700\u8981\u5728\u7de8\u8b6f\u6642\u78ba\u5b9a\uff0c\u800c\u5806\u7a4d\u4e0a\u7684\u9663\u5217\u7684\u5927\u5c0f\u53ef\u4ee5\u5728\u57f7\u884c\u6642\u52d5\u614b\u78ba\u5b9a\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u9663\u5217\u8981\u6c42\u76f8\u540c\u578b\u5225\u7684\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u537b\u6c92\u6709\u5f37\u8abf\u76f8\u540c\u578b\u5225\u5462\uff1f

    \u93c8\u7d50\u4e32\u5217\u7531\u7bc0\u9ede\u7d44\u6210\uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u5f15\u7528\uff08\u6307\u6a19\uff09\u9023\u7dda\uff0c\u5404\u500b\u7bc0\u9ede\u53ef\u4ee5\u5132\u5b58\u4e0d\u540c\u578b\u5225\u7684\u8cc7\u6599\uff0c\u4f8b\u5982 int\u3001double\u3001string\u3001object \u7b49\u3002

    \u76f8\u5c0d\u5730\uff0c\u9663\u5217\u5143\u7d20\u5247\u5fc5\u9808\u662f\u76f8\u540c\u578b\u5225\u7684\uff0c\u9019\u6a23\u624d\u80fd\u900f\u904e\u8a08\u7b97\u504f\u79fb\u91cf\u4f86\u7372\u53d6\u5c0d\u61c9\u5143\u7d20\u4f4d\u7f6e\u3002\u4f8b\u5982\uff0c\u9663\u5217\u540c\u6642\u5305\u542b int \u548c long \u5169\u7a2e\u578b\u5225\uff0c\u55ae\u500b\u5143\u7d20\u5206\u5225\u4f54\u7528 4 \u4f4d\u5143\u7d44 \u548c 8 \u4f4d\u5143\u7d44 \uff0c\u6b64\u6642\u5c31\u4e0d\u80fd\u7528\u4ee5\u4e0b\u516c\u5f0f\u8a08\u7b97\u504f\u79fb\u91cf\u4e86\uff0c\u56e0\u70ba\u9663\u5217\u4e2d\u5305\u542b\u4e86\u5169\u7a2e\u201c\u5143\u7d20\u9577\u5ea6\u201d\u3002

    # \u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740 = \u9663\u5217\u8a18\u61b6\u9ad4\u4f4d\u5740\uff08\u9996\u5143\u7d20\u8a18\u61b6\u9ad4\u4f4d\u5740\uff09 + \u5143\u7d20\u9577\u5ea6 * \u5143\u7d20\u7d22\u5f15\n

    Q\uff1a\u522a\u9664\u7bc0\u9ede P \u5f8c\uff0c\u662f\u5426\u9700\u8981\u628a P.next \u8a2d\u70ba None \u5462\uff1f

    \u4e0d\u4fee\u6539 P.next \u4e5f\u53ef\u4ee5\u3002\u5f9e\u8a72\u93c8\u7d50\u4e32\u5217\u7684\u89d2\u5ea6\u770b\uff0c\u5f9e\u982d\u7bc0\u9ede\u8d70\u8a2a\u5230\u5c3e\u7bc0\u9ede\u5df2\u7d93\u4e0d\u6703\u9047\u5230 P \u4e86\u3002\u9019\u610f\u5473\u8457\u7bc0\u9ede P \u5df2\u7d93\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u4e86\uff0c\u6b64\u6642\u7bc0\u9ede P \u6307\u5411\u54ea\u88e1\u90fd\u4e0d\u6703\u5c0d\u8a72\u93c8\u7d50\u4e32\u5217\u7522\u751f\u5f71\u97ff\u3002

    \u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\uff08\u505a\u984c\uff09\u7684\u89d2\u5ea6\u770b\uff0c\u4e0d\u65b7\u958b\u6c92\u6709\u95dc\u4fc2\uff0c\u53ea\u8981\u4fdd\u8b49\u7a0b\u5f0f\u7684\u908f\u8f2f\u662f\u6b63\u78ba\u7684\u5c31\u884c\u3002\u5f9e\u6a19\u6e96\u5eab\u7684\u89d2\u5ea6\u770b\uff0c\u65b7\u958b\u66f4\u52a0\u5b89\u5168\u3001\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3002\u5982\u679c\u4e0d\u65b7\u958b\uff0c\u5047\u8a2d\u88ab\u522a\u9664\u7bc0\u9ede\u672a\u88ab\u6b63\u5e38\u56de\u6536\uff0c\u90a3\u9ebc\u5b83\u6703\u5f71\u97ff\u5f8c\u7e7c\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\u56de\u6536\u3002

    Q\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u4f46\u662f\u589e\u522a\u4e4b\u524d\u90fd\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u67e5\u8a62\u5143\u7d20\uff0c\u90a3\u70ba\u4ec0\u9ebc\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u662f \\(O(n)\\) \u5462\uff1f

    \u5982\u679c\u662f\u5148\u67e5\u8a62\u5143\u7d20\u3001\u518d\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u78ba\u5be6\u662f \\(O(n)\\) \u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u7684 \\(O(1)\\) \u589e\u522a\u7684\u512a\u52e2\u53ef\u4ee5\u5728\u5176\u4ed6\u61c9\u7528\u4e0a\u5f97\u5230\u9ad4\u73fe\u3002\u4f8b\u5982\uff0c\u96d9\u5411\u4f47\u5217\u9069\u5408\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u6211\u5011\u7dad\u8b77\u4e00\u500b\u6307\u6a19\u8b8a\u6578\u59cb\u7d42\u6307\u5411\u982d\u7bc0\u9ede\u3001\u5c3e\u7bc0\u9ede\uff0c\u6bcf\u6b21\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u90fd\u662f \\(O(1)\\) \u3002

    Q\uff1a\u5716\u201c\u93c8\u7d50\u4e32\u5217\u5b9a\u7fa9\u8207\u5132\u5b58\u65b9\u5f0f\u201d\u4e2d\uff0c\u6dfa\u85cd\u8272\u7684\u5132\u5b58\u7bc0\u9ede\u6307\u6a19\u662f\u4f54\u7528\u4e00\u584a\u8a18\u61b6\u9ad4\u4f4d\u5740\u55ce\uff1f\u9084\u662f\u548c\u7bc0\u9ede\u503c\u5404\u4f54\u4e00\u534a\u5462\uff1f

    \u8a72\u793a\u610f\u5716\u53ea\u662f\u5b9a\u6027\u8868\u793a\uff0c\u5b9a\u91cf\u8868\u793a\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

    • \u4e0d\u540c\u578b\u5225\u7684\u7bc0\u9ede\u503c\u4f54\u7528\u7684\u7a7a\u9593\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982 int\u3001long\u3001double \u548c\u4f8b\u9805\u7269\u4ef6\u7b49\u3002
    • \u6307\u6a19\u8b8a\u6578\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5927\u5c0f\u6839\u64da\u6240\u4f7f\u7528\u7684\u4f5c\u696d\u7cfb\u7d71\u53ca\u7de8\u8b6f\u74b0\u5883\u800c\u5b9a\uff0c\u5927\u591a\u70ba 8 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\u3002

    Q\uff1a\u5728\u4e32\u5217\u672b\u5c3e\u65b0\u589e\u5143\u7d20\u662f\u5426\u6642\u6642\u523b\u523b\u90fd\u70ba \\(O(1)\\) \uff1f

    \u5982\u679c\u65b0\u589e\u5143\u7d20\u6642\u8d85\u51fa\u4e32\u5217\u9577\u5ea6\uff0c\u5247\u9700\u8981\u5148\u64f4\u5bb9\u4e32\u5217\u518d\u65b0\u589e\u3002\u7cfb\u7d71\u6703\u7533\u8acb\u4e00\u584a\u65b0\u7684\u8a18\u61b6\u9ad4\uff0c\u4e26\u5c07\u539f\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u642c\u904b\u904e\u53bb\uff0c\u9019\u6642\u5019\u6642\u9593\u8907\u96dc\u5ea6\u5c31\u6703\u662f \\(O(n)\\) \u3002

    Q\uff1a\u201c\u4e32\u5217\u7684\u51fa\u73fe\u6975\u5927\u5730\u63d0\u9ad8\u4e86\u9663\u5217\u7684\u5be6\u7528\u6027\uff0c\u4f46\u53ef\u80fd\u5c0e\u81f4\u90e8\u5206\u8a18\u61b6\u9ad4\u7a7a\u9593\u6d6a\u8cbb\u201d\uff0c\u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u662f\u6307\u984d\u5916\u589e\u52a0\u7684\u8b8a\u6578\u5982\u5bb9\u91cf\u3001\u9577\u5ea6\u3001\u64f4\u5bb9\u500d\u6578\u6240\u4f54\u7684\u8a18\u61b6\u9ad4\u55ce\uff1f

    \u9019\u88e1\u7684\u7a7a\u9593\u6d6a\u8cbb\u4e3b\u8981\u6709\u5169\u65b9\u9762\u542b\u7fa9\uff1a\u4e00\u65b9\u9762\uff0c\u4e32\u5217\u90fd\u6703\u8a2d\u5b9a\u4e00\u500b\u521d\u59cb\u9577\u5ea6\uff0c\u6211\u5011\u4e0d\u4e00\u5b9a\u9700\u8981\u7528\u9019\u9ebc\u591a\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u70ba\u4e86\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\uff0c\u64f4\u5bb9\u4e00\u822c\u6703\u4e58\u4ee5\u4e00\u500b\u4fc2\u6578\uff0c\u6bd4\u5982 \\(\\times 1.5\\) \u3002\u9019\u6a23\u4e00\u4f86\uff0c\u4e5f\u6703\u51fa\u73fe\u5f88\u591a\u7a7a\u4f4d\uff0c\u6211\u5011\u901a\u5e38\u4e0d\u80fd\u5b8c\u5168\u586b\u6eff\u5b83\u5011\u3002

    Q\uff1a\u5728 Python \u4e2d\u521d\u59cb\u5316 n = [1, 2, 3] \u5f8c\uff0c\u9019 3 \u500b\u5143\u7d20\u7684\u4f4d\u5740\u662f\u76f8\u9023\u7684\uff0c\u4f46\u662f\u521d\u59cb\u5316 m = [2, 1, 3] \u6703\u767c\u73fe\u5b83\u5011\u6bcf\u500b\u5143\u7d20\u7684 id \u4e26\u4e0d\u662f\u9023\u7e8c\u7684\uff0c\u800c\u662f\u5206\u5225\u8ddf n \u4e2d\u7684\u76f8\u540c\u3002\u9019\u4e9b\u5143\u7d20\u7684\u4f4d\u5740\u4e0d\u9023\u7e8c\uff0c\u90a3\u9ebc m \u9084\u662f\u9663\u5217\u55ce\uff1f

    \u5047\u5982\u628a\u4e32\u5217\u5143\u7d20\u63db\u6210\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede n = [n1, n2, n3, n4, n5] \uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u9019 5 \u500b\u7bc0\u9ede\u7269\u4ef6\u4e5f\u5206\u6563\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u5404\u8655\u3002\u7136\u800c\uff0c\u7d66\u5b9a\u4e00\u500b\u4e32\u5217\u7d22\u5f15\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u7bc0\u9ede\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u5f9e\u800c\u8a2a\u554f\u5230\u5c0d\u61c9\u7684\u7bc0\u9ede\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u4e2d\u5132\u5b58\u7684\u662f\u7bc0\u9ede\u7684\u5f15\u7528\uff0c\u800c\u975e\u7bc0\u9ede\u672c\u8eab\u3002

    \u8207\u8a31\u591a\u8a9e\u8a00\u4e0d\u540c\uff0cPython \u4e2d\u7684\u6578\u5b57\u4e5f\u88ab\u5305\u88dd\u70ba\u7269\u4ef6\uff0c\u4e32\u5217\u4e2d\u5132\u5b58\u7684\u4e0d\u662f\u6578\u5b57\u672c\u8eab\uff0c\u800c\u662f\u5c0d\u6578\u5b57\u7684\u5f15\u7528\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6703\u767c\u73fe\u5169\u500b\u9663\u5217\u4e2d\u7684\u76f8\u540c\u6578\u5b57\u64c1\u6709\u540c\u4e00\u500b id \uff0c\u4e26\u4e14\u9019\u4e9b\u6578\u5b57\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u7121\u9808\u9023\u7e8c\u3002

    Q\uff1aC++ STL \u88e1\u9762\u7684 std::list \u5df2\u7d93\u5be6\u73fe\u4e86\u96d9\u5411\u93c8\u7d50\u4e32\u5217\uff0c\u4f46\u597d\u50cf\u4e00\u4e9b\u6f14\u7b97\u6cd5\u66f8\u4e0a\u4e0d\u600e\u9ebc\u76f4\u63a5\u4f7f\u7528\u5b83\uff0c\u662f\u4e0d\u662f\u56e0\u70ba\u6709\u4ec0\u9ebc\u4fb7\u9650\u6027\u5462\uff1f

    \u4e00\u65b9\u9762\uff0c\u6211\u5011\u5f80\u5f80\u66f4\u9752\u775e\u4f7f\u7528\u9663\u5217\u5be6\u73fe\u6f14\u7b97\u6cd5\uff0c\u800c\u53ea\u5728\u5fc5\u8981\u6642\u624d\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\uff0c\u4e3b\u8981\u6709\u5169\u500b\u539f\u56e0\u3002

    • \u7a7a\u9593\u958b\u92b7\uff1a\u7531\u65bc\u6bcf\u500b\u5143\u7d20\u9700\u8981\u5169\u500b\u984d\u5916\u7684\u6307\u6a19\uff08\u4e00\u500b\u7528\u65bc\u524d\u4e00\u500b\u5143\u7d20\uff0c\u4e00\u500b\u7528\u65bc\u5f8c\u4e00\u500b\u5143\u7d20\uff09\uff0c\u6240\u4ee5 std::list \u901a\u5e38\u6bd4 std::vector \u66f4\u4f54\u7528\u7a7a\u9593\u3002
    • \u5feb\u53d6\u4e0d\u53cb\u597d\uff1a\u7531\u65bc\u8cc7\u6599\u4e0d\u662f\u9023\u7e8c\u5b58\u653e\u7684\uff0c\u56e0\u6b64 std::list \u5c0d\u5feb\u53d6\u7684\u5229\u7528\u7387\u8f03\u4f4e\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b\uff0cstd::vector \u7684\u6548\u80fd\u6703\u66f4\u597d\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5fc5\u8981\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u7684\u60c5\u6cc1\u4e3b\u8981\u662f\u4e8c\u5143\u6a39\u548c\u5716\u3002\u5806\u758a\u548c\u4f47\u5217\u5f80\u5f80\u6703\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684 stack \u548c queue \uff0c\u800c\u975e\u93c8\u7d50\u4e32\u5217\u3002

    Q\uff1a\u521d\u59cb\u5316\u4e32\u5217 res = [0] * self.size() \u64cd\u4f5c\uff0c\u6703\u5c0e\u81f4 res \u7684\u6bcf\u500b\u5143\u7d20\u5f15\u7528\u76f8\u540c\u7684\u4f4d\u5740\u55ce\uff1f

    \u4e0d\u6703\u3002\u4f46\u4e8c\u7dad\u9663\u5217\u6703\u6709\u9019\u500b\u554f\u984c\uff0c\u4f8b\u5982\u521d\u59cb\u5316\u4e8c\u7dad\u4e32\u5217 res = [[0] * self.size()] \uff0c\u5247\u591a\u6b21\u5f15\u7528\u4e86\u540c\u4e00\u500b\u4e32\u5217 [0] \u3002

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

    Abstract

    \u6211\u5011\u5982\u540c\u8ff7\u5bae\u4e2d\u7684\u63a2\u7d22\u8005\uff0c\u5728\u524d\u9032\u7684\u9053\u8def\u4e0a\u53ef\u80fd\u6703\u9047\u5230\u56f0\u96e3\u3002

    \u56de\u6eaf\u7684\u529b\u91cf\u8b93\u6211\u5011\u80fd\u5920\u91cd\u65b0\u958b\u59cb\uff0c\u4e0d\u65b7\u5617\u8a66\uff0c\u6700\u7d42\u627e\u5230\u901a\u5f80\u5149\u660e\u7684\u51fa\u53e3\u3002

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

    \u56de\u6eaf\u6f14\u7b97\u6cd5\uff08backtracking algorithm\uff09\u662f\u4e00\u7a2e\u900f\u904e\u7aae\u8209\u4f86\u89e3\u6c7a\u554f\u984c\u7684\u65b9\u6cd5\uff0c\u5b83\u7684\u6838\u5fc3\u601d\u60f3\u662f\u5f9e\u4e00\u500b\u521d\u59cb\u72c0\u614b\u51fa\u767c\uff0c\u66b4\u529b\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u7576\u9047\u5230\u6b63\u78ba\u7684\u89e3\u5247\u5c07\u5176\u8a18\u9304\uff0c\u76f4\u5230\u627e\u5230\u89e3\u6216\u8005\u5617\u8a66\u4e86\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u90fd\u7121\u6cd5\u627e\u5230\u89e3\u70ba\u6b62\u3002

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u4f86\u8d70\u8a2a\u89e3\u7a7a\u9593\u3002\u5728\u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u4e2d\uff0c\u6211\u5011\u63d0\u5230\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5229\u7528\u524d\u5e8f\u8d70\u8a2a\u69cb\u9020\u4e00\u500b\u56de\u6eaf\u554f\u984c\uff0c\u9010\u6b65\u77ad\u89e3\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u4f8b\u984c\u4e00

    \u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\uff0c\u641c\u5c0b\u4e26\u8a18\u9304\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u7bc0\u9ede\u4e32\u5217\u3002

    \u5c0d\u65bc\u6b64\u984c\uff0c\u6211\u5011\u524d\u5e8f\u8d70\u8a2a\u9019\u68f5\u6a39\uff0c\u4e26\u5224\u65b7\u7576\u524d\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \uff0c\u82e5\u662f\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u7684\u503c\u52a0\u5165\u7d50\u679c\u4e32\u5217 res \u4e4b\u4e2d\u3002\u76f8\u95dc\u904e\u7a0b\u5be6\u73fe\u5982\u5716 13-1 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_i_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00\"\"\"\n    if root is None:\n        return\n    if root.val == 7:\n        # \u8a18\u9304\u89e3\n        res.append(root)\n    pre_order(root.left)\n    pre_order(root.right)\n
    preorder_traversal_i_compact.cpp
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res.push_back(root);\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.java
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.add(root);\n    }\n    preOrder(root.left);\n    preOrder(root.right);\n}\n
    preorder_traversal_i_compact.cs
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    if (root.val == 7) {\n        // \u8a18\u9304\u89e3\n        res.Add(root);\n    }\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n
    preorder_traversal_i_compact.go
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrderI(root *TreeNode, res *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    if (root.Val).(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root, res) {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfunction preOrder(root: TreeNode | null, res: TreeNode[]): void {\n    if (root === null) {\n        return;\n    }\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode? root, List<TreeNode> res) {\n  if (root == null) {\n    return;\n  }\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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            // \u8a18\u9304\u89e3\n            res.push(node.clone());\n        }\n        pre_order(res, node.borrow().left.clone());\n        pre_order(res, node.borrow().right.clone());\n    }\n}\n
    preorder_traversal_i_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    if (root->val == 7) {\n        // \u8a18\u9304\u89e3\n        res[resSize++] = root;\n    }\n    preOrder(root->left);\n    preOrder(root->right);\n}\n
    preorder_traversal_i_compact.kt
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e00 */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    if (root._val == 7) {\n        // \u8a18\u9304\u89e3\n        res!!.add(root)\n    }\n    preOrder(root.left)\n    preOrder(root.right)\n}\n
    preorder_traversal_i_compact.rb
    [class]{}-[func]{pre_order}\n
    preorder_traversal_i_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-1 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u4e2d\u641c\u7d22\u7bc0\u9ede

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1311","title":"13.1.1 \u00a0 \u5617\u8a66\u8207\u56de\u9000","text":"

    \u4e4b\u6240\u4ee5\u7a31\u4e4b\u70ba\u56de\u6eaf\u6f14\u7b97\u6cd5\uff0c\u662f\u56e0\u70ba\u8a72\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u89e3\u7a7a\u9593\u6642\u6703\u63a1\u7528\u201c\u5617\u8a66\u201d\u8207\u201c\u56de\u9000\u201d\u7684\u7b56\u7565\u3002\u7576\u6f14\u7b97\u6cd5\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u9047\u5230\u67d0\u500b\u72c0\u614b\u7121\u6cd5\u7e7c\u7e8c\u524d\u9032\u6216\u7121\u6cd5\u5f97\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u6642\uff0c\u5b83\u6703\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u5617\u8a66\u5176\u4ed6\u53ef\u80fd\u7684\u9078\u64c7\u3002

    \u5c0d\u65bc\u4f8b\u984c\u4e00\uff0c\u8a2a\u554f\u6bcf\u500b\u7bc0\u9ede\u90fd\u4ee3\u8868\u4e00\u6b21\u201c\u5617\u8a66\u201d\uff0c\u800c\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u8fd4\u56de\u7236\u7bc0\u9ede\u7684 return \u5247\u8868\u793a\u201c\u56de\u9000\u201d\u3002

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u56de\u9000\u4e26\u4e0d\u50c5\u50c5\u5305\u62ec\u51fd\u5f0f\u8fd4\u56de\u3002\u70ba\u89e3\u91cb\u9019\u4e00\u9ede\uff0c\u6211\u5011\u5c0d\u4f8b\u984c\u4e00\u7a0d\u4f5c\u62d3\u5c55\u3002

    \u4f8b\u984c\u4e8c

    \u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\u3002

    \u5728\u4f8b\u984c\u4e00\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u4e32\u5217 path \u8a18\u9304\u8a2a\u554f\u904e\u7684\u7bc0\u9ede\u8def\u5f91\u3002\u7576\u8a2a\u554f\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u8907\u88fd path \u4e26\u65b0\u589e\u9032\u7d50\u679c\u4e32\u5217 res \u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0cres \u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6240\u6709\u7684\u89e3\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_ii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c\"\"\"\n    if root is None:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrderII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    if root == nil {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(root, path, res) {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfunction preOrder(\n    root: TreeNode | null,\n    path: TreeNode[],\n    res: TreeNode[][]\n): void {\n    if (root === null) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
    preorder_traversal_ii_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nvoid preOrder(TreeNode *root) {\n    if (root == NULL) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e8c */\nfun preOrder(root: TreeNode?) {\n    if (root == null) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\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
    [class]{}-[func]{pre_order}\n
    preorder_traversal_ii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u6bcf\u6b21\u201c\u5617\u8a66\u201d\u4e2d\uff0c\u6211\u5011\u900f\u904e\u5c07\u7576\u524d\u7bc0\u9ede\u65b0\u589e\u9032 path \u4f86\u8a18\u9304\u8def\u5f91\uff1b\u800c\u5728\u201c\u56de\u9000\u201d\u524d\uff0c\u6211\u5011\u9700\u8981\u5c07\u8a72\u7bc0\u9ede\u5f9e path \u4e2d\u5f48\u51fa\uff0c\u4ee5\u6062\u5fa9\u672c\u6b21\u5617\u8a66\u4e4b\u524d\u7684\u72c0\u614b\u3002

    \u89c0\u5bdf\u5716 13-2 \u6240\u793a\u7684\u904e\u7a0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5617\u8a66\u548c\u56de\u9000\u7406\u89e3\u70ba\u201c\u524d\u9032\u201d\u8207\u201c\u64a4\u92b7\u201d\uff0c\u5169\u500b\u64cd\u4f5c\u4e92\u70ba\u9006\u5411\u3002

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

    \u5716 13-2 \u00a0 \u5617\u8a66\u8207\u56de\u9000

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

    \u8907\u96dc\u7684\u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u4e00\u500b\u6216\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u7d04\u675f\u689d\u4ef6\u901a\u5e38\u53ef\u7528\u65bc\u201c\u526a\u679d\u201d\u3002

    \u4f8b\u984c\u4e09

    \u5728\u4e8c\u5143\u6a39\u4e2d\u641c\u7d22\u6240\u6709\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\uff0c\u8acb\u8fd4\u56de\u6839\u7bc0\u9ede\u5230\u9019\u4e9b\u7bc0\u9ede\u7684\u8def\u5f91\uff0c\u4e26\u8981\u6c42\u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u3002

    \u70ba\u4e86\u6eff\u8db3\u4ee5\u4e0a\u7d04\u675f\u689d\u4ef6\uff0c\u6211\u5011\u9700\u8981\u65b0\u589e\u526a\u679d\u64cd\u4f5c\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u82e5\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\uff0c\u5247\u63d0\u524d\u8fd4\u56de\uff0c\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_compact.py
    def pre_order(root: TreeNode):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u526a\u679d\n    if root is None or root.val == 3:\n        return\n    # \u5617\u8a66\n    path.append(root)\n    if root.val == 7:\n        # \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == nullptr || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push_back(root);\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid PreOrder(TreeNode? root) {\n    // \u526a\u679d\n    if (root == null || root.val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.Add(root);\n    if (root.val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrderIII(root *TreeNode, res *[][]*TreeNode, path *[]*TreeNode) {\n    // \u526a\u679d\n    if root == nil || root.Val == 3 {\n        return\n    }\n    // \u5617\u8a66\n    *path = append(*path, root)\n    if root.Val.(int) == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunc preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    guard let root = root, root.val != 3 else {\n        return\n    }\n    // \u5617\u8a66\n    path.append(root)\n    if root.val == 7 {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfunction preOrder(root, path, res) {\n    // \u526a\u679d\n    if (root === null || root.val === 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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    // \u5617\u8a66\n    path.push(root);\n    if (root.val === 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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  // \u5617\u8a66\n  path.add(root);\n  if (root.val == 7) {\n    // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\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        // \u5617\u8a66\n        path.push(node.clone());\n        if node.borrow().val == 7 {\n            // \u8a18\u9304\u89e3\n            res.push(path.clone());\n        }\n        pre_order(res, path, node.borrow().left.clone());\n        pre_order(res, path, node.borrow().right.clone());\n        // \u56de\u9000\n        path.remove(path.len() - 1);\n    }\n}\n
    preorder_traversal_iii_compact.c
    /* \u524d\u5e8f\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nvoid preOrder(TreeNode *root) {\n    // \u526a\u679d\n    if (root == NULL || root->val == 3) {\n        return;\n    }\n    // \u5617\u8a66\n    path[pathSize++] = root;\n    if (root->val == 7) {\n        // \u8a18\u9304\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\u8d70\u8a2a\uff1a\u4f8b\u984c\u4e09 */\nfun preOrder(root: TreeNode?) {\n    // \u526a\u679d\n    if (root == null || root._val == 3) {\n        return\n    }\n    // \u5617\u8a66\n    path!!.add(root)\n    if (root._val == 7) {\n        // \u8a18\u9304\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
    [class]{}-[func]{pre_order}\n
    preorder_traversal_iii_compact.zig
    [class]{}-[func]{preOrder}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u201c\u526a\u679d\u201d\u662f\u4e00\u500b\u975e\u5e38\u5f62\u8c61\u7684\u540d\u8a5e\u3002\u5982\u5716 13-3 \u6240\u793a\uff0c\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u201c\u526a\u6389\u201d\u4e86\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u641c\u5c0b\u5206\u652f\uff0c\u907f\u514d\u8a31\u591a\u7121\u610f\u7fa9\u7684\u5617\u8a66\uff0c\u5f9e\u800c\u63d0\u9ad8\u4e86\u641c\u5c0b\u6548\u7387\u3002

    \u5716 13-3 \u00a0 \u6839\u64da\u7d04\u675f\u689d\u4ef6\u526a\u679d

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1313","title":"13.1.3 \u00a0 \u6846\u67b6\u7a0b\u5f0f\u78bc","text":"

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5617\u8a66\u5c07\u56de\u6eaf\u7684\u201c\u5617\u8a66\u3001\u56de\u9000\u3001\u526a\u679d\u201d\u7684\u4e3b\u9ad4\u6846\u67b6\u63d0\u7149\u51fa\u4f86\uff0c\u63d0\u5347\u7a0b\u5f0f\u78bc\u7684\u901a\u7528\u6027\u3002

    \u5728\u4ee5\u4e0b\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\uff0cstate \u8868\u793a\u554f\u984c\u7684\u7576\u524d\u72c0\u614b\uff0cchoices \u8868\u793a\u7576\u524d\u72c0\u614b\u4e0b\u53ef\u4ee5\u505a\u51fa\u7684\u9078\u64c7\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def backtrack(state: State, choices: list[choice], res: list[state]):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\"\"\"\n    # \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n        # \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            backtrack(state, choices, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, vector<Choice *> &choices, vector<State *> &res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Choice choice : choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid Backtrack(State state, List<Choice> choices, List<State> res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (Choice choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            Backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state *State, choices []Choice, res *[]State) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunc backtrack(state: inout State, choices: [Choice], res: inout [State]) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state: state, res: &res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            backtrack(state: &state, choices: choices, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state, choices, res) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfunction backtrack(state: State, choices: Choice[], res: State[]): void {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let choice of choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State state, List<Choice>, List<State> res) {\n  // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n    // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (Choice choice in choices) {\n    // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      backtrack(state, choices, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfn backtrack(state: &mut State, choices: &Vec<Choice>, res: &mut Vec<State>) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice);\n            backtrack(state, choices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nvoid backtrack(State *state, Choice *choices, int numChoices, State *res, int numRes) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res, numRes);\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < numChoices; i++) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, &choices[i])) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, &choices[i]);\n            backtrack(state, choices, numChoices, res, numRes);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, &choices[i]);\n        }\n    }\n}\n
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6 */\nfun backtrack(state: State?, choices: List<Choice?>, res: List<State?>?) {\n    // \u5224\u65b7\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n        // \u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u5224\u65b7\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            backtrack(state, choices, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    \n
    \n

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u57fa\u65bc\u6846\u67b6\u7a0b\u5f0f\u78bc\u4f86\u89e3\u6c7a\u4f8b\u984c\u4e09\u3002\u72c0\u614b state \u70ba\u7bc0\u9ede\u8d70\u8a2a\u8def\u5f91\uff0c\u9078\u64c7 choices \u70ba\u7576\u524d\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\uff0c\u7d50\u679c res \u662f\u8def\u5f91\u4e32\u5217\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig preorder_traversal_iii_template.py
    def is_solution(state: list[TreeNode]) -> bool:\n    \"\"\"\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3\"\"\"\n    return state and state[-1].val == 7\n\ndef record_solution(state: list[TreeNode], res: list[list[TreeNode]]):\n    \"\"\"\u8a18\u9304\u89e3\"\"\"\n    res.append(list(state))\n\ndef is_valid(state: list[TreeNode], choice: TreeNode) -> bool:\n    \"\"\"\u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\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\u72c0\u614b\"\"\"\n    state.append(choice)\n\ndef undo_choice(state: list[TreeNode], choice: TreeNode):\n    \"\"\"\u6062\u5fa9\u72c0\u614b\"\"\"\n    state.pop()\n\ndef backtrack(\n    state: list[TreeNode], choices: list[TreeNode], res: list[list[TreeNode]]\n):\n    \"\"\"\u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09\"\"\"\n    # \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state):\n        # \u8a18\u9304\u89e3\n        record_solution(state, res)\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice):\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice)\n
    preorder_traversal_iii_template.cpp
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(vector<TreeNode *> &state) {\n    return !state.empty() && state.back()->val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(vector<TreeNode *> &state, vector<vector<TreeNode *>> &res) {\n    res.push_back(state);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(vector<TreeNode *> &state, TreeNode *choice) {\n    return choice != nullptr && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.push_back(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(vector<TreeNode *> &state, TreeNode *choice) {\n    state.pop_back();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(vector<TreeNode *> &state, vector<TreeNode *> &choices, vector<vector<TreeNode *>> &res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode *choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            vector<TreeNode *> nextChoices{choice->left, choice->right};\n            backtrack(state, nextChoices, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.java
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nboolean isSolution(List<TreeNode> state) {\n    return !state.isEmpty() && state.get(state.size() - 1).val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.add(new ArrayList<>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nboolean isValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode choice) {\n    state.add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode choice) {\n    state.remove(state.size() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (TreeNode choice : choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, Arrays.asList(choice.left, choice.right), res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.cs
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool IsSolution(List<TreeNode> state) {\n    return state.Count != 0 && state[^1].val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid RecordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n    res.Add(new List<TreeNode>(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool IsValid(List<TreeNode> state, TreeNode choice) {\n    return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid MakeChoice(List<TreeNode> state, TreeNode choice) {\n    state.Add(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid UndoChoice(List<TreeNode> state, TreeNode choice) {\n    state.RemoveAt(state.Count - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid Backtrack(List<TreeNode> state, List<TreeNode> choices, List<List<TreeNode>> res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (IsSolution(state)) {\n        // \u8a18\u9304\u89e3\n        RecordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (TreeNode choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (IsValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            MakeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, [choice.left!, choice.right!], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            UndoChoice(state, choice);\n        }\n    }\n}\n
    preorder_traversal_iii_template.go
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state *[]*TreeNode) bool {\n    return len(*state) != 0 && (*state)[len(*state)-1].Val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state *[]*TreeNode, res *[][]*TreeNode) {\n    *res = append(*res, append([]*TreeNode{}, *state...))\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state *[]*TreeNode, choice *TreeNode) bool {\n    return choice != nil && choice.Val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = append(*state, choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state *[]*TreeNode, choice *TreeNode) {\n    *state = (*state)[:len(*state)-1]\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrackIII(state *[]*TreeNode, choices *[]*TreeNode, res *[][]*TreeNode) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range *choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state, choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            temp := make([]*TreeNode, 0)\n            temp = append(temp, choice.Left, choice.Right)\n            backtrackIII(state, &temp, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.swift
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunc isSolution(state: [TreeNode]) -> Bool {\n    !state.isEmpty && state.last!.val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfunc recordSolution(state: [TreeNode], res: inout [[TreeNode]]) {\n    res.append(state)\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunc isValid(state: [TreeNode], choice: TreeNode?) -> Bool {\n    choice != nil && choice!.val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunc makeChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.append(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunc undoChoice(state: inout [TreeNode], choice: TreeNode) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunc backtrack(state: inout [TreeNode], choices: [TreeNode], res: inout [[TreeNode]]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if isSolution(state: state) {\n        recordSolution(state: state, res: &res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if isValid(state: state, choice: choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state: &state, choice: choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: [choice.left, choice.right].compactMap { $0 }, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state: &state, choice: choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.js
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state) {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state, res) {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state, choice) {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state, choice) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state) {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(state, choices, res) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.ts
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfunction isSolution(state: TreeNode[]): boolean {\n    return state && state[state.length - 1]?.val === 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nfunction recordSolution(state: TreeNode[], res: TreeNode[][]): void {\n    res.push([...state]);\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfunction isValid(state: TreeNode[], choice: TreeNode): boolean {\n    return choice !== null && choice.val !== 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfunction makeChoice(state: TreeNode[], choice: TreeNode): void {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfunction undoChoice(state: TreeNode[]): void {\n    state.pop();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfunction backtrack(\n    state: TreeNode[],\n    choices: TreeNode[],\n    res: TreeNode[][]\n): void {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, [choice.left, choice.right], res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state);\n        }\n    }\n}\n
    preorder_traversal_iii_template.dart
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(List<TreeNode> state) {\n  return state.isNotEmpty && state.last.val == 7;\n}\n\n/* \u8a18\u9304\u89e3 */\nvoid recordSolution(List<TreeNode> state, List<List<TreeNode>> res) {\n  res.add(List.from(state));\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(List<TreeNode> state, TreeNode? choice) {\n  return choice != null && choice.val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(List<TreeNode> state, TreeNode? choice) {\n  state.add(choice!);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(List<TreeNode> state, TreeNode? choice) {\n  state.removeLast();\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(\n  List<TreeNode> state,\n  List<TreeNode?> choices,\n  List<List<TreeNode>> res,\n) {\n  // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n  if (isSolution(state)) {\n    // \u8a18\u9304\u89e3\n    recordSolution(state, res);\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (TreeNode? choice in choices) {\n    // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n    if (isValid(state, choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      makeChoice(state, choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, [choice!.left, choice.right], res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n      undoChoice(state, choice);\n    }\n  }\n}\n
    preorder_traversal_iii_template.rs
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfn is_solution(state: &mut Vec<Rc<RefCell<TreeNode>>>) -> bool {\n    return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7;\n}\n\n/* \u8a18\u9304\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\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfn is_valid(_: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) -> bool {\n    return choice.borrow().val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfn make_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, choice: Rc<RefCell<TreeNode>>) {\n    state.push(choice);\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfn undo_choice(state: &mut Vec<Rc<RefCell<TreeNode>>>, _: Rc<RefCell<TreeNode>>) {\n    state.remove(state.len() - 1);\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfn backtrack(\n    state: &mut Vec<Rc<RefCell<TreeNode>>>,\n    choices: &mut Vec<Rc<RefCell<TreeNode>>>,\n    res: &mut Vec<Vec<Rc<RefCell<TreeNode>>>>,\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if is_solution(state) {\n        // \u8a18\u9304\u89e3\n        record_solution(state, res);\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if is_valid(state, choice.clone()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            make_choice(state, choice.clone());\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(\n                state,\n                &mut vec![\n                    choice.borrow().left.clone().unwrap(),\n                    choice.borrow().right.clone().unwrap(),\n                ],\n                res,\n            );\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undo_choice(state, choice.clone());\n        }\n    }\n}\n
    preorder_traversal_iii_template.c
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nbool isSolution(void) {\n    return pathSize > 0 && path[pathSize - 1]->val == 7;\n}\n\n/* \u8a18\u9304\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\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nbool isValid(TreeNode *choice) {\n    return choice != NULL && choice->val != 3;\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nvoid makeChoice(TreeNode *choice) {\n    path[pathSize++] = choice;\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nvoid undoChoice(void) {\n    pathSize--;\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nvoid backtrack(TreeNode *choices[2]) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution()) {\n        // \u8a18\u9304\u89e3\n        recordSolution();\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < 2; i++) {\n        TreeNode *choice = choices[i];\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            TreeNode *nextChoices[2] = {choice->left, choice->right};\n            backtrack(nextChoices);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice();\n        }\n    }\n}\n
    preorder_traversal_iii_template.kt
    /* \u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5426\u70ba\u89e3 */\nfun isSolution(state: MutableList<TreeNode?>): Boolean {\n    return state.isNotEmpty() && state[state.size - 1]?._val == 7\n}\n\n/* \u8a18\u9304\u89e3 */\nfun recordSolution(state: MutableList<TreeNode?>?, res: MutableList<MutableList<TreeNode?>?>) {\n    res.add(state!!.toMutableList())\n}\n\n/* \u5224\u65b7\u5728\u7576\u524d\u72c0\u614b\u4e0b\uff0c\u8a72\u9078\u64c7\u662f\u5426\u5408\u6cd5 */\nfun isValid(state: MutableList<TreeNode?>?, choice: TreeNode?): Boolean {\n    return choice != null && choice._val != 3\n}\n\n/* \u66f4\u65b0\u72c0\u614b */\nfun makeChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.add(choice)\n}\n\n/* \u6062\u5fa9\u72c0\u614b */\nfun undoChoice(state: MutableList<TreeNode?>, choice: TreeNode?) {\n    state.removeLast()\n}\n\n/* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u4f8b\u984c\u4e09 */\nfun backtrack(\n    state: MutableList<TreeNode?>,\n    choices: MutableList<TreeNode?>,\n    res: MutableList<MutableList<TreeNode?>?>\n) {\n    // \u6aa2\u67e5\u662f\u5426\u70ba\u89e3\n    if (isSolution(state)) {\n        // \u8a18\u9304\u89e3\n        recordSolution(state, res)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u6aa2\u67e5\u9078\u64c7\u662f\u5426\u5408\u6cd5\n        if (isValid(state, choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            makeChoice(state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, mutableListOf(choice!!.left, choice.right), res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n            undoChoice(state, choice)\n        }\n    }\n}\n
    preorder_traversal_iii_template.rb
    [class]{}-[func]{is_solution}\n\n[class]{}-[func]{record_solution}\n\n[class]{}-[func]{is_valid}\n\n[class]{}-[func]{make_choice}\n\n[class]{}-[func]{undo_choice}\n\n[class]{}-[func]{backtrack}\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6839\u64da\u984c\u610f\uff0c\u6211\u5011\u5728\u627e\u5230\u503c\u70ba \\(7\\) \u7684\u7bc0\u9ede\u5f8c\u61c9\u8a72\u7e7c\u7e8c\u641c\u5c0b\uff0c\u56e0\u6b64\u9700\u8981\u5c07\u8a18\u9304\u89e3\u4e4b\u5f8c\u7684 return \u8a9e\u53e5\u522a\u9664\u3002\u5716 13-4 \u5c0d\u6bd4\u4e86\u4fdd\u7559\u6216\u522a\u9664 return \u8a9e\u53e5\u7684\u641c\u5c0b\u904e\u7a0b\u3002

    \u5716 13-4 \u00a0 \u4fdd\u7559\u8207\u522a\u9664 return \u7684\u641c\u5c0b\u904e\u7a0b\u5c0d\u6bd4

    \u76f8\u6bd4\u57fa\u65bc\u524d\u5e8f\u8d70\u8a2a\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\uff0c\u57fa\u65bc\u56de\u6eaf\u6f14\u7b97\u6cd5\u6846\u67b6\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u96d6\u7136\u986f\u5f97\u56c9\u5506\uff0c\u4f46\u901a\u7528\u6027\u66f4\u597d\u3002\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u56de\u6eaf\u554f\u984c\u53ef\u4ee5\u5728\u8a72\u6846\u67b6\u4e0b\u89e3\u6c7a\u3002\u6211\u5011\u53ea\u9700\u6839\u64da\u5177\u9ad4\u554f\u984c\u4f86\u5b9a\u7fa9 state \u548c choices \uff0c\u4e26\u5be6\u73fe\u6846\u67b6\u4e2d\u7684\u5404\u500b\u65b9\u6cd5\u5373\u53ef\u3002

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

    \u70ba\u4e86\u66f4\u6e05\u6670\u5730\u5206\u6790\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u6211\u5011\u7e3d\u7d50\u4e00\u4e0b\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e2d\u5e38\u7528\u8853\u8a9e\u7684\u542b\u7fa9\uff0c\u4e26\u5c0d\u7167\u4f8b\u984c\u4e09\u7d66\u51fa\u5c0d\u61c9\u793a\u4f8b\uff0c\u5982\u8868 13-1 \u6240\u793a\u3002

    \u8868 13-1 \u00a0 \u5e38\u898b\u7684\u56de\u6eaf\u6f14\u7b97\u6cd5\u8853\u8a9e

    \u540d\u8a5e \u5b9a\u7fa9 \u4f8b\u984c\u4e09 \u89e3\uff08solution\uff09 \u89e3\u662f\u6eff\u8db3\u554f\u984c\u7279\u5b9a\u689d\u4ef6\u7684\u7b54\u6848\uff0c\u53ef\u80fd\u6709\u4e00\u500b\u6216\u591a\u500b \u6839\u7bc0\u9ede\u5230\u7bc0\u9ede \\(7\\) \u7684\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u6240\u6709\u8def\u5f91 \u7d04\u675f\u689d\u4ef6\uff08constraint\uff09 \u7d04\u675f\u689d\u4ef6\u662f\u554f\u984c\u4e2d\u9650\u5236\u89e3\u7684\u53ef\u884c\u6027\u7684\u689d\u4ef6\uff0c\u901a\u5e38\u7528\u65bc\u526a\u679d \u8def\u5f91\u4e2d\u4e0d\u5305\u542b\u7bc0\u9ede \\(3\\) \u72c0\u614b\uff08state\uff09 \u72c0\u614b\u8868\u793a\u554f\u984c\u5728\u67d0\u4e00\u6642\u523b\u7684\u60c5\u6cc1\uff0c\u5305\u62ec\u5df2\u7d93\u505a\u51fa\u7684\u9078\u64c7 \u7576\u524d\u5df2\u8a2a\u554f\u7684\u7bc0\u9ede\u8def\u5f91\uff0c\u5373 path \u7bc0\u9ede\u4e32\u5217 \u5617\u8a66\uff08attempt\uff09 \u5617\u8a66\u662f\u6839\u64da\u53ef\u7528\u9078\u64c7\u4f86\u63a2\u7d22\u89e3\u7a7a\u9593\u7684\u904e\u7a0b\uff0c\u5305\u62ec\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\uff0c\u6aa2\u67e5\u662f\u5426\u70ba\u89e3 \u905e\u8ff4\u8a2a\u554f\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\uff0c\u5c07\u7bc0\u9ede\u65b0\u589e\u9032 path \uff0c\u5224\u65b7\u7bc0\u9ede\u7684\u503c\u662f\u5426\u70ba \\(7\\) \u56de\u9000\uff08backtracking\uff09 \u56de\u9000\u6307\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u72c0\u614b\u6642\uff0c\u64a4\u92b7\u524d\u9762\u505a\u51fa\u7684\u9078\u64c7\uff0c\u56de\u5230\u4e0a\u4e00\u500b\u72c0\u614b \u7576\u8d8a\u904e\u8449\u7bc0\u9ede\u3001\u7d50\u675f\u7bc0\u9ede\u8a2a\u554f\u3001\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\u7d42\u6b62\u641c\u5c0b\uff0c\u51fd\u5f0f\u8fd4\u56de \u526a\u679d\uff08pruning\uff09 \u526a\u679d\u662f\u6839\u64da\u554f\u984c\u7279\u6027\u548c\u7d04\u675f\u689d\u4ef6\u907f\u514d\u7121\u610f\u7fa9\u7684\u641c\u5c0b\u8def\u5f91\u7684\u65b9\u6cd5\uff0c\u53ef\u63d0\u9ad8\u641c\u5c0b\u6548\u7387 \u7576\u9047\u5230\u503c\u70ba \\(3\\) \u7684\u7bc0\u9ede\u6642\uff0c\u5247\u4e0d\u518d\u7e7c\u7e8c\u641c\u5c0b

    Tip

    \u554f\u984c\u3001\u89e3\u3001\u72c0\u614b\u7b49\u6982\u5ff5\u662f\u901a\u7528\u7684\uff0c\u5728\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u4e2d\u90fd\u6709\u6d89\u53ca\u3002

    "},{"location":"chapter_backtracking/backtracking_algorithm/#1315","title":"13.1.5 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u4e0a\u662f\u4e00\u7a2e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u6f14\u7b97\u6cd5\uff0c\u5b83\u5617\u8a66\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\u76f4\u5230\u627e\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u3002\u9019\u7a2e\u65b9\u6cd5\u7684\u512a\u9ede\u5728\u65bc\u80fd\u5920\u627e\u5230\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\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\u8655\u7406\u5927\u898f\u6a21\u6216\u8005\u8907\u96dc\u554f\u984c\u6642\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6548\u7387\u53ef\u80fd\u96e3\u4ee5\u63a5\u53d7\u3002

    • \u6642\u9593\uff1a\u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u9700\u8981\u8d70\u8a2a\u72c0\u614b\u7a7a\u9593\u7684\u6240\u6709\u53ef\u80fd\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u6307\u6578\u968e\u6216\u968e\u4e58\u968e\u3002
    • \u7a7a\u9593\uff1a\u5728\u905e\u8ff4\u547c\u53eb\u4e2d\u9700\u8981\u5132\u5b58\u7576\u524d\u7684\u72c0\u614b\uff08\u4f8b\u5982\u8def\u5f91\u3001\u7528\u65bc\u526a\u679d\u7684\u8f14\u52a9\u8b8a\u6578\u7b49\uff09\uff0c\u7576\u6df1\u5ea6\u5f88\u5927\u6642\uff0c\u7a7a\u9593\u9700\u6c42\u53ef\u80fd\u6703\u8b8a\u5f97\u5f88\u5927\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u56de\u6eaf\u6f14\u7b97\u6cd5\u4ecd\u7136\u662f\u67d0\u4e9b\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u7684\u6700\u4f73\u89e3\u6c7a\u65b9\u6848\u3002\u5c0d\u65bc\u9019\u4e9b\u554f\u984c\uff0c\u7531\u65bc\u7121\u6cd5\u9810\u6e2c\u54ea\u4e9b\u9078\u64c7\u53ef\u751f\u6210\u6709\u6548\u7684\u89e3\uff0c\u56e0\u6b64\u6211\u5011\u5fc5\u9808\u5c0d\u6240\u6709\u53ef\u80fd\u7684\u9078\u64c7\u9032\u884c\u8d70\u8a2a\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u95dc\u9375\u662f\u5982\u4f55\u6700\u4f73\u5316\u6548\u7387\uff0c\u5e38\u898b\u7684\u6548\u7387\u6700\u4f73\u5316\u65b9\u6cd5\u6709\u5169\u7a2e\u3002

    • \u526a\u679d\uff1a\u907f\u514d\u641c\u5c0b\u90a3\u4e9b\u80af\u5b9a\u4e0d\u6703\u7522\u751f\u89e3\u7684\u8def\u5f91\uff0c\u5f9e\u800c\u7bc0\u7701\u6642\u9593\u548c\u7a7a\u9593\u3002
    • \u555f\u767c\u5f0f\u641c\u5c0b\uff1a\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5f15\u5165\u4e00\u4e9b\u7b56\u7565\u6216\u8005\u4f30\u8a08\u503c\uff0c\u5f9e\u800c\u512a\u5148\u641c\u5c0b\u6700\u6709\u53ef\u80fd\u7522\u751f\u6709\u6548\u89e3\u7684\u8def\u5f91\u3002
    "},{"location":"chapter_backtracking/backtracking_algorithm/#1316","title":"13.1.6 \u00a0 \u56de\u6eaf\u5178\u578b\u4f8b\u984c","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u641c\u5c0b\u554f\u984c\u3001\u7d04\u675f\u6eff\u8db3\u554f\u984c\u548c\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u3002

    \u641c\u5c0b\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u89e3\u6c7a\u65b9\u6848\u3002

    • \u5168\u6392\u5217\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff0c\u6c42\u51fa\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u7d44\u5408\u3002
    • \u5b50\u96c6\u548c\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\u548c\u4e00\u500b\u76ee\u6a19\u548c\uff0c\u627e\u5230\u96c6\u5408\u4e2d\u6240\u6709\u548c\u70ba\u76ee\u6a19\u548c\u7684\u5b50\u96c6\u3002
    • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\u548c\u4e00\u7cfb\u5217\u5927\u5c0f\u4e0d\u540c\u7684\u5713\u76e4\uff0c\u8981\u6c42\u5c07\u6240\u6709\u5713\u76e4\u5f9e\u4e00\u6839\u67f1\u5b50\u79fb\u52d5\u5230\u53e6\u4e00\u6839\u67f1\u5b50\uff0c\u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\uff0c\u4e14\u4e0d\u80fd\u5c07\u5927\u5713\u76e4\u653e\u5728\u5c0f\u5713\u76e4\u4e0a\u3002

    \u7d04\u675f\u6eff\u8db3\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u5230\u6eff\u8db3\u6240\u6709\u7d04\u675f\u689d\u4ef6\u7684\u89e3\u3002

    • \\(n\\) \u7687\u540e\uff1a\u5728 \\(n \\times n\\) \u7684\u68cb\u76e4\u4e0a\u653e\u7f6e \\(n\\) \u500b\u7687\u540e\uff0c\u4f7f\u5f97\u5b83\u5011\u4e92\u4e0d\u653b\u64ca\u3002
    • \u6578\u7368\uff1a\u5728 \\(9 \\times 9\\) \u7684\u7db2\u683c\u4e2d\u586b\u5165\u6578\u5b57 \\(1\\) ~ \\(9\\) \uff0c\u4f7f\u5f97\u6bcf\u884c\u3001\u6bcf\u5217\u548c\u6bcf\u500b \\(3 \\times 3\\) \u5b50\u7db2\u683c\u4e2d\u7684\u6578\u5b57\u4e0d\u91cd\u8907\u3002
    • \u5716\u8457\u8272\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u7528\u6700\u5c11\u7684\u984f\u8272\u7d66\u5716\u7684\u6bcf\u500b\u9802\u9ede\u8457\u8272\uff0c\u4f7f\u5f97\u76f8\u9130\u9802\u9ede\u984f\u8272\u4e0d\u540c\u3002

    \u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff1a\u9019\u985e\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u4e00\u500b\u7d44\u5408\u7a7a\u9593\u4e2d\u627e\u5230\u6eff\u8db3\u67d0\u4e9b\u689d\u4ef6\u7684\u6700\u512a\u89e3\u3002

    • 0-1 \u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u80cc\u5305\uff0c\u6bcf\u500b\u7269\u54c1\u6709\u4e00\u5b9a\u7684\u50f9\u503c\u548c\u91cd\u91cf\uff0c\u8981\u6c42\u5728\u80cc\u5305\u5bb9\u91cf\u9650\u5236\u5167\uff0c\u9078\u64c7\u7269\u54c1\u4f7f\u5f97\u7e3d\u50f9\u503c\u6700\u5927\u3002
    • \u65c5\u884c\u5546\u554f\u984c\uff1a\u5728\u4e00\u500b\u5716\u4e2d\uff0c\u5f9e\u4e00\u500b\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u6240\u6709\u5176\u4ed6\u9ede\u6070\u597d\u4e00\u6b21\u5f8c\u8fd4\u56de\u8d77\u9ede\uff0c\u6c42\u6700\u77ed\u8def\u5f91\u3002
    • \u6700\u5927\u5718\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u500b\u7121\u5411\u5716\uff0c\u627e\u5230\u6700\u5927\u7684\u5b8c\u5168\u5b50\u5716\uff0c\u5373\u5b50\u5716\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9802\u9ede\u4e4b\u9593\u90fd\u6709\u908a\u76f8\u9023\u3002

    \u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff0c\u56de\u6eaf\u4e0d\u662f\u6700\u512a\u89e3\u6c7a\u65b9\u6848\u3002

    • 0-1 \u80cc\u5305\u554f\u984c\u901a\u5e38\u4f7f\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\uff0c\u4ee5\u9054\u5230\u66f4\u9ad8\u7684\u6642\u9593\u6548\u7387\u3002
    • \u65c5\u884c\u5546\u662f\u4e00\u500b\u8457\u540d\u7684 NP-Hard \u554f\u984c\uff0c\u5e38\u7528\u89e3\u6cd5\u6709\u907a\u50b3\u6f14\u7b97\u6cd5\u548c\u87fb\u7fa4\u6f14\u7b97\u6cd5\u7b49\u3002
    • \u6700\u5927\u5718\u554f\u984c\u662f\u5716\u8ad6\u4e2d\u7684\u4e00\u500b\u7d93\u5178\u554f\u984c\uff0c\u53ef\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u555f\u767c\u5f0f\u6f14\u7b97\u6cd5\u4f86\u89e3\u6c7a\u3002
    "},{"location":"chapter_backtracking/n_queens_problem/","title":"13.4 \u00a0 n \u7687\u540e\u554f\u984c","text":"

    Question

    \u6839\u64da\u570b\u969b\u8c61\u68cb\u7684\u898f\u5247\uff0c\u7687\u540e\u53ef\u4ee5\u653b\u64ca\u8207\u540c\u8655\u4e00\u884c\u3001\u4e00\u5217\u6216\u4e00\u689d\u659c\u7dda\u4e0a\u7684\u68cb\u5b50\u3002\u7d66\u5b9a \\(n\\) \u500b\u7687\u540e\u548c\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\uff0c\u5c0b\u627e\u4f7f\u5f97\u6240\u6709\u7687\u540e\u4e4b\u9593\u7121\u6cd5\u76f8\u4e92\u653b\u64ca\u7684\u64fa\u653e\u65b9\u6848\u3002

    \u5982\u5716 13-15 \u6240\u793a\uff0c\u7576 \\(n = 4\\) \u6642\uff0c\u5171\u53ef\u4ee5\u627e\u5230\u5169\u500b\u89e3\u3002\u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\\(n \\times n\\) \u5927\u5c0f\u7684\u68cb\u76e4\u5171\u6709 \\(n^2\\) \u500b\u683c\u5b50\uff0c\u7d66\u51fa\u4e86\u6240\u6709\u7684\u9078\u64c7 choices \u3002\u5728\u9010\u500b\u653e\u7f6e\u7687\u540e\u7684\u904e\u7a0b\u4e2d\uff0c\u68cb\u76e4\u72c0\u614b\u5728\u4e0d\u65b7\u5730\u8b8a\u5316\uff0c\u6bcf\u500b\u6642\u523b\u7684\u68cb\u76e4\u5c31\u662f\u72c0\u614b state \u3002

    \u5716 13-15 \u00a0 4 \u7687\u540e\u554f\u984c\u7684\u89e3

    \u5716 13-16 \u5c55\u793a\u4e86\u672c\u984c\u7684\u4e09\u500b\u7d04\u675f\u689d\u4ef6\uff1a\u591a\u500b\u7687\u540e\u4e0d\u80fd\u5728\u540c\u4e00\u884c\u3001\u540c\u4e00\u5217\u3001\u540c\u4e00\u689d\u5c0d\u89d2\u7dda\u4e0a\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u5c0d\u89d2\u7dda\u5206\u70ba\u4e3b\u5c0d\u89d2\u7dda \\ \u548c\u6b21\u5c0d\u89d2\u7dda / \u5169\u7a2e\u3002

    \u5716 13-16 \u00a0 n \u7687\u540e\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6

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

    \u7687\u540e\u7684\u6578\u91cf\u548c\u68cb\u76e4\u7684\u884c\u6578\u90fd\u70ba \\(n\\) \uff0c\u56e0\u6b64\u6211\u5011\u5bb9\u6613\u5f97\u5230\u4e00\u500b\u63a8\u8ad6\uff1a\u68cb\u76e4\u6bcf\u884c\u90fd\u5141\u8a31\u4e14\u53ea\u5141\u8a31\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u53d6\u9010\u884c\u653e\u7f6e\u7b56\u7565\uff1a\u5f9e\u7b2c\u4e00\u884c\u958b\u59cb\uff0c\u5728\u6bcf\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\uff0c\u76f4\u81f3\u6700\u5f8c\u4e00\u884c\u7d50\u675f\u3002

    \u5716 13-17 \u6240\u793a\u70ba \\(4\\) \u7687\u540e\u554f\u984c\u7684\u9010\u884c\u653e\u7f6e\u904e\u7a0b\u3002\u53d7\u756b\u5e45\u9650\u5236\uff0c\u5716 13-17 \u50c5\u5c55\u958b\u4e86\u7b2c\u4e00\u884c\u7684\u5176\u4e2d\u4e00\u500b\u641c\u5c0b\u5206\u652f\uff0c\u4e26\u4e14\u5c07\u4e0d\u6eff\u8db3\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u65b9\u6848\u90fd\u9032\u884c\u4e86\u526a\u679d\u3002

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

    \u5f9e\u672c\u8cea\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\u73fe\u591a\u500b\u7687\u540e\u7684\u6240\u6709\u641c\u5c0b\u5206\u652f\u3002

    "},{"location":"chapter_backtracking/n_queens_problem/#2","title":"2. \u00a0 \u5217\u8207\u5c0d\u89d2\u7dda\u526a\u679d","text":"

    \u70ba\u4e86\u6eff\u8db3\u5217\u7d04\u675f\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u5e03\u6797\u578b\u9663\u5217 cols \u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\u3002\u5728\u6bcf\u6b21\u6c7a\u5b9a\u653e\u7f6e\u524d\uff0c\u6211\u5011\u900f\u904e cols \u5c07\u5df2\u6709\u7687\u540e\u7684\u5217\u9032\u884c\u526a\u679d\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u52d5\u614b\u66f4\u65b0 cols \u7684\u72c0\u614b\u3002

    \u90a3\u9ebc\uff0c\u5982\u4f55\u8655\u7406\u5c0d\u89d2\u7dda\u7d04\u675f\u5462\uff1f\u8a2d\u68cb\u76e4\u4e2d\u67d0\u500b\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\((row, col)\\) \uff0c\u9078\u5b9a\u77e9\u9663\u4e2d\u7684\u67d0\u689d\u4e3b\u5c0d\u89d2\u7dda\uff0c\u6211\u5011\u767c\u73fe\u8a72\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684\u884c\u7d22\u5f15\u6e1b\u5217\u7d22\u5f15\u90fd\u76f8\u7b49\uff0c\u5373\u5c0d\u89d2\u7dda\u4e0a\u6240\u6709\u683c\u5b50\u7684 \\(row - col\\) \u70ba\u6046\u5b9a\u503c\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5982\u679c\u5169\u500b\u683c\u5b50\u6eff\u8db3 \\(row_1 - col_1 = row_2 - col_2\\) \uff0c\u5247\u5b83\u5011\u4e00\u5b9a\u8655\u5728\u540c\u4e00\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u3002\u5229\u7528\u8a72\u898f\u5f8b\uff0c\u6211\u5011\u53ef\u4ee5\u85c9\u52a9\u5716 13-18 \u6240\u793a\u7684\u9663\u5217 diags1 \u8a18\u9304\u6bcf\u689d\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\u3002

    \u540c\u7406\uff0c\u6b21\u5c0d\u89d2\u7dda\u4e0a\u7684\u6240\u6709\u683c\u5b50\u7684 \\(row + col\\) \u662f\u6046\u5b9a\u503c\u3002\u6211\u5011\u540c\u6a23\u4e5f\u53ef\u4ee5\u85c9\u52a9\u9663\u5217 diags2 \u4f86\u8655\u7406\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002

    \u5716 13-18 \u00a0 \u8655\u7406\u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f

    "},{"location":"chapter_backtracking/n_queens_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u8acb\u6ce8\u610f\uff0c\\(n\\) \u7dad\u65b9\u9663\u4e2d \\(row - col\\) \u7684\u7bc4\u570d\u662f \\([-n + 1, n - 1]\\) \uff0c\\(row + col\\) \u7684\u7bc4\u570d\u662f \\([0, 2n - 2]\\) \uff0c\u6240\u4ee5\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7684\u6578\u91cf\u90fd\u70ba \\(2n - 1\\) \uff0c\u5373\u9663\u5217 diags1 \u548c diags2 \u7684\u9577\u5ea6\u90fd\u70ba \\(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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e\"\"\"\n    # \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n:\n        res.append([list(row) for row in state])\n        return\n    # \u8d70\u8a2a\u6240\u6709\u5217\n    for col in range(n):\n        # \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 = row - col + n - 1\n        diag2 = row + col\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if not cols[col] and not diags1[diag1] and not diags2[diag2]:\n            # \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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  # \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    diags1 = [False] * (2 * n - 1)  # \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    diags2 = [False] * (2 * n - 1)  # \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row == n) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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);           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags1(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    vector<bool> diags2(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags1 = new boolean[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    boolean[] diags2 = new boolean[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool[] diags1 = new bool[2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool[] diags2 = new bool[2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunc backtrack(row, n int, state *[][]string, res *[][][]string, cols, diags1, diags2 *[]bool) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col := 0; col < n; col++ {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        diag1 := row - col + n - 1\n        diag2 := row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !(*cols)[col] && !(*diags1)[diag1] && !(*diags2)[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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    // \u8a18\u9304\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if row == n {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0 ..< n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row - col + n - 1\n        let diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    var diags1 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    var diags2 = Array(repeating: false, count: 2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\u7b97\u6cd5\uff1an \u7687\u540e */\nfunction backtrack(row, n, state, res, cols, diags1, diags2) {\n    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\u89e3\n    if (row === n) {\n        res.push(state.map((row) => row.slice()));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (let col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        const diag1 = row - col + n - 1;\n        const diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    const diags1 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    const diags2 = Array(2 * n - 1).fill(false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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  // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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  // \u8d70\u8a2a\u6240\u6709\u5217\n  for (int col = 0; col < n; col++) {\n    // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n    int diag1 = row - col + n - 1;\n    int diag2 = row + col;\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n    if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n      // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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); // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags1 = List.filled(2 * n - 1, false); // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n  List<bool> diags2 = List.filled(2 * n - 1, false); // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for col in 0..n {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        let diag1 = row + n - 1 - col;\n        let diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if !cols[col] && !diags1[diag1] && !diags2[diag2] {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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]; // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    let mut diags1 = vec![false; 2 * n - 1]; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    let mut diags2 = vec![false; 2 * n - 1]; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (int col = 0; col < n; col++) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        int diag1 = row - col + n - 1;\n        int diag2 = row + col;\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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};           // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    bool diags1[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    bool diags2[2 * MAX_SIZE - 1] = {false}; // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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\u6f14\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    // \u7576\u653e\u7f6e\u5b8c\u6240\u6709\u884c\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u5217\n    for (col in 0..<n) {\n        // \u8a08\u7b97\u8a72\u683c\u5b50\u5c0d\u61c9\u7684\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\n        val diag1 = row - col + n - 1\n        val diag2 = row + col\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8a72\u683c\u5b50\u6240\u5728\u5217\u3001\u4e3b\u5c0d\u89d2\u7dda\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u5b58\u5728\u7687\u540e\n        if (!cols[col] && !diags1[diag1] && !diags2[diag2]) {\n            // \u5617\u8a66\uff1a\u5c07\u7687\u540e\u653e\u7f6e\u5728\u8a72\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\u5c07\u8a72\u683c\u5b50\u6062\u5fa9\u70ba\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\u76e4\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) // \u8a18\u9304\u5217\u662f\u5426\u6709\u7687\u540e\n    val diags1 = BooleanArray(2 * n - 1) // \u8a18\u9304\u4e3b\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u6709\u7687\u540e\n    val diags2 = BooleanArray(2 * n - 1) // \u8a18\u9304\u6b21\u5c0d\u89d2\u7dda\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{n_queens}\n
    n_queens.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{nQueens}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9010\u884c\u653e\u7f6e \\(n\\) \u6b21\uff0c\u8003\u616e\u5217\u7d04\u675f\uff0c\u5247\u5f9e\u7b2c\u4e00\u884c\u5230\u6700\u5f8c\u4e00\u884c\u5206\u5225\u6709 \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u500b\u9078\u64c7\uff0c\u4f7f\u7528 \\(O(n!)\\) \u6642\u9593\u3002\u7576\u8a18\u9304\u89e3\u6642\uff0c\u9700\u8981\u8907\u88fd\u77e9\u9663 state \u4e26\u65b0\u589e\u9032 res \uff0c\u8907\u88fd\u64cd\u4f5c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002\u56e0\u6b64\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n! \\cdot n^2)\\) \u3002\u5be6\u969b\u4e0a\uff0c\u6839\u64da\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u526a\u679d\u4e5f\u80fd\u5920\u5927\u5e45\u7e2e\u5c0f\u641c\u5c0b\u7a7a\u9593\uff0c\u56e0\u800c\u641c\u5c0b\u6548\u7387\u5f80\u5f80\u512a\u65bc\u4ee5\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u3002

    \u9663\u5217 state \u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff0c\u9663\u5217 cols\u3001diags1 \u548c diags2 \u7686\u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

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

    \u5168\u6392\u5217\u554f\u984c\u662f\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u7684\u5b9a\u7fa9\u662f\u5728\u7d66\u5b9a\u4e00\u500b\u96c6\u5408\uff08\u5982\u4e00\u500b\u9663\u5217\u6216\u5b57\u4e32\uff09\u7684\u60c5\u6cc1\u4e0b\uff0c\u627e\u51fa\u5176\u4e2d\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u8868 13-2 \u5217\u8209\u4e86\u5e7e\u500b\u793a\u4f8b\u8cc7\u6599\uff0c\u5305\u62ec\u8f38\u5165\u9663\u5217\u548c\u5c0d\u61c9\u7684\u6240\u6709\u6392\u5217\u3002

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

    \u8f38\u5165\u9663\u5217 \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 \u7121\u76f8\u7b49\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u5176\u4e2d\u4e0d\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002

    \u5f9e\u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u751f\u6210\u6392\u5217\u7684\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\u3002\u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 2, 3]\\) \uff0c\u5982\u679c\u6211\u5011\u5148\u9078\u64c7 \\(1\\) \uff0c\u518d\u9078\u64c7 \\(3\\) \uff0c\u6700\u5f8c\u9078\u64c7 \\(2\\) \uff0c\u5247\u7372\u5f97\u6392\u5217 \\([1, 3, 2]\\) \u3002\u56de\u9000\u8868\u793a\u64a4\u92b7\u4e00\u500b\u9078\u64c7\uff0c\u4e4b\u5f8c\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002

    \u5f9e\u56de\u6eaf\u7a0b\u5f0f\u78bc\u7684\u89d2\u5ea6\u770b\uff0c\u5019\u9078\u96c6\u5408 choices \u662f\u8f38\u5165\u9663\u5217\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u72c0\u614b state \u662f\u76f4\u81f3\u76ee\u524d\u5df2\u88ab\u9078\u64c7\u7684\u5143\u7d20\u3002\u8acb\u6ce8\u610f\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u5141\u8a31\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u56e0\u6b64 state \u4e2d\u7684\u6240\u6709\u5143\u7d20\u90fd\u61c9\u8a72\u662f\u552f\u4e00\u7684\u3002

    \u5982\u5716 13-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u641c\u5c0b\u904e\u7a0b\u5c55\u958b\u6210\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u7576\u524d\u72c0\u614b state \u3002\u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u7d93\u904e\u4e09\u8f2a\u9078\u64c7\u5f8c\u5230\u9054\u8449\u7bc0\u9ede\uff0c\u6bcf\u500b\u8449\u7bc0\u9ede\u90fd\u5c0d\u61c9\u4e00\u500b\u6392\u5217\u3002

    \u5716 13-5 \u00a0 \u5168\u6392\u5217\u7684\u905e\u8ff4\u6a39

    "},{"location":"chapter_backtracking/permutations_problem/#1","title":"1. \u00a0 \u91cd\u8907\u9078\u64c7\u526a\u679d","text":"

    \u70ba\u4e86\u5be6\u73fe\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u6211\u5011\u8003\u616e\u5f15\u5165\u4e00\u500b\u5e03\u6797\u578b\u9663\u5217 selected \uff0c\u5176\u4e2d selected[i] \u8868\u793a choices[i] \u662f\u5426\u5df2\u88ab\u9078\u64c7\uff0c\u4e26\u57fa\u65bc\u5b83\u5be6\u73fe\u4ee5\u4e0b\u526a\u679d\u64cd\u4f5c\u3002

    • \u5728\u505a\u51fa\u9078\u64c7 choice[i] \u5f8c\uff0c\u6211\u5011\u5c31\u5c07 selected[i] \u8ce6\u503c\u70ba \\(\\text{True}\\) \uff0c\u4ee3\u8868\u5b83\u5df2\u88ab\u9078\u64c7\u3002
    • \u8d70\u8a2a\u9078\u64c7\u4e32\u5217 choices \u6642\uff0c\u8df3\u904e\u6240\u6709\u5df2\u88ab\u9078\u64c7\u7684\u7bc0\u9ede\uff0c\u5373\u526a\u679d\u3002

    \u5982\u5716 13-6 \u6240\u793a\uff0c\u5047\u8a2d\u6211\u5011\u7b2c\u4e00\u8f2a\u9078\u64c7 1 \uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7 3 \uff0c\u7b2c\u4e09\u8f2a\u9078\u64c7 2 \uff0c\u5247\u9700\u8981\u5728\u7b2c\u4e8c\u8f2a\u526a\u6389\u5143\u7d20 1 \u7684\u5206\u652f\uff0c\u5728\u7b2c\u4e09\u8f2a\u526a\u6389\u5143\u7d20 1 \u548c\u5143\u7d20 3 \u7684\u5206\u652f\u3002

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

    \u89c0\u5bdf\u5716 13-6 \u767c\u73fe\uff0c\u8a72\u526a\u679d\u64cd\u4f5c\u5c07\u641c\u5c0b\u7a7a\u9593\u5927\u5c0f\u5f9e \\(O(n^n)\\) \u6e1b\u5c0f\u81f3 \\(O(n!)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u60f3\u6e05\u695a\u4ee5\u4e0a\u8cc7\u8a0a\u4e4b\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5728\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u505a\u201c\u5b8c\u5f62\u586b\u7a7a\u201d\u4e86\u3002\u70ba\u4e86\u7e2e\u77ed\u6574\u9ad4\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4e0d\u55ae\u7368\u5be6\u73fe\u6846\u67b6\u7a0b\u5f0f\u78bc\u4e2d\u7684\u5404\u500b\u51fd\u5f0f\uff0c\u800c\u662f\u5c07\u5b83\u5011\u5c55\u958b\u5728 backtrack() \u51fd\u5f0f\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if not selected[i]:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.size(); i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrackI(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        choice := (*choices)[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n    if (!selected[i]) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        let choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if !selected[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 I */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20\n        if (!selected[i]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_i}\n
    permutations_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsI}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    Question

    \u8f38\u5165\u4e00\u500b\u6574\u6578\u9663\u5217\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u8fd4\u56de\u6240\u6709\u4e0d\u91cd\u8907\u7684\u6392\u5217\u3002

    \u5047\u8a2d\u8f38\u5165\u9663\u5217\u70ba \\([1, 1, 2]\\) \u3002\u70ba\u4e86\u65b9\u4fbf\u5340\u5206\u5169\u500b\u91cd\u8907\u5143\u7d20 \\(1\\) \uff0c\u6211\u5011\u5c07\u7b2c\u4e8c\u500b \\(1\\) \u8a18\u70ba \\(\\hat{1}\\) \u3002

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

    \u5716 13-7 \u00a0 \u91cd\u8907\u6392\u5217

    \u90a3\u9ebc\u5982\u4f55\u53bb\u9664\u91cd\u8907\u7684\u6392\u5217\u5462\uff1f\u6700\u76f4\u63a5\u5730\uff0c\u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u76f4\u63a5\u5c0d\u6392\u5217\u7d50\u679c\u9032\u884c\u53bb\u91cd\u3002\u7136\u800c\u9019\u6a23\u505a\u4e0d\u5920\u512a\u96c5\uff0c\u56e0\u70ba\u751f\u6210\u91cd\u8907\u6392\u5217\u7684\u641c\u5c0b\u5206\u652f\u6c92\u6709\u5fc5\u8981\uff0c\u61c9\u7576\u63d0\u524d\u8b58\u5225\u4e26\u526a\u679d\uff0c\u9019\u6a23\u53ef\u4ee5\u9032\u4e00\u6b65\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002

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

    \u89c0\u5bdf\u5716 13-8 \uff0c\u5728\u7b2c\u4e00\u8f2a\u4e2d\uff0c\u9078\u64c7 \\(1\\) \u6216\u9078\u64c7 \\(\\hat{1}\\) \u662f\u7b49\u50f9\u7684\uff0c\u5728\u9019\u5169\u500b\u9078\u64c7\u4e4b\u4e0b\u751f\u6210\u7684\u6240\u6709\u6392\u5217\u90fd\u662f\u91cd\u8907\u7684\u3002\u56e0\u6b64\u61c9\u8a72\u628a \\(\\hat{1}\\) \u526a\u679d\u3002

    \u540c\u7406\uff0c\u5728\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(2\\) \u4e4b\u5f8c\uff0c\u7b2c\u4e8c\u8f2a\u9078\u64c7\u4e2d\u7684 \\(1\\) \u548c \\(\\hat{1}\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5206\u652f\uff0c\u56e0\u6b64\u4e5f\u61c9\u5c07\u7b2c\u4e8c\u8f2a\u7684 \\(\\hat{1}\\) \u526a\u679d\u3002

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u5728\u67d0\u4e00\u8f2a\u9078\u64c7\u4e2d\uff0c\u4fdd\u8b49\u591a\u500b\u76f8\u7b49\u7684\u5143\u7d20\u50c5\u88ab\u9078\u64c7\u4e00\u6b21\u3002

    \u5716 13-8 \u00a0 \u91cd\u8907\u6392\u5217\u526a\u679d

    "},{"location":"chapter_backtracking/permutations_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5728\u4e0a\u4e00\u984c\u7684\u7a0b\u5f0f\u78bc\u7684\u57fa\u790e\u4e0a\uff0c\u6211\u5011\u8003\u616e\u5728\u6bcf\u4e00\u8f2a\u9078\u64c7\u4e2d\u958b\u555f\u4e00\u500b\u96dc\u6e4a\u8868 duplicated \uff0c\u7528\u65bc\u8a18\u9304\u8a72\u8f2a\u4e2d\u5df2\u7d93\u5617\u8a66\u904e\u7684\u5143\u7d20\uff0c\u4e26\u5c07\u91cd\u8907\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II\"\"\"\n    # \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(state) == len(choices):\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    duplicated = set[int]()\n    for i, choice in enumerate(choices):\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if not selected[i] and choice not in duplicated:\n            # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice)  # \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = True\n            state.append(choice)\n            # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(vector<int> &state, const vector<int> &choices, vector<bool> &selected, vector<vector<int>> &res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.size()) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && duplicated.find(choice) == duplicated.end()) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.emplace(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push_back(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(List<Integer> state, int[] choices, boolean[] selected, List<List<Integer>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size() == choices.length) {\n        res.add(new ArrayList<Integer>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid Backtrack(List<int> state, int[] choices, bool[] selected, List<List<int>> res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.Count == choices.Length) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    HashSet<int> duplicated = [];\n    for (int i = 0; i < choices.Length; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.Contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.Add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.Add(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            Backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrackII(state *[]int, choices *[]int, selected *[]bool, res *[][]int) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if len(*state) == len(*choices) {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if _, ok := duplicated[choice]; !ok && !(*selected)[i] {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            duplicated[choice] = struct{}{}\n            (*selected)[i] = true\n            *state = append(*state, choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrackI(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunc backtrack(state: inout [Int], choices: [Int], selected: inout [Bool], res: inout [[Int]]) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.count == choices.count {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    var duplicated: Set<Int> = []\n    for (i, choice) in choices.enumerated() {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i], !duplicated.contains(choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.append(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state: &state, choices: choices, selected: &selected, res: &res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(state, choices, selected, res) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfunction backtrack(\n    state: number[],\n    choices: number[],\n    selected: boolean[],\n    res: number[][]\n): void {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.length === choices.length) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    const duplicated = new Set();\n    choices.forEach((choice, i) => {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.has(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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  // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n  if (state.length == choices.length) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  Set<int> duplicated = {};\n  for (int i = 0; i < choices.length; i++) {\n    int choice = choices[i];\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n    if (!selected[i] && !duplicated.contains(choice)) {\n      // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n      duplicated.add(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n      selected[i] = true;\n      state.add(choice);\n      // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n      backtrack(state, choices, selected, res);\n      // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nfn backtrack(mut state: Vec<i32>, choices: &[i32], selected: &mut [bool], res: &mut Vec<Vec<i32>>) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if state.len() == choices.len() {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if !selected[i] && !duplicated.contains(&choice) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.insert(choice); // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state.push(choice);\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state.clone(), choices, selected, res);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\u7b97\u6cd5\uff1a\u5168\u6392\u5217 II */\nvoid backtrack(int *state, int stateSize, int *choices, int choicesSize, bool *selected, int **res, int *resSize) {\n    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\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\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated[choice]) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated[choice] = true; // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true;\n            state[stateSize] = choice;\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, stateSize + 1, choices, choicesSize, selected, res, resSize);\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u6f14\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    // \u7576\u72c0\u614b\u9577\u5ea6\u7b49\u65bc\u5143\u7d20\u6578\u91cf\u6642\uff0c\u8a18\u9304\u89e3\n    if (state.size == choices.size) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    val duplicated = HashSet<Int>()\n    for (i in choices.indices) {\n        val choice = choices[i]\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u5143\u7d20 \u4e14 \u4e0d\u5141\u8a31\u91cd\u8907\u9078\u64c7\u76f8\u7b49\u5143\u7d20\n        if (!selected[i] && !duplicated.contains(choice)) {\n            // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n            duplicated.add(choice) // \u8a18\u9304\u9078\u64c7\u904e\u7684\u5143\u7d20\u503c\n            selected[i] = true\n            state.add(choice)\n            // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n            backtrack(state, choices, selected, res)\n            // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutations_ii}\n
    permutations_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{permutationsII}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5047\u8a2d\u5143\u7d20\u5169\u5169\u4e4b\u9593\u4e92\u4e0d\u76f8\u540c\uff0c\u5247 \\(n\\) \u500b\u5143\u7d20\u5171\u6709 \\(n!\\) \u7a2e\u6392\u5217\uff08\u968e\u4e58\uff09\uff1b\u5728\u8a18\u9304\u7d50\u679c\u6642\uff0c\u9700\u8981\u8907\u88fd\u9577\u5ea6\u70ba \\(n\\) \u7684\u4e32\u5217\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n!n)\\) \u3002

    \u6700\u5927\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002selected \u4f7f\u7528 \\(O(n)\\) \u7a7a\u9593\u3002\u540c\u4e00\u6642\u523b\u6700\u591a\u5171\u6709 \\(n\\) \u500b duplicated \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u7a7a\u9593\u3002\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_backtracking/permutations_problem/#3","title":"3. \u00a0 \u5169\u7a2e\u526a\u679d\u5c0d\u6bd4","text":"

    \u8acb\u6ce8\u610f\uff0c\u96d6\u7136 selected \u548c duplicated \u90fd\u7528\u65bc\u526a\u679d\uff0c\u4f46\u5169\u8005\u7684\u76ee\u6a19\u4e0d\u540c\u3002

    • \u91cd\u8907\u9078\u64c7\u526a\u679d\uff1a\u6574\u500b\u641c\u5c0b\u904e\u7a0b\u4e2d\u53ea\u6709\u4e00\u500b selected \u3002\u5b83\u8a18\u9304\u7684\u662f\u7576\u524d\u72c0\u614b\u4e2d\u5305\u542b\u54ea\u4e9b\u5143\u7d20\uff0c\u5176\u4f5c\u7528\u662f\u907f\u514d\u67d0\u500b\u5143\u7d20\u5728 state \u4e2d\u91cd\u8907\u51fa\u73fe\u3002
    • \u76f8\u7b49\u5143\u7d20\u526a\u679d\uff1a\u6bcf\u8f2a\u9078\u64c7\uff08\u6bcf\u500b\u547c\u53eb\u7684 backtrack \u51fd\u5f0f\uff09\u90fd\u5305\u542b\u4e00\u500b duplicated \u3002\u5b83\u8a18\u9304\u7684\u662f\u5728\u672c\u8f2a\u8d70\u8a2a\uff08for \u8ff4\u5708\uff09\u4e2d\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u9078\u64c7\u904e\uff0c\u5176\u4f5c\u7528\u662f\u4fdd\u8b49\u76f8\u7b49\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002

    \u5716 13-9 \u5c55\u793a\u4e86\u5169\u500b\u526a\u679d\u689d\u4ef6\u7684\u751f\u6548\u7bc4\u570d\u3002\u6ce8\u610f\uff0c\u6a39\u4e2d\u7684\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u9078\u64c7\uff0c\u5f9e\u6839\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\u69cb\u6210\u4e00\u500b\u6392\u5217\u3002

    \u5716 13-9 \u00a0 \u5169\u7a2e\u526a\u679d\u689d\u4ef6\u7684\u4f5c\u7528\u7bc4\u570d

    "},{"location":"chapter_backtracking/subset_sum_problem/","title":"13.3 \u00a0 \u5b50\u96c6\u548c\u554f\u984c","text":""},{"location":"chapter_backtracking/subset_sum_problem/#1331","title":"13.3.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u7121\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ef\u4ee5\u88ab\u9078\u53d6\u591a\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

    \u4f8b\u5982\uff0c\u8f38\u5165\u96c6\u5408 \\(\\{3, 4, 5\\}\\) \u548c\u76ee\u6a19\u6574\u6578 \\(9\\) \uff0c\u89e3\u70ba \\(\\{3, 3, 3\\}, \\{4, 5\\}\\) \u3002\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

    • \u8f38\u5165\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u91cd\u8907\u9078\u53d6\u3002
    • \u5b50\u96c6\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u6bd4\u5982 \\(\\{4, 5\\}\\) \u548c \\(\\{5, 4\\}\\) \u662f\u540c\u4e00\u500b\u5b50\u96c6\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#1","title":"1. \u00a0 \u53c3\u8003\u5168\u6392\u5217\u89e3\u6cd5","text":"

    \u985e\u4f3c\u65bc\u5168\u6392\u5217\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b50\u96c6\u7684\u751f\u6210\u904e\u7a0b\u60f3\u8c61\u6210\u4e00\u7cfb\u5217\u9078\u64c7\u7684\u7d50\u679c\uff0c\u4e26\u5728\u9078\u64c7\u904e\u7a0b\u4e2d\u5be6\u6642\u66f4\u65b0\u201c\u5143\u7d20\u548c\u201d\uff0c\u7576\u5143\u7d20\u548c\u7b49\u65bc target \u6642\uff0c\u5c31\u5c07\u5b50\u96c6\u8a18\u9304\u81f3\u7d50\u679c\u4e32\u5217\u3002

    \u800c\u8207\u5168\u6392\u5217\u554f\u984c\u4e0d\u540c\u7684\u662f\uff0c\u672c\u984c\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u88ab\u7121\u9650\u6b21\u9078\u53d6\uff0c\u56e0\u6b64\u7121\u9808\u85c9\u52a9 selected \u5e03\u6797\u4e32\u5217\u4f86\u8a18\u9304\u5143\u7d20\u662f\u5426\u5df2\u88ab\u9078\u64c7\u3002\u6211\u5011\u53ef\u4ee5\u5c0d\u5168\u6392\u5217\u7a0b\u5f0f\u78bc\u9032\u884c\u5c0f\u5e45\u4fee\u6539\uff0c\u521d\u6b65\u5f97\u5230\u89e3\u984c\u7a0b\u5f0f\u78bc\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in range(len(choices)):\n        # \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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\u8907\u5b50\u96c6\uff09\"\"\"\n    state = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total = 0  # \u5b50\u96c6\u548c\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n
    subset_sum_i_naive.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (size_t i = 0; i < choices.size(); i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop_back();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvector<vector<int>> subsetSumINaive(vector<int> &nums, int target) {\n    vector<int> state;       // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0;           // \u5b50\u96c6\u548c\n    vector<vector<int>> res; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.remove(state.size() - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<Integer>> subsetSumINaive(int[] nums, int target) {\n    List<Integer> state = new ArrayList<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choices.Length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.RemoveAt(state.Count - 1);\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> SubsetSumINaive(int[] nums, int target) {\n    List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    int total = 0; // \u5b50\u96c6\u548c\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumINaive(total, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == total {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i := 0; i < len(*choices); i++ {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total+(*choices)[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumINaive(total+(*choices)[i], target, state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        *state = (*state)[:len(*state)-1]\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums []int, target int) [][]int {\n    state := make([]int, 0) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    total := 0              // \u5b50\u96c6\u548c\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumINaive(total, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i_naive.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in choices.indices {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target, total: total + choices[i], choices: choices, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunc subsetSumINaive(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0 // \u5b50\u96c6\u548c\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, total, choices, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total === target) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (let i = 0; i < choices.length; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfunction subsetSumINaive(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    const total = 0; // \u5b50\u96c6\u548c\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res);\n    return res;\n}\n
    subset_sum_i_naive.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (total == target) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int i = 0; i < choices.length; i++) {\n    // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n    if (total + choices[i] > target) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target, total + choices[i], choices, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n    state.removeLast();\n  }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nList<List<int>> subsetSumINaive(List<int> nums, int target) {\n  List<int> state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  int total = 0; // \u5143\u7d20\u548c\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, total, nums, res);\n  return res;\n}\n
    subset_sum_i_naive.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if total == target {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for i in 0..choices.len() {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if total + choices[i] > target {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target, total + choices[i], choices, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfn subset_sum_i_naive(nums: &[i32], target: i32) -> Vec<Vec<i32>> {\n    let state = Vec::new(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let total = 0; // \u5b50\u96c6\u548c\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, &mut res);\n    res\n}\n
    subset_sum_i_naive.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int total, int *choices, int choicesSize) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < choicesSize; i++) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state[stateSize++] = choices[i];\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target, total + choices[i], choices, choicesSize);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nvoid subsetSumINaive(int *nums, int numsSize, int target) {\n    resSize = 0; // \u521d\u59cb\u5316\u89e3\u7684\u6578\u91cf\u70ba0\n    backtrack(target, 0, nums, numsSize);\n}\n
    subset_sum_i_naive.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (total == target) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (i in choices.indices) {\n        // \u526a\u679d\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u8df3\u904e\u8a72\u9078\u64c7\n        if (total + choices[i] > target) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u5143\u7d20\u548c total\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target, total + choices[i], choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeAt(state.size - 1)\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I\uff08\u5305\u542b\u91cd\u8907\u5b50\u96c6\uff09 */\nfun subsetSumINaive(nums: IntArray, target: Int): MutableList<MutableList<Int>?> {\n    val state = mutableListOf<Int>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    val total = 0 // \u5b50\u96c6\u548c\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, total, nums, res)\n    return res\n}\n
    subset_sum_i_naive.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i_naive}\n
    subset_sum_i_naive.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumINaive}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5411\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u8f38\u5165\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u8f38\u51fa\u7d50\u679c\u70ba \\([3, 3, 3], [4, 5], [5, 4]\\) \u3002\u96d6\u7136\u6210\u529f\u627e\u51fa\u4e86\u6240\u6709\u548c\u70ba \\(9\\) \u7684\u5b50\u96c6\uff0c\u4f46\u5176\u4e2d\u5b58\u5728\u91cd\u8907\u7684\u5b50\u96c6 \\([4, 5]\\) \u548c \\([5, 4]\\) \u3002

    \u9019\u662f\u56e0\u70ba\u641c\u5c0b\u904e\u7a0b\u662f\u5340\u5206\u9078\u64c7\u9806\u5e8f\u7684\uff0c\u7136\u800c\u5b50\u96c6\u4e0d\u5340\u5206\u9078\u64c7\u9806\u5e8f\u3002\u5982\u5716 13-10 \u6240\u793a\uff0c\u5148\u9078 \\(4\\) \u5f8c\u9078 \\(5\\) \u8207\u5148\u9078 \\(5\\) \u5f8c\u9078 \\(4\\) \u662f\u4e0d\u540c\u7684\u5206\u652f\uff0c\u4f46\u5c0d\u61c9\u540c\u4e00\u500b\u5b50\u96c6\u3002

    \u5716 13-10 \u00a0 \u5b50\u96c6\u641c\u5c0b\u8207\u8d8a\u754c\u526a\u679d

    \u70ba\u4e86\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u601d\u8def\u662f\u5c0d\u7d50\u679c\u4e32\u5217\u9032\u884c\u53bb\u91cd\u3002\u4f46\u9019\u500b\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\uff0c\u6709\u5169\u65b9\u9762\u539f\u56e0\u3002

    • \u7576\u9663\u5217\u5143\u7d20\u8f03\u591a\uff0c\u5c24\u5176\u662f\u7576 target \u8f03\u5927\u6642\uff0c\u641c\u5c0b\u904e\u7a0b\u6703\u7522\u751f\u5927\u91cf\u7684\u91cd\u8907\u5b50\u96c6\u3002
    • \u6bd4\u8f03\u5b50\u96c6\uff08\u9663\u5217\uff09\u7684\u7570\u540c\u975e\u5e38\u8017\u6642\uff0c\u9700\u8981\u5148\u6392\u5e8f\u9663\u5217\uff0c\u518d\u6bd4\u8f03\u9663\u5217\u4e2d\u6bcf\u500b\u5143\u7d20\u7684\u7570\u540c\u3002
    "},{"location":"chapter_backtracking/subset_sum_problem/#2","title":"2. \u00a0 \u91cd\u8907\u5b50\u96c6\u526a\u679d","text":"

    \u6211\u5011\u8003\u616e\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u900f\u904e\u526a\u679d\u9032\u884c\u53bb\u91cd\u3002\u89c0\u5bdf\u5716 13-11 \uff0c\u91cd\u8907\u5b50\u96c6\u662f\u5728\u4ee5\u4e0d\u540c\u9806\u5e8f\u9078\u64c7\u9663\u5217\u5143\u7d20\u6642\u7522\u751f\u7684\uff0c\u4f8b\u5982\u4ee5\u4e0b\u60c5\u6cc1\u3002

    1. \u7576\u7b2c\u4e00\u8f2a\u548c\u7b2c\u4e8c\u8f2a\u5206\u5225\u9078\u64c7 \\(3\\) \u548c \\(4\\) \u6642\uff0c\u6703\u751f\u6210\u5305\u542b\u9019\u5169\u500b\u5143\u7d20\u7684\u6240\u6709\u5b50\u96c6\uff0c\u8a18\u70ba \\([3, 4, \\dots]\\) \u3002
    2. \u4e4b\u5f8c\uff0c\u7576\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(4\\) \u6642\uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \uff0c\u56e0\u70ba\u8a72\u9078\u64c7\u7522\u751f\u7684\u5b50\u96c6 \\([4, 3, \\dots]\\) \u548c\u7b2c 1. \u6b65\u4e2d\u751f\u6210\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

    \u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u6bcf\u4e00\u5c64\u7684\u9078\u64c7\u90fd\u662f\u5f9e\u5de6\u5230\u53f3\u88ab\u9010\u500b\u5617\u8a66\u7684\uff0c\u56e0\u6b64\u8d8a\u9760\u53f3\u7684\u5206\u652f\u88ab\u526a\u6389\u7684\u8d8a\u591a\u3002

    1. \u524d\u5169\u8f2a\u9078\u64c7 \\(3\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([3, 5, \\dots]\\) \u3002
    2. \u524d\u5169\u8f2a\u9078\u64c7 \\(4\\) \u548c \\(5\\) \uff0c\u751f\u6210\u5b50\u96c6 \\([4, 5, \\dots]\\) \u3002
    3. \u82e5\u7b2c\u4e00\u8f2a\u9078\u64c7 \\(5\\) \uff0c\u5247\u7b2c\u4e8c\u8f2a\u61c9\u8a72\u8df3\u904e \\(3\\) \u548c \\(4\\) \uff0c\u56e0\u70ba\u5b50\u96c6 \\([5, 3, \\dots]\\) \u548c \\([5, 4, \\dots]\\) \u8207\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\u4e2d\u63cf\u8ff0\u7684\u5b50\u96c6\u5b8c\u5168\u91cd\u8907\u3002

    \u5716 13-11 \u00a0 \u4e0d\u540c\u9078\u64c7\u9806\u5e8f\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

    \u7e3d\u7d50\u4f86\u770b\uff0c\u7d66\u5b9a\u8f38\u5165\u9663\u5217 \\([x_1, x_2, \\dots, x_n]\\) \uff0c\u8a2d\u641c\u5c0b\u904e\u7a0b\u4e2d\u7684\u9078\u64c7\u5e8f\u5217\u70ba \\([x_{i_1}, x_{i_2}, \\dots, x_{i_m}]\\) \uff0c\u5247\u8a72\u9078\u64c7\u5e8f\u5217\u9700\u8981\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u4e0d\u6eff\u8db3\u8a72\u689d\u4ef6\u7684\u9078\u64c7\u5e8f\u5217\u90fd\u6703\u9020\u6210\u91cd\u8907\uff0c\u61c9\u7576\u526a\u679d\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u70ba\u5be6\u73fe\u8a72\u526a\u679d\uff0c\u6211\u5011\u521d\u59cb\u5316\u8b8a\u6578 start \uff0c\u7528\u65bc\u6307\u793a\u8d70\u8a2a\u8d77\u59cb\u9ede\u3002\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i\\) \u958b\u59cb\u8d70\u8a2a\u3002\u9019\u6a23\u505a\u5c31\u53ef\u4ee5\u8b93\u9078\u64c7\u5e8f\u5217\u6eff\u8db3 \\(i_1 \\leq i_2 \\leq \\dots \\leq i_m\\) \uff0c\u5f9e\u800c\u4fdd\u8b49\u5b50\u96c6\u552f\u4e00\u3002

    \u9664\u6b64\u4e4b\u5916\uff0c\u6211\u5011\u9084\u5c0d\u7a0b\u5f0f\u78bc\u9032\u884c\u4e86\u4ee5\u4e0b\u5169\u9805\u6700\u4f73\u5316\u3002

    • \u5728\u958b\u555f\u641c\u5c0b\u524d\uff0c\u5148\u5c07\u9663\u5217 nums \u6392\u5e8f\u3002\u5728\u8d70\u8a2a\u6240\u6709\u9078\u64c7\u6642\uff0c\u7576\u5b50\u96c6\u548c\u8d85\u904e target \u6642\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\uff0c\u56e0\u70ba\u5f8c\u908a\u7684\u5143\u7d20\u66f4\u5927\uff0c\u5176\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target \u3002
    • \u7701\u53bb\u5143\u7d20\u548c\u8b8a\u6578 total \uff0c\u900f\u904e\u5728 target \u4e0a\u57f7\u884c\u6e1b\u6cd5\u4f86\u7d71\u8a08\u5143\u7d20\u548c\uff0c\u7576 target \u7b49\u65bc \\(0\\) \u6642\u8a18\u9304\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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_i.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunc backtrackSubsetSumI(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumI(i, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumI(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_i.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunc subsetSumI(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_i.js
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c I */\nfunction subsetSumI(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_i.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_i.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_i.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c I */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                           // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    backtrack(target, nums, numsSize, start);\n}\n
    subset_sum_i.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_i.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_i}\n
    subset_sum_i.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumI}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-12 \u6240\u793a\u70ba\u5c07\u9663\u5217 \\([3, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u8f38\u5165\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u5f8c\u7684\u6574\u9ad4\u56de\u6eaf\u904e\u7a0b\u3002

    \u5716 13-12 \u00a0 \u5b50\u96c6\u548c I \u56de\u6eaf\u904e\u7a0b

    "},{"location":"chapter_backtracking/subset_sum_problem/#1332","title":"13.3.2 \u00a0 \u8003\u616e\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u6b63\u6574\u6578 target \uff0c\u8acb\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\uff0c\u4f7f\u5f97\u7d44\u5408\u4e2d\u7684\u5143\u7d20\u548c\u7b49\u65bc target \u3002\u7d66\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u6bcf\u500b\u5143\u7d20\u53ea\u53ef\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u8acb\u4ee5\u4e32\u5217\u5f62\u5f0f\u8fd4\u56de\u9019\u4e9b\u7d44\u5408\uff0c\u4e32\u5217\u4e2d\u4e0d\u61c9\u5305\u542b\u91cd\u8907\u7d44\u5408\u3002

    \u76f8\u6bd4\u65bc\u4e0a\u984c\uff0c\u672c\u984c\u7684\u8f38\u5165\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u9019\u5f15\u5165\u4e86\u65b0\u7684\u554f\u984c\u3002\u4f8b\u5982\uff0c\u7d66\u5b9a\u9663\u5217 \\([4, \\hat{4}, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \uff0c\u5247\u73fe\u6709\u7a0b\u5f0f\u78bc\u7684\u8f38\u51fa\u7d50\u679c\u70ba \\([4, 5], [\\hat{4}, 5]\\) \uff0c\u51fa\u73fe\u4e86\u91cd\u8907\u5b50\u96c6\u3002

    \u9020\u6210\u9019\u7a2e\u91cd\u8907\u7684\u539f\u56e0\u662f\u76f8\u7b49\u5143\u7d20\u5728\u67d0\u8f2a\u4e2d\u88ab\u591a\u6b21\u9078\u64c7\u3002\u5728\u5716 13-13 \u4e2d\uff0c\u7b2c\u4e00\u8f2a\u5171\u6709\u4e09\u500b\u9078\u64c7\uff0c\u5176\u4e2d\u5169\u500b\u90fd\u70ba \\(4\\) \uff0c\u6703\u7522\u751f\u5169\u500b\u91cd\u8907\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5f9e\u800c\u8f38\u51fa\u91cd\u8907\u5b50\u96c6\uff1b\u540c\u7406\uff0c\u7b2c\u4e8c\u8f2a\u7684\u5169\u500b \\(4\\) \u4e5f\u6703\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002

    \u5716 13-13 \u00a0 \u76f8\u7b49\u5143\u7d20\u5c0e\u81f4\u7684\u91cd\u8907\u5b50\u96c6

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

    \u70ba\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u9700\u8981\u9650\u5236\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u4e00\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5be6\u73fe\u65b9\u5f0f\u6bd4\u8f03\u5de7\u5999\uff1a\u7531\u65bc\u9663\u5217\u662f\u5df2\u6392\u5e8f\u7684\uff0c\u56e0\u6b64\u76f8\u7b49\u5143\u7d20\u90fd\u662f\u76f8\u9130\u7684\u3002\u9019\u610f\u5473\u8457\u5728\u67d0\u8f2a\u9078\u64c7\u4e2d\uff0c\u82e5\u7576\u524d\u5143\u7d20\u8207\u5176\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u5247\u8aaa\u660e\u5b83\u5df2\u7d93\u88ab\u9078\u64c7\u904e\uff0c\u56e0\u6b64\u76f4\u63a5\u8df3\u904e\u7576\u524d\u5143\u7d20\u3002

    \u8207\u6b64\u540c\u6642\uff0c\u672c\u984c\u898f\u5b9a\u6bcf\u500b\u9663\u5217\u5143\u7d20\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\u3002\u5e78\u904b\u7684\u662f\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u5229\u7528\u8b8a\u6578 start \u4f86\u6eff\u8db3\u8a72\u7d04\u675f\uff1a\u7576\u505a\u51fa\u9078\u64c7 \\(x_{i}\\) \u5f8c\uff0c\u8a2d\u5b9a\u4e0b\u4e00\u8f2a\u5f9e\u7d22\u5f15 \\(i + 1\\) \u958b\u59cb\u5411\u5f8c\u8d70\u8a2a\u3002\u9019\u6a23\u65e2\u80fd\u53bb\u9664\u91cd\u8907\u5b50\u96c6\uff0c\u4e5f\u80fd\u907f\u514d\u91cd\u8907\u9078\u64c7\u5143\u7d20\u3002

    "},{"location":"chapter_backtracking/subset_sum_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","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\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II\"\"\"\n    # \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0:\n        res.append(list(state))\n        return\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    # \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    # \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in range(start, len(choices)):\n        # \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        # \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0:\n            break\n        # \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start and choices[i] == choices[i - 1]:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        # \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        # \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []  # \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort()  # \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start = 0  # \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res = []  # \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n
    subset_sum_ii.cpp
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.push_back(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.size(); i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push_back(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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;              // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort(nums.begin(), nums.end()); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0;                  // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    vector<vector<int>> res;        // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.java
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(new ArrayList<>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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<>(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Arrays.sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<Integer>> res = new ArrayList<>(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.cs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.Add(new List<int>(state));\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choices.Length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.Add(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        Backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    Array.Sort(nums); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    Backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.go
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunc backtrackSubsetSumII(start, target int, state, choices *[]int, res *[][]int) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        newState := append([]int{}, *state...)\n        *res = append(*res, newState)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i := start; i < len(*choices); i++ {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target-(*choices)[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && (*choices)[i] == (*choices)[i-1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        *state = append(*state, (*choices)[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrackSubsetSumII(i+1, target-(*choices)[i], state, choices, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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) // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    sort.Ints(nums)         // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    start := 0              // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    res := make([][]int, 0) // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrackSubsetSumII(start, target, &state, &nums, &res)\n    return res\n}\n
    subset_sum_ii.swift
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.append(state)\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in choices.indices.dropFirst(start) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start, choices[i] == choices[i - 1] {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.append(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state: &state, target: target - choices[i], choices: choices, start: i + 1, res: &res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.removeLast()\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunc subsetSumII(nums: [Int], target: Int) -> [[Int]] {\n    var state: [Int] = [] // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    let nums = nums.sorted() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    var res: [[Int]] = [] // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state: &state, target: target, choices: nums, start: start, res: &res)\n    return res\n}\n
    subset_sum_ii.js
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nfunction backtrack(state, target, choices, start, res) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums, target) {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.ts
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target === 0) {\n        res.push([...state]);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (let i = start; i < choices.length; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] === choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        state.pop();\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nfunction subsetSumII(nums: number[], target: number): number[][] {\n    const state = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort((a, b) => a - b); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    const start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    const res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res);\n    return res;\n}\n
    subset_sum_ii.dart
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n  if (target == 0) {\n    res.add(List.from(state));\n    return;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n  // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n  for (int i = start; i < choices.length; i++) {\n    // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n    // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n    if (target - choices[i] < 0) {\n      break;\n    }\n    // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n    if (i > start && choices[i] == choices[i - 1]) {\n      continue;\n    }\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n    state.add(choices[i]);\n    // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n    backtrack(state, target - choices[i], choices, i + 1, res);\n    // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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 = []; // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n  nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n  int start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n  List<List<int>> res = []; // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n  backtrack(state, target, nums, start, res);\n  return res;\n}\n
    subset_sum_ii.rs
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if target == 0 {\n        res.push(state);\n        return;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for i in start..choices.len() {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if target - choices[i] < 0 {\n            break;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if i > start && choices[i] == choices[i - 1] {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.push(choices[i]);\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state.clone(), target - choices[i], choices, i, res);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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(); // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort(); // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    let start = 0; // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    let mut res = Vec::new(); // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, &mut res);\n    res\n}\n
    subset_sum_ii.c
    /* \u56de\u6eaf\u6f14\u7b97\u6cd5\uff1a\u5b50\u96c6\u548c II */\nvoid backtrack(int target, int *choices, int choicesSize, int start) {\n    // \u5b50\u96c6\u548c\u7b49\u65bc target \u6642\uff0c\u8a18\u9304\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    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (int i = start; i < choicesSize; i++) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u8df3\u904e\n        if (target - choices[i] < 0) {\n            continue;\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state[stateSize] = choices[i];\n        stateSize++;\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(target - choices[i], choices, choicesSize, i + 1);\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\n        stateSize--;\n    }\n}\n\n/* \u6c42\u89e3\u5b50\u96c6\u548c II */\nvoid subsetSumII(int *nums, int numsSize, int target) {\n    // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    qsort(nums, numsSize, sizeof(int), cmp);\n    // \u958b\u59cb\u56de\u6eaf\n    backtrack(target, nums, numsSize, 0);\n}\n
    subset_sum_ii.kt
    /* \u56de\u6eaf\u6f14\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\u65bc target \u6642\uff0c\u8a18\u9304\u89e3\n    if (target == 0) {\n        res.add(state.toMutableList())\n        return\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    // \u526a\u679d\u4e8c\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u751f\u6210\u91cd\u8907\u5b50\u96c6\n    // \u526a\u679d\u4e09\uff1a\u5f9e start \u958b\u59cb\u8d70\u8a2a\uff0c\u907f\u514d\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\n    for (i in start..<choices.size) {\n        // \u526a\u679d\u4e00\uff1a\u82e5\u5b50\u96c6\u548c\u8d85\u904e target \uff0c\u5247\u76f4\u63a5\u7d50\u675f\u8ff4\u5708\n        // \u9019\u662f\u56e0\u70ba\u9663\u5217\u5df2\u6392\u5e8f\uff0c\u5f8c\u908a\u5143\u7d20\u66f4\u5927\uff0c\u5b50\u96c6\u548c\u4e00\u5b9a\u8d85\u904e target\n        if (target - choices[i] < 0) {\n            break\n        }\n        // \u526a\u679d\u56db\uff1a\u5982\u679c\u8a72\u5143\u7d20\u8207\u5de6\u908a\u5143\u7d20\u76f8\u7b49\uff0c\u8aaa\u660e\u8a72\u641c\u5c0b\u5206\u652f\u91cd\u8907\uff0c\u76f4\u63a5\u8df3\u904e\n        if (i > start && choices[i] == choices[i - 1]) {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0 target, start\n        state.add(choices[i])\n        // \u9032\u884c\u4e0b\u4e00\u8f2a\u9078\u64c7\n        backtrack(state, target - choices[i], choices, i + 1, res)\n        // \u56de\u9000\uff1a\u64a4\u92b7\u9078\u64c7\uff0c\u6062\u5fa9\u5230\u4e4b\u524d\u7684\u72c0\u614b\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>() // \u72c0\u614b\uff08\u5b50\u96c6\uff09\n    nums.sort() // \u5c0d nums \u9032\u884c\u6392\u5e8f\n    val start = 0 // \u8d70\u8a2a\u8d77\u59cb\u9ede\n    val res = mutableListOf<MutableList<Int>?>() // \u7d50\u679c\u4e32\u5217\uff08\u5b50\u96c6\u4e32\u5217\uff09\n    backtrack(state, target, nums, start, res)\n    return res\n}\n
    subset_sum_ii.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subset_sum_ii}\n
    subset_sum_ii.zig
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{subsetSumII}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 13-14 \u5c55\u793a\u4e86\u9663\u5217 \\([4, 4, 5]\\) \u548c\u76ee\u6a19\u5143\u7d20 \\(9\\) \u7684\u56de\u6eaf\u904e\u7a0b\uff0c\u5171\u5305\u542b\u56db\u7a2e\u526a\u679d\u64cd\u4f5c\u3002\u8acb\u4f60\u5c07\u5716\u793a\u8207\u7a0b\u5f0f\u78bc\u8a3b\u91cb\u76f8\u7d50\u5408\uff0c\u7406\u89e3\u6574\u500b\u641c\u5c0b\u904e\u7a0b\uff0c\u4ee5\u53ca\u6bcf\u7a2e\u526a\u679d\u64cd\u4f5c\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u3002

    \u5716 13-14 \u00a0 \u5b50\u96c6\u548c II \u56de\u6eaf\u904e\u7a0b

    "},{"location":"chapter_backtracking/summary/","title":"13.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_backtracking/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u672c\u8cea\u662f\u7aae\u8209\u6cd5\uff0c\u900f\u904e\u5c0d\u89e3\u7a7a\u9593\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4f86\u5c0b\u627e\u7b26\u5408\u689d\u4ef6\u7684\u89e3\u3002\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\uff0c\u9047\u5230\u6eff\u8db3\u689d\u4ef6\u7684\u89e3\u5247\u8a18\u9304\uff0c\u76f4\u81f3\u627e\u5230\u6240\u6709\u89e3\u6216\u8d70\u8a2a\u5b8c\u6210\u5f8c\u7d50\u675f\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u7684\u641c\u5c0b\u904e\u7a0b\u5305\u62ec\u5617\u8a66\u8207\u56de\u9000\u5169\u500b\u90e8\u5206\u3002\u5b83\u900f\u904e\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4f86\u5617\u8a66\u5404\u7a2e\u9078\u64c7\uff0c\u7576\u9047\u5230\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\u7684\u60c5\u6cc1\u6642\uff0c\u5247\u64a4\u92b7\u4e0a\u4e00\u6b65\u7684\u9078\u64c7\uff0c\u9000\u56de\u5230\u4e4b\u524d\u7684\u72c0\u614b\uff0c\u4e26\u7e7c\u7e8c\u5617\u8a66\u5176\u4ed6\u9078\u64c7\u3002\u5617\u8a66\u8207\u56de\u9000\u662f\u5169\u500b\u65b9\u5411\u76f8\u53cd\u7684\u64cd\u4f5c\u3002
    • \u56de\u6eaf\u554f\u984c\u901a\u5e38\u5305\u542b\u591a\u500b\u7d04\u675f\u689d\u4ef6\uff0c\u5b83\u5011\u53ef\u7528\u65bc\u5be6\u73fe\u526a\u679d\u64cd\u4f5c\u3002\u526a\u679d\u53ef\u4ee5\u63d0\u524d\u7d50\u675f\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\uff0c\u5927\u5e45\u63d0\u5347\u641c\u5c0b\u6548\u7387\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u4e3b\u8981\u53ef\u7528\u65bc\u89e3\u6c7a\u641c\u5c0b\u554f\u984c\u548c\u7d04\u675f\u6eff\u8db3\u554f\u984c\u3002\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u96d6\u7136\u53ef\u4ee5\u7528\u56de\u6eaf\u6f14\u7b97\u6cd5\u89e3\u6c7a\uff0c\u4f46\u5f80\u5f80\u5b58\u5728\u6548\u7387\u66f4\u9ad8\u6216\u6548\u679c\u66f4\u597d\u7684\u89e3\u6cd5\u3002
    • \u5168\u6392\u5217\u554f\u984c\u65e8\u5728\u641c\u5c0b\u7d66\u5b9a\u96c6\u5408\u5143\u7d20\u7684\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u500b\u5143\u7d20\u662f\u5426\u88ab\u9078\u64c7\uff0c\u526a\u6389\u91cd\u8907\u9078\u64c7\u540c\u4e00\u5143\u7d20\u7684\u641c\u5c0b\u5206\u652f\uff0c\u78ba\u4fdd\u6bcf\u500b\u5143\u7d20\u53ea\u88ab\u9078\u64c7\u4e00\u6b21\u3002
    • \u5728\u5168\u6392\u5217\u554f\u984c\u4e2d\uff0c\u5982\u679c\u96c6\u5408\u4e2d\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff0c\u5247\u6700\u7d42\u7d50\u679c\u6703\u51fa\u73fe\u91cd\u8907\u6392\u5217\u3002\u6211\u5011\u9700\u8981\u7d04\u675f\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u64c7\u4e00\u6b21\uff0c\u9019\u901a\u5e38\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002
    • \u5b50\u96c6\u548c\u554f\u984c\u7684\u76ee\u6a19\u662f\u5728\u7d66\u5b9a\u96c6\u5408\u4e2d\u627e\u5230\u548c\u70ba\u76ee\u6a19\u503c\u7684\u6240\u6709\u5b50\u96c6\u3002\u96c6\u5408\u4e0d\u5340\u5206\u5143\u7d20\u9806\u5e8f\uff0c\u800c\u641c\u5c0b\u904e\u7a0b\u6703\u8f38\u51fa\u6240\u6709\u9806\u5e8f\u7684\u7d50\u679c\uff0c\u7522\u751f\u91cd\u8907\u5b50\u96c6\u3002\u6211\u5011\u5728\u56de\u6eaf\u524d\u5c07\u8cc7\u6599\u9032\u884c\u6392\u5e8f\uff0c\u4e26\u8a2d\u5b9a\u4e00\u500b\u8b8a\u6578\u4f86\u6307\u793a\u6bcf\u4e00\u8f2a\u7684\u8d70\u8a2a\u8d77\u59cb\u9ede\uff0c\u5f9e\u800c\u5c07\u751f\u6210\u91cd\u8907\u5b50\u96c6\u7684\u641c\u5c0b\u5206\u652f\u9032\u884c\u526a\u679d\u3002
    • \u5c0d\u65bc\u5b50\u96c6\u548c\u554f\u984c\uff0c\u9663\u5217\u4e2d\u7684\u76f8\u7b49\u5143\u7d20\u6703\u7522\u751f\u91cd\u8907\u96c6\u5408\u3002\u6211\u5011\u5229\u7528\u9663\u5217\u5df2\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\uff0c\u900f\u904e\u5224\u65b7\u76f8\u9130\u5143\u7d20\u662f\u5426\u76f8\u7b49\u5be6\u73fe\u526a\u679d\uff0c\u5f9e\u800c\u78ba\u4fdd\u76f8\u7b49\u5143\u7d20\u5728\u6bcf\u8f2a\u4e2d\u53ea\u80fd\u88ab\u9078\u4e2d\u4e00\u6b21\u3002
    • \\(n\\) \u7687\u540e\u554f\u984c\u65e8\u5728\u5c0b\u627e\u5c07 \\(n\\) \u500b\u7687\u540e\u653e\u7f6e\u5230 \\(n \\times n\\) \u5c3a\u5bf8\u68cb\u76e4\u4e0a\u7684\u65b9\u6848\uff0c\u8981\u6c42\u6240\u6709\u7687\u540e\u5169\u5169\u4e4b\u9593\u7121\u6cd5\u653b\u64ca\u5c0d\u65b9\u3002\u8a72\u554f\u984c\u7684\u7d04\u675f\u689d\u4ef6\u6709\u884c\u7d04\u675f\u3001\u5217\u7d04\u675f\u3001\u4e3b\u5c0d\u89d2\u7dda\u548c\u6b21\u5c0d\u89d2\u7dda\u7d04\u675f\u3002\u70ba\u6eff\u8db3\u884c\u7d04\u675f\uff0c\u6211\u5011\u63a1\u7528\u6309\u884c\u653e\u7f6e\u7684\u7b56\u7565\uff0c\u4fdd\u8b49\u6bcf\u4e00\u884c\u653e\u7f6e\u4e00\u500b\u7687\u540e\u3002
    • \u5217\u7d04\u675f\u548c\u5c0d\u89d2\u7dda\u7d04\u675f\u7684\u8655\u7406\u65b9\u5f0f\u985e\u4f3c\u3002\u5c0d\u65bc\u5217\u7d04\u675f\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u9663\u5217\u4f86\u8a18\u9304\u6bcf\u4e00\u5217\u662f\u5426\u6709\u7687\u540e\uff0c\u5f9e\u800c\u6307\u793a\u9078\u4e2d\u7684\u683c\u5b50\u662f\u5426\u5408\u6cd5\u3002\u5c0d\u65bc\u5c0d\u89d2\u7dda\u7d04\u675f\uff0c\u6211\u5011\u85c9\u52a9\u5169\u500b\u9663\u5217\u4f86\u5206\u5225\u8a18\u9304\u8a72\u4e3b\u3001\u6b21\u5c0d\u89d2\u7dda\u4e0a\u662f\u5426\u5b58\u5728\u7687\u540e\uff1b\u96e3\u9ede\u5728\u65bc\u627e\u8655\u5728\u5230\u540c\u4e00\u4e3b\uff08\u526f\uff09\u5c0d\u89d2\u7dda\u4e0a\u683c\u5b50\u6eff\u8db3\u7684\u884c\u5217\u7d22\u5f15\u898f\u5f8b\u3002
    "},{"location":"chapter_backtracking/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u600e\u9ebc\u7406\u89e3\u56de\u6eaf\u548c\u905e\u8ff4\u7684\u95dc\u4fc2\uff1f

    \u7e3d\u7684\u4f86\u770b\uff0c\u56de\u6eaf\u662f\u4e00\u7a2e\u201c\u6f14\u7b97\u6cd5\u7b56\u7565\u201d\uff0c\u800c\u905e\u8ff4\u66f4\u50cf\u662f\u4e00\u500b\u201c\u5de5\u5177\u201d\u3002

    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002\u7136\u800c\uff0c\u56de\u6eaf\u662f\u905e\u8ff4\u7684\u61c9\u7528\u5834\u666f\u4e4b\u4e00\uff0c\u662f\u905e\u8ff4\u5728\u641c\u5c0b\u554f\u984c\u4e2d\u7684\u61c9\u7528\u3002
    • \u905e\u8ff4\u7684\u7d50\u69cb\u9ad4\u73fe\u4e86\u201c\u5b50\u554f\u984c\u5206\u89e3\u201d\u7684\u89e3\u984c\u7bc4\u5f0f\uff0c\u5e38\u7528\u65bc\u89e3\u6c7a\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\uff08\u8a18\u61b6\u5316\u905e\u8ff4\uff09\u7b49\u554f\u984c\u3002
    "},{"location":"chapter_computational_complexity/","title":"\u7b2c 2 \u7ae0 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    Abstract

    \u8907\u96dc\u5ea6\u5206\u6790\u7336\u5982\u6d69\u701a\u7684\u6f14\u7b97\u6cd5\u5b87\u5b99\u4e2d\u7684\u6642\u7a7a\u56ae\u5c0e\u3002

    \u5b83\u5e36\u9818\u6211\u5011\u5728\u6642\u9593\u8207\u7a7a\u9593\u9019\u5169\u500b\u7dad\u5ea6\u4e0a\u6df1\u5165\u63a2\u7d22\uff0c\u5c0b\u627e\u66f4\u512a\u96c5\u7684\u89e3\u6c7a\u65b9\u6848\u3002

    "},{"location":"chapter_computational_complexity/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 2.1 \u00a0 \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30
    • 2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4
    • 2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6
    • 2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6
    • 2.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/","title":"2.2 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4","text":"

    \u5728\u6f14\u7b97\u6cd5\u4e2d\uff0c\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u662f\u5f88\u5e38\u898b\u7684\uff0c\u5b83\u8207\u8907\u96dc\u5ea6\u5206\u6790\u606f\u606f\u76f8\u95dc\u3002\u56e0\u6b64\uff0c\u5728\u4ecb\u7d39\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u4e4b\u524d\uff0c\u6211\u5011\u5148\u4f86\u4e86\u89e3\u5982\u4f55\u5728\u7a0b\u5f0f\u4e2d\u5be6\u73fe\u91cd\u8907\u57f7\u884c\u4efb\u52d9\uff0c\u5373\u5169\u7a2e\u57fa\u672c\u7684\u7a0b\u5f0f\u63a7\u5236\u7d50\u69cb\uff1a\u8fed\u4ee3\u3001\u905e\u8ff4\u3002

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

    \u8fed\u4ee3\uff08iteration\uff09\u662f\u4e00\u7a2e\u91cd\u8907\u57f7\u884c\u67d0\u500b\u4efb\u52d9\u7684\u63a7\u5236\u7d50\u69cb\u3002\u5728\u8fed\u4ee3\u4e2d\uff0c\u7a0b\u5f0f\u6703\u5728\u6eff\u8db3\u4e00\u5b9a\u7684\u689d\u4ef6\u4e0b\u91cd\u8907\u57f7\u884c\u67d0\u6bb5\u7a0b\u5f0f\u78bc\uff0c\u76f4\u5230\u9019\u500b\u689d\u4ef6\u4e0d\u518d\u6eff\u8db3\u3002

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

    for \u8ff4\u5708\u662f\u6700\u5e38\u898b\u7684\u8fed\u4ee3\u5f62\u5f0f\u4e4b\u4e00\uff0c\u9069\u5408\u5728\u9810\u5148\u77e5\u9053\u8fed\u4ee3\u6b21\u6578\u6642\u4f7f\u7528\u3002

    \u4ee5\u4e0b\u51fd\u5f0f\u57fa\u65bc for \u8ff4\u5708\u5be6\u73fe\u4e86\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff0c\u6c42\u548c\u7d50\u679c\u4f7f\u7528\u8b8a\u6578 res \u8a18\u9304\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cPython \u4e2d range(a, b) \u5c0d\u61c9\u7684\u5340\u9593\u662f\u201c\u5de6\u9589\u53f3\u958b\u201d\u7684\uff0c\u5c0d\u61c9\u7684\u8d70\u8a2a\u7bc4\u570d\u70ba \\(a, a + 1, \\dots, b-1\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def for_loop(n: int) -> int:\n    \"\"\"for \u8ff4\u5708\"\"\"\n    res = 0\n    # \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint ForLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunc forLoop(n int) int {\n    res := 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunc forLoop(n: Int) -> Int {\n    var res = 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunction forLoop(n) {\n    let res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfunction forLoop(n: number): number {\n    let res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nint forLoop(int n) {\n  int res = 0;\n  // \u8ff4\u5708\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 \u8ff4\u5708 */\nfn for_loop(n: i32) -> i32 {\n    let mut res = 0;\n    // \u8ff4\u5708\u6c42\u548c 1, 2, ..., n-1, n\n    for i in 1..=n {\n        res += i;\n    }\n    res\n}\n
    iteration.c
    /* for \u8ff4\u5708 */\nint forLoop(int n) {\n    int res = 0;\n    // \u8ff4\u5708\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 \u8ff4\u5708 */\nfun forLoop(n: Int): Int {\n    var res = 0\n    // \u8ff4\u5708\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 \u8ff4\u5708 ###\ndef for_loop(n)\n  res = 0\n\n  # \u8ff4\u5708\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 \u8ff4\u5708\nfn forLoop(n: usize) i32 {\n    var res: i32 = 0;\n    // \u8ff4\u5708\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-1 \u662f\u8a72\u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716\u3002

    \u5716 2-1 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u6d41\u7a0b\u6846\u5716

    \u6b64\u6c42\u548c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6210\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u63cf\u8ff0\u7684\u5c31\u662f\u9019\u500b\u201c\u7dda\u6027\u95dc\u4fc2\u201d\u3002\u76f8\u95dc\u5167\u5bb9\u5c07\u6703\u5728\u4e0b\u4e00\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

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

    \u8207 for \u8ff4\u5708\u985e\u4f3c\uff0cwhile \u8ff4\u5708\u4e5f\u662f\u4e00\u7a2e\u5be6\u73fe\u8fed\u4ee3\u7684\u65b9\u6cd5\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u7a0b\u5f0f\u6bcf\u8f2a\u90fd\u6703\u5148\u6aa2\u67e5\u689d\u4ef6\uff0c\u5982\u679c\u689d\u4ef6\u70ba\u771f\uff0c\u5247\u7e7c\u7e8c\u57f7\u884c\uff0c\u5426\u5247\u5c31\u7d50\u675f\u8ff4\u5708\u3002

    \u4e0b\u9762\u6211\u5011\u7528 while \u8ff4\u5708\u4f86\u5be6\u73fe\u6c42\u548c \\(1 + 2 + \\dots + n\\) \uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    while \u8ff4\u5708\u6bd4 for \u8ff4\u5708\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\u3002\u5728 while \u8ff4\u5708\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u81ea\u7531\u5730\u8a2d\u8a08\u689d\u4ef6\u8b8a\u6578\u7684\u521d\u59cb\u5316\u548c\u66f4\u65b0\u6b65\u9a5f\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u689d\u4ef6\u8b8a\u6578 \\(i\\) \u6bcf\u8f2a\u9032\u884c\u5169\u6b21\u66f4\u65b0\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u4e0d\u592a\u65b9\u4fbf\u7528 for \u8ff4\u5708\u5be6\u73fe\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u7684\u4f86\u8aaa\uff0cfor \u8ff4\u5708\u7684\u7a0b\u5f0f\u78bc\u66f4\u52a0\u7dca\u6e4a\uff0cwhile \u8ff4\u5708\u66f4\u52a0\u9748\u6d3b\uff0c\u5169\u8005\u90fd\u53ef\u4ee5\u5be6\u73fe\u8fed\u4ee3\u7d50\u69cb\u3002\u9078\u64c7\u4f7f\u7528\u54ea\u4e00\u500b\u61c9\u8a72\u6839\u64da\u7279\u5b9a\u554f\u984c\u7684\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3","title":"3. \u00a0 \u5de2\u72c0\u8ff4\u5708","text":"

    \u6211\u5011\u53ef\u4ee5\u5728\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\u5167\u5de2\u72c0\u53e6\u4e00\u500b\u8ff4\u5708\u7d50\u69cb\uff0c\u4e0b\u9762\u4ee5 for \u8ff4\u5708\u70ba\u4f8b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig iteration.py
    def nested_for_loop(n: int) -> str:\n    \"\"\"\u96d9\u5c64 for \u8ff4\u5708\"\"\"\n    res = \"\"\n    # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in range(1, n + 1):\n        # \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nstring nestedForLoop(int n) {\n    ostringstream res;\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; ++i) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n    StringBuilder res = new StringBuilder();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nstring NestedForLoop(int n) {\n    StringBuilder res = new();\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n int) string {\n    res := \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i := 1; i <= n; i++ {\n        for j := 1; j <= n; j++ {\n            // \u8ff4\u5708 j = 1, 2, ..., n-1, n\n            res += fmt.Sprintf(\"(%d, %d), \", i, j)\n        }\n    }\n    return res\n}\n
    iteration.swift
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunc nestedForLoop(n: Int) -> String {\n    var res = \"\"\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1 ... n {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n) {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfunction nestedForLoop(n: number): string {\n    let res = '';\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (let i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nString nestedForLoop(int n) {\n  String res = \"\";\n  // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for (int i = 1; i <= n; i++) {\n    // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfn nested_for_loop(n: i32) -> String {\n    let mut res = vec![];\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for i in 1..=n {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nchar *nestedForLoop(int n) {\n    // n * n \u70ba\u5c0d\u61c9\u9ede\u6578\u91cf\uff0c\"(i, j), \" \u5c0d\u61c9\u5b57\u4e32\u9577\u6700\u5927\u70ba 6+10*2\uff0c\u52a0\u4e0a\u6700\u5f8c\u4e00\u500b\u7a7a\u5b57\u5143 \\0 \u7684\u984d\u5916\u7a7a\u9593\n    int size = n * n * 26 + 1;\n    char *res = malloc(size * sizeof(char));\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (int i = 1; i <= n; i++) {\n        // \u8ff4\u5708 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
    /* \u96d9\u5c64 for \u8ff4\u5708 */\nfun nestedForLoop(n: Int): String {\n    val res = StringBuilder()\n    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (i in 1..n) {\n        // \u8ff4\u5708 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
    ### \u96d9\u5c64 for \u8ff4\u5708 ###\ndef nested_for_loop(n)\n  res = \"\"\n\n  # \u8ff4\u5708 i = 1, 2, ..., n-1, n\n  for i in 1..n\n    # \u8ff4\u5708 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
    // \u96d9\u5c64 for \u8ff4\u5708\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    // \u8ff4\u5708 i = 1, 2, ..., n-1, n\n    for (1..n+1) |i| {\n        // \u8ff4\u5708 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-2 \u662f\u8a72\u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716\u3002

    \u5716 2-2 \u00a0 \u5de2\u72c0\u8ff4\u5708\u7684\u6d41\u7a0b\u6846\u5716

    \u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u8207 \\(n^2\\) \u6210\u6b63\u6bd4\uff0c\u6216\u8005\u8aaa\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u548c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u6210\u201c\u5e73\u65b9\u95dc\u4fc2\u201d\u3002

    \u6211\u5011\u53ef\u4ee5\u7e7c\u7e8c\u65b0\u589e\u5de2\u72c0\u8ff4\u5708\uff0c\u6bcf\u4e00\u6b21\u5de2\u72c0\u90fd\u662f\u4e00\u6b21\u201c\u5347\u7dad\u201d\uff0c\u5c07\u6703\u4f7f\u6642\u9593\u8907\u96dc\u5ea6\u63d0\u9ad8\u81f3\u201c\u7acb\u65b9\u95dc\u4fc2\u201d\u201c\u56db\u6b21\u65b9\u95dc\u4fc2\u201d\uff0c\u4ee5\u6b64\u985e\u63a8\u3002

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

    \u905e\u8ff4\uff08recursion\uff09\u662f\u4e00\u7a2e\u6f14\u7b97\u6cd5\u7b56\u7565\uff0c\u900f\u904e\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\u4f86\u89e3\u6c7a\u554f\u984c\u3002\u5b83\u4e3b\u8981\u5305\u542b\u5169\u500b\u968e\u6bb5\u3002

    1. \u905e\uff1a\u7a0b\u5f0f\u4e0d\u65b7\u6df1\u5165\u5730\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u50b3\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\uff0c\u76f4\u5230\u9054\u5230\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u3002
    2. \u8ff4\uff1a\u89f8\u767c\u201c\u7d42\u6b62\u689d\u4ef6\u201d\u5f8c\uff0c\u7a0b\u5f0f\u5f9e\u6700\u6df1\u5c64\u7684\u905e\u8ff4\u51fd\u5f0f\u958b\u59cb\u9010\u5c64\u8fd4\u56de\uff0c\u532f\u805a\u6bcf\u4e00\u5c64\u7684\u7d50\u679c\u3002

    \u800c\u5f9e\u5be6\u73fe\u7684\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u7a0b\u5f0f\u78bc\u4e3b\u8981\u5305\u542b\u4e09\u500b\u8981\u7d20\u3002

    1. \u7d42\u6b62\u689d\u4ef6\uff1a\u7528\u65bc\u6c7a\u5b9a\u4ec0\u9ebc\u6642\u5019\u7531\u201c\u905e\u201d\u8f49\u201c\u8ff4\u201d\u3002
    2. \u905e\u8ff4\u547c\u53eb\uff1a\u5c0d\u61c9\u201c\u905e\u201d\uff0c\u51fd\u5f0f\u547c\u53eb\u81ea\u8eab\uff0c\u901a\u5e38\u8f38\u5165\u66f4\u5c0f\u6216\u66f4\u7c21\u5316\u7684\u53c3\u6578\u3002
    3. \u8fd4\u56de\u7d50\u679c\uff1a\u5c0d\u61c9\u201c\u8ff4\u201d\uff0c\u5c07\u7576\u524d\u905e\u8ff4\u5c64\u7d1a\u7684\u7d50\u679c\u8fd4\u56de\u81f3\u4e0a\u4e00\u5c64\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u53ea\u9700\u547c\u53eb\u51fd\u5f0f recur(n) \uff0c\u5c31\u53ef\u4ee5\u5b8c\u6210 \\(1 + 2 + \\dots + n\\) \u7684\u8a08\u7b97\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def recur(n: int) -> int:\n    \"\"\"\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 1:\n        return 1\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res = recur(n - 1)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n
    recursion.cpp
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.java
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.cs
    /* \u905e\u8ff4 */\nint Recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = Recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.go
    /* \u905e\u8ff4 */\nfunc recur(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    res := recur(n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.swift
    /* \u905e\u8ff4 */\nfunc recur(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n: n - 1)\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.js
    /* \u905e\u8ff4 */\nfunction recur(n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.ts
    /* \u905e\u8ff4 */\nfunction recur(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 1) return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    const res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.dart
    /* \u905e\u8ff4 */\nint recur(int n) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 1) return 1;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  int res = recur(n - 1);\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  return n + res;\n}\n
    recursion.rs
    /* \u905e\u8ff4 */\nfn recur(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 1 {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    let res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    n + res\n}\n
    recursion.c
    /* \u905e\u8ff4 */\nint recur(int n) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    int res = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    recursion.kt
    /* \u905e\u8ff4 */\nfun recur(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1)\n        return 1\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    val res = recur(n - 1)\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    return n + res\n}\n
    recursion.rb
    ### \u905e\u8ff4 ###\ndef recur(n)\n  # \u7d42\u6b62\u689d\u4ef6\n  return 1 if n == 1\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  res = recur(n - 1)\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  n + res\nend\n
    recursion.zig
    // \u905e\u8ff4\u51fd\u5f0f\nfn recur(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 1) {\n        return 1;\n    }\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var res: i32 = recur(n - 1);\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    return n + res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-3 \u5c55\u793a\u4e86\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b\u3002

    \u5716 2-3 \u00a0 \u6c42\u548c\u51fd\u5f0f\u7684\u905e\u8ff4\u904e\u7a0b

    \u96d6\u7136\u5f9e\u8a08\u7b97\u89d2\u5ea6\u770b\uff0c\u8fed\u4ee3\u8207\u905e\u8ff4\u53ef\u4ee5\u5f97\u5230\u76f8\u540c\u7684\u7d50\u679c\uff0c\u4f46\u5b83\u5011\u4ee3\u8868\u4e86\u5169\u7a2e\u5b8c\u5168\u4e0d\u540c\u7684\u601d\u8003\u548c\u89e3\u6c7a\u554f\u984c\u7684\u7bc4\u5f0f\u3002

    • \u8fed\u4ee3\uff1a\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5f9e\u6700\u57fa\u790e\u7684\u6b65\u9a5f\u958b\u59cb\uff0c\u7136\u5f8c\u4e0d\u65b7\u91cd\u8907\u6216\u7d2f\u52a0\u9019\u4e9b\u6b65\u9a5f\uff0c\u76f4\u5230\u4efb\u52d9\u5b8c\u6210\u3002
    • \u905e\u8ff4\uff1a\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u5730\u89e3\u6c7a\u554f\u984c\u3002\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u9019\u4e9b\u5b50\u554f\u984c\u548c\u539f\u554f\u984c\u5177\u6709\u76f8\u540c\u7684\u5f62\u5f0f\u3002\u63a5\u4e0b\u4f86\u5c07\u5b50\u554f\u984c\u7e7c\u7e8c\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u57fa\u672c\u60c5\u6cc1\u6642\u505c\u6b62\uff08\u57fa\u672c\u60c5\u6cc1\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff09\u3002

    \u4ee5\u4e0a\u8ff0\u6c42\u548c\u51fd\u5f0f\u70ba\u4f8b\uff0c\u8a2d\u554f\u984c \\(f(n) = 1 + 2 + \\dots + n\\) \u3002

    • \u8fed\u4ee3\uff1a\u5728\u8ff4\u5708\u4e2d\u6a21\u64ec\u6c42\u548c\u904e\u7a0b\uff0c\u5f9e \\(1\\) \u8d70\u8a2a\u5230 \\(n\\) \uff0c\u6bcf\u8f2a\u57f7\u884c\u6c42\u548c\u64cd\u4f5c\uff0c\u5373\u53ef\u6c42\u5f97 \\(f(n)\\) \u3002
    • \u905e\u8ff4\uff1a\u5c07\u554f\u984c\u5206\u89e3\u70ba\u5b50\u554f\u984c \\(f(n) = n + f(n-1)\\) \uff0c\u4e0d\u65b7\uff08\u905e\u8ff4\u5730\uff09\u5206\u89e3\u4e0b\u53bb\uff0c\u76f4\u81f3\u57fa\u672c\u60c5\u6cc1 \\(f(1) = 1\\) \u6642\u7d42\u6b62\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#1","title":"1. \u00a0 \u547c\u53eb\u5806\u758a","text":"

    \u905e\u8ff4\u51fd\u5f0f\u6bcf\u6b21\u547c\u53eb\u81ea\u8eab\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u70ba\u65b0\u958b\u555f\u7684\u51fd\u5f0f\u5206\u914d\u8a18\u61b6\u9ad4\uff0c\u4ee5\u5132\u5b58\u5340\u57df\u6027\u8b8a\u6578\u3001\u547c\u53eb\u4f4d\u5740\u548c\u5176\u4ed6\u8cc7\u8a0a\u7b49\u3002\u9019\u5c07\u5c0e\u81f4\u5169\u65b9\u9762\u7684\u7d50\u679c\u3002

    • \u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u90fd\u5132\u5b58\u5728\u7a31\u70ba\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u7684\u8a18\u61b6\u9ad4\u5340\u57df\u4e2d\uff0c\u76f4\u81f3\u51fd\u5f0f\u8fd4\u56de\u5f8c\u624d\u6703\u88ab\u91cb\u653e\u3002\u56e0\u6b64\uff0c\u905e\u8ff4\u901a\u5e38\u6bd4\u8fed\u4ee3\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u905e\u8ff4\u547c\u53eb\u51fd\u5f0f\u6703\u7522\u751f\u984d\u5916\u7684\u958b\u92b7\u3002\u56e0\u6b64\u905e\u8ff4\u901a\u5e38\u6bd4\u8ff4\u5708\u7684\u6642\u9593\u6548\u7387\u66f4\u4f4e\u3002

    \u5982\u5716 2-4 \u6240\u793a\uff0c\u5728\u89f8\u767c\u7d42\u6b62\u689d\u4ef6\u524d\uff0c\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u51fd\u5f0f\uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002

    \u5716 2-4 \u00a0 \u905e\u8ff4\u547c\u53eb\u6df1\u5ea6

    \u5728\u5be6\u969b\u4e2d\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u5141\u8a31\u7684\u905e\u8ff4\u6df1\u5ea6\u901a\u5e38\u662f\u6709\u9650\u7684\uff0c\u904e\u6df1\u7684\u905e\u8ff4\u53ef\u80fd\u5c0e\u81f4\u5806\u758a\u6ea2\u4f4d\u932f\u8aa4\u3002

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

    \u6709\u8da3\u7684\u662f\uff0c\u5982\u679c\u51fd\u5f0f\u5728\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u6b65\u624d\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5247\u8a72\u51fd\u5f0f\u53ef\u4ee5\u88ab\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u6700\u4f73\u5316\uff0c\u4f7f\u5176\u5728\u7a7a\u9593\u6548\u7387\u4e0a\u8207\u8fed\u4ee3\u76f8\u7576\u3002\u9019\u7a2e\u60c5\u6cc1\u88ab\u7a31\u70ba\u5c3e\u905e\u8ff4\uff08tail recursion\uff09\u3002

    • \u666e\u901a\u905e\u8ff4\uff1a\u7576\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u7684\u51fd\u5f0f\u5f8c\uff0c\u9700\u8981\u7e7c\u7e8c\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u56e0\u6b64\u7cfb\u7d71\u9700\u8981\u5132\u5b58\u4e0a\u4e00\u5c64\u547c\u53eb\u7684\u4e0a\u4e0b\u6587\u3002
    • \u5c3e\u905e\u8ff4\uff1a\u905e\u8ff4\u547c\u53eb\u662f\u51fd\u5f0f\u8fd4\u56de\u524d\u7684\u6700\u5f8c\u4e00\u500b\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u51fd\u5f0f\u8fd4\u56de\u5230\u4e0a\u4e00\u5c64\u7d1a\u5f8c\uff0c\u7121\u9808\u7e7c\u7e8c\u57f7\u884c\u5176\u4ed6\u64cd\u4f5c\uff0c\u56e0\u6b64\u7cfb\u7d71\u7121\u9808\u5132\u5b58\u4e0a\u4e00\u5c64\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u3002

    \u4ee5\u8a08\u7b97 \\(1 + 2 + \\dots + n\\) \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u7d50\u679c\u8b8a\u6578 res \u8a2d\u70ba\u51fd\u5f0f\u53c3\u6578\uff0c\u5f9e\u800c\u5be6\u73fe\u5c3e\u905e\u8ff4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def tail_recur(n, res):\n    \"\"\"\u5c3e\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if n == 0:\n        return res\n    # \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tail_recur(n - 1, res + n)\n
    recursion.cpp
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.java
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.cs
    /* \u5c3e\u905e\u8ff4 */\nint TailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return TailRecur(n - 1, res + n);\n}\n
    recursion.go
    /* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n int, res int) int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n-1, res+n)\n}\n
    recursion.swift
    /* \u5c3e\u905e\u8ff4 */\nfunc tailRecur(n: Int, res: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n: n - 1, res: res + n)\n}\n
    recursion.js
    /* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n, res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.ts
    /* \u5c3e\u905e\u8ff4 */\nfunction tailRecur(n: number, res: number): number {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n === 0) return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.dart
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (n == 0) return res;\n  // \u5c3e\u905e\u8ff4\u547c\u53eb\n  return tailRecur(n - 1, res + n);\n}\n
    recursion.rs
    /* \u5c3e\u905e\u8ff4 */\nfn tail_recur(n: i32, res: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if n == 0 {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    tail_recur(n - 1, res + n)\n}\n
    recursion.c
    /* \u5c3e\u905e\u8ff4 */\nint tailRecur(int n, int res) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res;\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    recursion.kt
    /* \u5c3e\u905e\u8ff4 */\ntailrec fun tailRecur(n: Int, res: Int): Int {\n    // \u65b0\u589e tailrec \u95dc\u9375\u8a5e\uff0c\u4ee5\u958b\u555f\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0)\n        return res\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n)\n}\n
    recursion.rb
    ### \u5c3e\u905e\u8ff4 ###\ndef tail_recur(n, res)\n  # \u7d42\u6b62\u689d\u4ef6\n  return res if n == 0\n  # \u5c3e\u905e\u8ff4\u547c\u53eb\n  tail_recur(n - 1, res + n)\nend\n
    recursion.zig
    // \u5c3e\u905e\u8ff4\u51fd\u5f0f\nfn tailRecur(n: i32, res: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (n == 0) {\n        return res;\n    }\n    // \u5c3e\u905e\u8ff4\u547c\u53eb\n    return tailRecur(n - 1, res + n);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5c3e\u905e\u8ff4\u7684\u57f7\u884c\u904e\u7a0b\u5982\u5716 2-5 \u6240\u793a\u3002\u5c0d\u6bd4\u666e\u901a\u905e\u8ff4\u548c\u5c3e\u905e\u8ff4\uff0c\u5169\u8005\u7684\u6c42\u548c\u64cd\u4f5c\u7684\u57f7\u884c\u9ede\u662f\u4e0d\u540c\u7684\u3002

    • \u666e\u901a\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u6bcf\u5c64\u8fd4\u56de\u5f8c\u90fd\u8981\u518d\u57f7\u884c\u4e00\u6b21\u6c42\u548c\u64cd\u4f5c\u3002
    • \u5c3e\u905e\u8ff4\uff1a\u6c42\u548c\u64cd\u4f5c\u662f\u5728\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u57f7\u884c\u7684\uff0c\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u53ea\u9700\u5c64\u5c64\u8fd4\u56de\u3002

    \u5716 2-5 \u00a0 \u5c3e\u905e\u8ff4\u904e\u7a0b

    Tip

    \u8acb\u6ce8\u610f\uff0c\u8a31\u591a\u7de8\u8b6f\u5668\u6216\u76f4\u8b6f\u5668\u4e26\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u3002\u4f8b\u5982\uff0cPython \u9810\u8a2d\u4e0d\u652f\u6301\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u56e0\u6b64\u5373\u4f7f\u51fd\u5f0f\u662f\u5c3e\u905e\u8ff4\u5f62\u5f0f\uff0c\u4ecd\u7136\u53ef\u80fd\u6703\u9047\u5230\u5806\u758a\u6ea2\u4f4d\u554f\u984c\u3002

    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#3_1","title":"3. \u00a0 \u905e\u8ff4\u6a39","text":"

    \u7576\u8655\u7406\u8207\u201c\u5206\u6cbb\u201d\u76f8\u95dc\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u6642\uff0c\u905e\u8ff4\u5f80\u5f80\u6bd4\u8fed\u4ee3\u7684\u601d\u8def\u66f4\u52a0\u76f4\u89c0\u3001\u7a0b\u5f0f\u78bc\u66f4\u52a0\u6613\u8b80\u3002\u4ee5\u201c\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u201d\u70ba\u4f8b\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u8cbb\u6ce2\u90a3\u5951\u6578\u5217 \\(0, 1, 1, 2, 3, 5, 8, 13, \\dots\\) \uff0c\u6c42\u8a72\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u3002

    \u8a2d\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\u70ba \\(f(n)\\) \uff0c\u6613\u5f97\u5169\u500b\u7d50\u8ad6\u3002

    • \u6578\u5217\u7684\u524d\u5169\u500b\u6578\u5b57\u70ba \\(f(1) = 0\\) \u548c \\(f(2) = 1\\) \u3002
    • \u6578\u5217\u4e2d\u7684\u6bcf\u500b\u6578\u5b57\u662f\u524d\u5169\u500b\u6578\u5b57\u7684\u548c\uff0c\u5373 \\(f(n) = f(n - 1) + f(n - 2)\\) \u3002

    \u6309\u7167\u905e\u63a8\u95dc\u4fc2\u9032\u884c\u905e\u8ff4\u547c\u53eb\uff0c\u5c07\u524d\u5169\u500b\u6578\u5b57\u4f5c\u70ba\u7d42\u6b62\u689d\u4ef6\uff0c\u4fbf\u53ef\u5beb\u51fa\u905e\u8ff4\u7a0b\u5f0f\u78bc\u3002\u547c\u53eb fib(n) \u5373\u53ef\u5f97\u5230\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u7b2c \\(n\\) \u500b\u6578\u5b57\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def fib(n: int) -> int:\n    \"\"\"\u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 or n == 2:\n        return n - 1\n    # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res = fib(n - 1) + fib(n - 2)\n    # \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n
    recursion.cpp
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.java
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.cs
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint Fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = Fib(n - 1) + Fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.go
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n int) int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    res := fib(n-1) + fib(n-2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.swift
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunc fib(n: Int) -> Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n: n - 1) + fib(n: n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.js
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.ts
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfunction fib(n: number): number {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n === 1 || n === 2) return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    const res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.dart
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n  // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  if (n == 1 || n == 2) return n - 1;\n  // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  int res = fib(n - 1) + fib(n - 2);\n  // \u8fd4\u56de\u7d50\u679c f(n)\n  return res;\n}\n
    recursion.rs
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfn fib(n: i32) -> i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if n == 1 || n == 2 {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    let res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c\n    res\n}\n
    recursion.c
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nint fib(int n) {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1;\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    int res = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    recursion.kt
    /* \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 */\nfun fib(n: Int): Int {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 || n == 2)\n        return n - 1\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    val res = fib(n - 1) + fib(n - 2)\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res\n}\n
    recursion.rb
    ### \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\uff1a\u905e\u8ff4 ###\ndef fib(n)\n  # \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n  return n - 1 if n == 1 || n == 2\n  # \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n  res = fib(n - 1) + fib(n - 2)\n  # \u8fd4\u56de\u7d50\u679c f(n)\n  res\nend\n
    recursion.zig
    // \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\nfn fib(n: i32) i32 {\n    // \u7d42\u6b62\u689d\u4ef6 f(1) = 0, f(2) = 1\n    if (n == 1 or n == 2) {\n        return n - 1;\n    }\n    // \u905e\u8ff4\u547c\u53eb f(n) = f(n-1) + f(n-2)\n    var res: i32 = fib(n - 1) + fib(n - 2);\n    // \u8fd4\u56de\u7d50\u679c f(n)\n    return res;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u5728\u51fd\u5f0f\u5167\u905e\u8ff4\u547c\u53eb\u4e86\u5169\u500b\u51fd\u5f0f\uff0c\u9019\u610f\u5473\u8457\u5f9e\u4e00\u500b\u547c\u53eb\u7522\u751f\u4e86\u5169\u500b\u547c\u53eb\u5206\u652f\u3002\u5982\u5716 2-6 \u6240\u793a\uff0c\u9019\u6a23\u4e0d\u65b7\u905e\u8ff4\u547c\u53eb\u4e0b\u53bb\uff0c\u6700\u7d42\u5c07\u7522\u751f\u4e00\u68f5\u5c64\u6578\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff08recursion tree\uff09\u3002

    \u5716 2-6 \u00a0 \u8cbb\u6ce2\u90a3\u5951\u6578\u5217\u7684\u905e\u8ff4\u6a39

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u905e\u8ff4\u9ad4\u73fe\u4e86\u201c\u5c07\u554f\u984c\u5206\u89e3\u70ba\u66f4\u5c0f\u5b50\u554f\u984c\u201d\u7684\u601d\u7dad\u7bc4\u5f0f\uff0c\u9019\u7a2e\u5206\u6cbb\u7b56\u7565\u81f3\u95dc\u91cd\u8981\u3002

    • \u5f9e\u6f14\u7b97\u6cd5\u89d2\u5ea6\u770b\uff0c\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u56de\u6eaf\u3001\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u7b49\u8a31\u591a\u91cd\u8981\u6f14\u7b97\u6cd5\u7b56\u7565\u76f4\u63a5\u6216\u9593\u63a5\u5730\u61c9\u7528\u4e86\u9019\u7a2e\u601d\u7dad\u65b9\u5f0f\u3002
    • \u5f9e\u8cc7\u6599\u7d50\u69cb\u89d2\u5ea6\u770b\uff0c\u905e\u8ff4\u5929\u7136\u9069\u5408\u8655\u7406\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u76f8\u95dc\u554f\u984c\uff0c\u56e0\u70ba\u5b83\u5011\u975e\u5e38\u9069\u5408\u7528\u5206\u6cbb\u601d\u60f3\u9032\u884c\u5206\u6790\u3002
    "},{"location":"chapter_computational_complexity/iteration_and_recursion/#223","title":"2.2.3 \u00a0 \u5169\u8005\u5c0d\u6bd4","text":"

    \u7e3d\u7d50\u4ee5\u4e0a\u5167\u5bb9\uff0c\u5982\u8868 2-1 \u6240\u793a\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5be6\u73fe\u3001\u6548\u80fd\u548c\u9069\u7528\u6027\u4e0a\u6709\u6240\u4e0d\u540c\u3002

    \u8868 2-1 \u00a0 \u8fed\u4ee3\u8207\u905e\u8ff4\u7279\u9ede\u5c0d\u6bd4

    \u8fed\u4ee3 \u905e\u8ff4 \u5be6\u73fe\u65b9\u5f0f \u8ff4\u5708\u7d50\u69cb \u51fd\u5f0f\u547c\u53eb\u81ea\u8eab \u6642\u9593\u6548\u7387 \u6548\u7387\u901a\u5e38\u8f03\u9ad8\uff0c\u7121\u51fd\u5f0f\u547c\u53eb\u958b\u92b7 \u6bcf\u6b21\u51fd\u5f0f\u547c\u53eb\u90fd\u6703\u7522\u751f\u958b\u92b7 \u8a18\u61b6\u9ad4\u4f7f\u7528 \u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593 \u7d2f\u7a4d\u51fd\u5f0f\u547c\u53eb\u53ef\u80fd\u4f7f\u7528\u5927\u91cf\u7684\u5806\u758a\u5e40\u7a7a\u9593 \u9069\u7528\u554f\u984c \u9069\u7528\u65bc\u7c21\u55ae\u8ff4\u5708\u4efb\u52d9\uff0c\u7a0b\u5f0f\u78bc\u76f4\u89c0\u3001\u53ef\u8b80\u6027\u597d \u9069\u7528\u65bc\u5b50\u554f\u984c\u5206\u89e3\uff0c\u5982\u6a39\u3001\u5716\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u7b49\uff0c\u7a0b\u5f0f\u78bc\u7d50\u69cb\u7c21\u6f54\u3001\u6e05\u6670

    Tip

    \u5982\u679c\u611f\u89ba\u4ee5\u4e0b\u5167\u5bb9\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5728\u8b80\u5b8c\u201c\u5806\u758a\u201d\u7ae0\u7bc0\u5f8c\u518d\u4f86\u8907\u7fd2\u3002

    \u90a3\u9ebc\uff0c\u8fed\u4ee3\u548c\u905e\u8ff4\u5177\u6709\u4ec0\u9ebc\u5167\u5728\u95dc\u806f\u5462\uff1f\u4ee5\u4e0a\u8ff0\u905e\u8ff4\u51fd\u5f0f\u70ba\u4f8b\uff0c\u6c42\u548c\u64cd\u4f5c\u5728\u905e\u8ff4\u7684\u201c\u8ff4\u201d\u968e\u6bb5\u9032\u884c\u3002\u9019\u610f\u5473\u8457\u6700\u521d\u88ab\u547c\u53eb\u7684\u51fd\u5f0f\u5be6\u969b\u4e0a\u662f\u6700\u5f8c\u5b8c\u6210\u5176\u6c42\u548c\u64cd\u4f5c\u7684\uff0c\u9019\u7a2e\u5de5\u4f5c\u6a5f\u5236\u8207\u5806\u758a\u7684\u201c\u5148\u5165\u5f8c\u51fa\u201d\u539f\u5247\u7570\u66f2\u540c\u5de5\u3002

    \u4e8b\u5be6\u4e0a\uff0c\u201c\u547c\u53eb\u5806\u758a\u201d\u548c\u201c\u5806\u758a\u5e40\u7a7a\u9593\u201d\u9019\u985e\u905e\u8ff4\u8853\u8a9e\u5df2\u7d93\u6697\u793a\u4e86\u905e\u8ff4\u8207\u5806\u758a\u4e4b\u9593\u7684\u5bc6\u5207\u95dc\u4fc2\u3002

    1. \u905e\uff1a\u7576\u51fd\u5f0f\u88ab\u547c\u53eb\u6642\uff0c\u7cfb\u7d71\u6703\u5728\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u70ba\u8a72\u51fd\u5f0f\u5206\u914d\u65b0\u7684\u5806\u758a\u5e40\uff0c\u7528\u65bc\u5132\u5b58\u51fd\u5f0f\u7684\u5340\u57df\u6027\u8b8a\u6578\u3001\u53c3\u6578\u3001\u8fd4\u56de\u4f4d\u5740\u7b49\u8cc7\u6599\u3002
    2. \u8ff4\uff1a\u7576\u51fd\u5f0f\u5b8c\u6210\u57f7\u884c\u4e26\u8fd4\u56de\u6642\uff0c\u5c0d\u61c9\u7684\u5806\u758a\u5e40\u6703\u88ab\u5f9e\u201c\u547c\u53eb\u5806\u758a\u201d\u4e0a\u79fb\u9664\uff0c\u6062\u5fa9\u4e4b\u524d\u51fd\u5f0f\u7684\u57f7\u884c\u74b0\u5883\u3002

    \u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\uff0c\u5f9e\u800c\u5c07\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f62\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig recursion.py
    def for_loop_recur(n: int) -> int:\n    \"\"\"\u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4\"\"\"\n    # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack = []\n    res = 0\n    # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in range(n, 0, -1):\n        # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    # \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while stack:\n        # \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    # res = 1+2+3+...+n\n    return res\n
    recursion.cpp
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack<int> stack;\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.empty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\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\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<Integer> stack = new Stack<>();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (!stack.isEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.cs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint ForLoopRecur(int n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    Stack<int> stack = new();\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.Push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.Count > 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.Pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.go
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n int) int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    stack := list.New()\n    res := 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i := n; i > 0; i-- {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.PushBack(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    for stack.Len() != 0 {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\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\u64ec\u905e\u8ff4 */\nfunc forLoopRecur(n: Int) -> Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [Int] = []\n    var res = 0\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1 ... n).reversed() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.append(i)\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.isEmpty {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.removeLast()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.js
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n) {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    const stack = [];\n    let res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.ts
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfunction forLoopRecur(n: number): number {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a \n    const stack: number[] = [];\n    let res: number = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (let i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (stack.length) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop();\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.dart
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n  // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  List<int> stack = [];\n  int res = 0;\n  // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for (int i = n; i > 0; i--) {\n    // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack.add(i);\n  }\n  // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n  while (!stack.isEmpty) {\n    // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n    res += stack.removeLast();\n  }\n  // res = 1+2+3+...+n\n  return res;\n}\n
    recursion.rs
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfn for_loop_recur(n: i32) -> i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    let mut stack = Vec::new();\n    let mut res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for i in (1..=n).rev() {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i);\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while !stack.is_empty() {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop().unwrap();\n    }\n    // res = 1+2+3+...+n\n    res\n}\n
    recursion.c
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nint forLoopRecur(int n) {\n    int stack[1000]; // \u85c9\u52a9\u4e00\u500b\u5927\u9663\u5217\u4f86\u6a21\u64ec\u5806\u758a\n    int top = -1;    // \u5806\u758a\u9802\u7d22\u5f15\n    int res = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    for (int i = n; i > 0; i--) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack[1 + top++] = i;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\u679c\n    while (top >= 0) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack[top--];\n    }\n    // res = 1+2+3+...+n\n    return res;\n}\n
    recursion.kt
    /* \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 */\nfun forLoopRecur(n: Int): Int {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    val stack = Stack<Int>()\n    var res = 0\n    // \u905e: \u905e\u8ff4\u547c\u53eb\n    for (i in n downTo 0) {\n        // \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n        stack.push(i)\n    }\n    // \u8ff4: \u8fd4\u56de\u7d50\u679c\n    while (stack.isNotEmpty()) {\n        // \u900f\u904e\u201c\u51fa\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u8ff4\u201d\n        res += stack.pop()\n    }\n    // res = 1+2+3+...+n\n    return res\n}\n
    recursion.rb
    ### \u4f7f\u7528\u8fed\u4ee3\u6a21\u64ec\u905e\u8ff4 ###\ndef for_loop_recur(n)\n  # \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n  stack = []\n  res = 0\n\n  # \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n  for i in n.downto(0)\n    # \u900f\u904e\u201c\u5165\u5806\u758a\u64cd\u4f5c\u201d\u6a21\u64ec\u201c\u905e\u201d\n    stack << i\n  end\n  # \u8ff4\uff1a\u8fd4\u56de\u7d50\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\u64ec\u905e\u8ff4\nfn forLoopRecur(comptime n: i32) i32 {\n    // \u4f7f\u7528\u4e00\u500b\u986f\u5f0f\u7684\u5806\u758a\u4f86\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\n    var stack: [n]i32 = undefined;\n    var res: i32 = 0;\n    // \u905e\uff1a\u905e\u8ff4\u547c\u53eb\n    var i: usize = n;\n    while (i > 0) {\n        stack[i - 1] = @intCast(i);\n        i -= 1;\n    }\n    // \u8ff4\uff1a\u8fd4\u56de\u7d50\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7576\u905e\u8ff4\u8f49\u5316\u70ba\u8fed\u4ee3\u5f8c\uff0c\u7a0b\u5f0f\u78bc\u8b8a\u5f97\u66f4\u52a0\u8907\u96dc\u4e86\u3002\u5118\u7ba1\u8fed\u4ee3\u548c\u905e\u8ff4\u5728\u5f88\u591a\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4e92\u76f8\u8f49\u5316\uff0c\u4f46\u4e0d\u4e00\u5b9a\u503c\u5f97\u9019\u6a23\u505a\uff0c\u6709\u4ee5\u4e0b\u5169\u9ede\u539f\u56e0\u3002

    • \u8f49\u5316\u5f8c\u7684\u7a0b\u5f0f\u78bc\u53ef\u80fd\u66f4\u52a0\u96e3\u4ee5\u7406\u89e3\uff0c\u53ef\u8b80\u6027\u66f4\u5dee\u3002
    • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u6a21\u64ec\u7cfb\u7d71\u547c\u53eb\u5806\u758a\u7684\u884c\u70ba\u53ef\u80fd\u975e\u5e38\u56f0\u96e3\u3002

    \u7e3d\u4e4b\uff0c\u9078\u64c7\u8fed\u4ee3\u9084\u662f\u905e\u8ff4\u53d6\u6c7a\u65bc\u7279\u5b9a\u554f\u984c\u7684\u6027\u8cea\u3002\u5728\u7a0b\u5f0f\u8a2d\u8a08\u5be6\u8e10\u4e2d\uff0c\u6b0a\u8861\u5169\u8005\u7684\u512a\u52a3\u4e26\u6839\u64da\u60c5\u5883\u9078\u64c7\u5408\u9069\u7684\u65b9\u6cd5\u81f3\u95dc\u91cd\u8981\u3002

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

    \u5728\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u8ffd\u6c42\u4ee5\u4e0b\u5169\u500b\u5c64\u9762\u7684\u76ee\u6a19\u3002

    1. \u627e\u5230\u554f\u984c\u89e3\u6cd5\uff1a\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u898f\u5b9a\u7684\u8f38\u5165\u7bc4\u570d\u5167\u53ef\u9760\u5730\u6c42\u5f97\u554f\u984c\u7684\u6b63\u78ba\u89e3\u3002
    2. \u5c0b\u6c42\u6700\u512a\u89e3\u6cd5\uff1a\u540c\u4e00\u500b\u554f\u984c\u53ef\u80fd\u5b58\u5728\u591a\u7a2e\u89e3\u6cd5\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u5118\u53ef\u80fd\u9ad8\u6548\u7684\u6f14\u7b97\u6cd5\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5728\u80fd\u5920\u89e3\u6c7a\u554f\u984c\u7684\u524d\u63d0\u4e0b\uff0c\u6f14\u7b97\u6cd5\u6548\u7387\u5df2\u6210\u70ba\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\uff0c\u5b83\u5305\u62ec\u4ee5\u4e0b\u5169\u500b\u7dad\u5ea6\u3002

    • \u6642\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u5feb\u6162\u3002
    • \u7a7a\u9593\u6548\u7387\uff1a\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u7684\u5927\u5c0f\u3002

    \u7c21\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u7684\u76ee\u6a19\u662f\u8a2d\u8a08\u201c\u65e2\u5feb\u53c8\u7701\u201d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u3002\u800c\u6709\u6548\u5730\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u81f3\u95dc\u91cd\u8981\uff0c\u56e0\u70ba\u53ea\u6709\u9019\u6a23\uff0c\u6211\u5011\u624d\u80fd\u5c07\u5404\u7a2e\u6f14\u7b97\u6cd5\u9032\u884c\u5c0d\u6bd4\uff0c\u9032\u800c\u6307\u5c0e\u6f14\u7b97\u6cd5\u8a2d\u8a08\u8207\u6700\u4f73\u5316\u904e\u7a0b\u3002

    \u6548\u7387\u8a55\u4f30\u65b9\u6cd5\u4e3b\u8981\u5206\u70ba\u5169\u7a2e\uff1a\u5be6\u969b\u6e2c\u8a66\u3001\u7406\u8ad6\u4f30\u7b97\u3002

    "},{"location":"chapter_computational_complexity/performance_evaluation/#211","title":"2.1.1 \u00a0 \u5be6\u969b\u6e2c\u8a66","text":"

    \u5047\u8a2d\u6211\u5011\u73fe\u5728\u6709\u6f14\u7b97\u6cd5 A \u548c\u6f14\u7b97\u6cd5 B \uff0c\u5b83\u5011\u90fd\u80fd\u89e3\u6c7a\u540c\u4e00\u554f\u984c\uff0c\u73fe\u5728\u9700\u8981\u5c0d\u6bd4\u9019\u5169\u500b\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u6700\u76f4\u63a5\u7684\u65b9\u6cd5\u662f\u627e\u4e00\u81fa\u8a08\u7b97\u6a5f\uff0c\u57f7\u884c\u9019\u5169\u500b\u6f14\u7b97\u6cd5\uff0c\u4e26\u76e3\u63a7\u8a18\u9304\u5b83\u5011\u7684\u57f7\u884c\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u4f54\u7528\u60c5\u6cc1\u3002\u9019\u7a2e\u8a55\u4f30\u65b9\u5f0f\u80fd\u5920\u53cd\u6620\u771f\u5be6\u60c5\u6cc1\uff0c\u4f46\u4e5f\u5b58\u5728\u8f03\u5927\u7684\u4fb7\u9650\u6027\u3002

    \u4e00\u65b9\u9762\uff0c\u96e3\u4ee5\u6392\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5e72\u64fe\u56e0\u7d20\u3002\u786c\u9ad4\u914d\u7f6e\u6703\u5f71\u97ff\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\u3002\u6bd4\u5982\u5728\u67d0\u81fa\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u4f46\u5728\u53e6\u4e00\u81fa\u914d\u7f6e\u4e0d\u540c\u7684\u8a08\u7b97\u6a5f\u4e2d\uff0c\u53ef\u80fd\u5f97\u5230\u76f8\u53cd\u7684\u6e2c\u8a66\u7d50\u679c\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u9700\u8981\u5728\u5404\u7a2e\u6a5f\u5668\u4e0a\u9032\u884c\u6e2c\u8a66\uff0c\u7d71\u8a08\u5e73\u5747\u6548\u7387\uff0c\u800c\u9019\u662f\u4e0d\u73fe\u5be6\u7684\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5c55\u958b\u5b8c\u6574\u6e2c\u8a66\u975e\u5e38\u8017\u8cbb\u8cc7\u6e90\u3002\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u91cf\u7684\u8b8a\u5316\uff0c\u6f14\u7b97\u6cd5\u6703\u8868\u73fe\u51fa\u4e0d\u540c\u7684\u6548\u7387\u3002\u4f8b\u5982\uff0c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 A \u7684\u57f7\u884c\u6642\u9593\u6bd4\u6f14\u7b97\u6cd5 B \u77ed\uff1b\u800c\u5728\u8f38\u5165\u8cc7\u6599\u91cf\u8f03\u5927\u6642\uff0c\u6e2c\u8a66\u7d50\u679c\u53ef\u80fd\u6070\u6070\u76f8\u53cd\u3002\u56e0\u6b64\uff0c\u70ba\u4e86\u5f97\u5230\u6709\u8aaa\u670d\u529b\u7684\u7d50\u8ad6\uff0c\u6211\u5011\u9700\u8981\u6e2c\u8a66\u5404\u7a2e\u898f\u6a21\u7684\u8f38\u5165\u8cc7\u6599\uff0c\u800c\u9019\u9700\u8981\u8017\u8cbb\u5927\u91cf\u7684\u8a08\u7b97\u8cc7\u6e90\u3002

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

    \u7531\u65bc\u5be6\u969b\u6e2c\u8a66\u5177\u6709\u8f03\u5927\u7684\u4fb7\u9650\u6027\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u8003\u616e\u50c5\u900f\u904e\u4e00\u4e9b\u8a08\u7b97\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u9019\u7a2e\u4f30\u7b97\u65b9\u6cd5\u88ab\u7a31\u70ba\u6f38\u8fd1\u8907\u96dc\u5ea6\u5206\u6790\uff08asymptotic complexity analysis\uff09\uff0c\u7c21\u7a31\u8907\u96dc\u5ea6\u5206\u6790\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u80fd\u5920\u9ad4\u73fe\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u4e4b\u9593\u7684\u95dc\u4fc2\u3002\u5b83\u63cf\u8ff0\u4e86\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6240\u9700\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u5b9a\u7fa9\u6709\u4e9b\u62d7\u53e3\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5176\u5206\u70ba\u4e09\u500b\u91cd\u9ede\u4f86\u7406\u89e3\u3002

    • \u201c\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\u201d\u5206\u5225\u5c0d\u61c9\u6642\u9593\u8907\u96dc\u5ea6\uff08time complexity\uff09\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u3002
    • \u201c\u96a8\u8457\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u7684\u589e\u52a0\u201d\u610f\u5473\u8457\u8907\u96dc\u5ea6\u53cd\u6620\u4e86\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u8207\u8f38\u5165\u8cc7\u6599\u9ad4\u91cf\u4e4b\u9593\u7684\u95dc\u4fc2\u3002
    • \u201c\u6642\u9593\u548c\u7a7a\u9593\u7684\u589e\u9577\u8da8\u52e2\u201d\u8868\u793a\u8907\u96dc\u5ea6\u5206\u6790\u95dc\u6ce8\u7684\u4e0d\u662f\u57f7\u884c\u6642\u9593\u6216\u4f54\u7528\u7a7a\u9593\u7684\u5177\u9ad4\u503c\uff0c\u800c\u662f\u6642\u9593\u6216\u7a7a\u9593\u589e\u9577\u7684\u201c\u5feb\u6162\u201d\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u514b\u670d\u4e86\u5be6\u969b\u6e2c\u8a66\u65b9\u6cd5\u7684\u5f0a\u7aef\uff0c\u9ad4\u73fe\u5728\u4ee5\u4e0b\u5169\u500b\u65b9\u9762\u3002

    • \u5b83\u7368\u7acb\u65bc\u6e2c\u8a66\u74b0\u5883\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\u3002
    • \u5b83\u53ef\u4ee5\u9ad4\u73fe\u4e0d\u540c\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5c24\u5176\u662f\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002

    Tip

    \u5982\u679c\u4f60\u4ecd\u5c0d\u8907\u96dc\u5ea6\u7684\u6982\u5ff5\u611f\u5230\u56f0\u60d1\uff0c\u7121\u9808\u64d4\u5fc3\uff0c\u6211\u5011\u6703\u5728\u5f8c\u7e8c\u7ae0\u7bc0\u4e2d\u8a73\u7d30\u4ecb\u7d39\u3002

    \u8907\u96dc\u5ea6\u5206\u6790\u70ba\u6211\u5011\u63d0\u4f9b\u4e86\u4e00\u628a\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u201c\u6a19\u5c3a\u201d\uff0c\u4f7f\u6211\u5011\u53ef\u4ee5\u8861\u91cf\u57f7\u884c\u67d0\u500b\u6f14\u7b97\u6cd5\u6240\u9700\u7684\u6642\u9593\u548c\u7a7a\u9593\u8cc7\u6e90\uff0c\u5c0d\u6bd4\u4e0d\u540c\u6f14\u7b97\u6cd5\u4e4b\u9593\u7684\u6548\u7387\u3002

    \u8907\u96dc\u5ea6\u662f\u500b\u6578\u5b78\u6982\u5ff5\uff0c\u5c0d\u65bc\u521d\u5b78\u8005\u53ef\u80fd\u6bd4\u8f03\u62bd\u8c61\uff0c\u5b78\u7fd2\u96e3\u5ea6\u76f8\u5c0d\u8f03\u9ad8\u3002\u5f9e\u9019\u500b\u89d2\u5ea6\u770b\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u53ef\u80fd\u4e0d\u592a\u9069\u5408\u4f5c\u70ba\u6700\u5148\u4ecb\u7d39\u7684\u5167\u5bb9\u3002\u7136\u800c\uff0c\u7576\u6211\u5011\u8a0e\u8ad6\u67d0\u500b\u8cc7\u6599\u7d50\u69cb\u6216\u6f14\u7b97\u6cd5\u7684\u7279\u9ede\u6642\uff0c\u96e3\u4ee5\u907f\u514d\u8981\u5206\u6790\u5176\u57f7\u884c\u901f\u5ea6\u548c\u7a7a\u9593\u4f7f\u7528\u60c5\u6cc1\u3002

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u5efa\u8b70\u4f60\u5728\u6df1\u5165\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u5148\u5c0d\u8907\u96dc\u5ea6\u5206\u6790\u5efa\u7acb\u521d\u6b65\u7684\u77ad\u89e3\uff0c\u4ee5\u4fbf\u80fd\u5920\u5b8c\u6210\u7c21\u55ae\u6f14\u7b97\u6cd5\u7684\u8907\u96dc\u5ea6\u5206\u6790\u3002

    "},{"location":"chapter_computational_complexity/space_complexity/","title":"2.4 \u00a0 \u7a7a\u9593\u8907\u96dc\u5ea6","text":"

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff08space complexity\uff09\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002\u9019\u500b\u6982\u5ff5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u975e\u5e38\u985e\u4f3c\uff0c\u53ea\u9700\u5c07\u201c\u57f7\u884c\u6642\u9593\u201d\u66ff\u63db\u70ba\u201c\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u201d\u3002

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

    \u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u4f7f\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

    • \u8f38\u5165\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u5165\u8cc7\u6599\u3002
    • \u66ab\u5b58\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u8b8a\u6578\u3001\u7269\u4ef6\u3001\u51fd\u5f0f\u4e0a\u4e0b\u6587\u7b49\u8cc7\u6599\u3002
    • \u8f38\u51fa\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u7684\u8f38\u51fa\u8cc7\u6599\u3002

    \u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u7d71\u8a08\u7bc4\u570d\u662f\u201c\u66ab\u5b58\u7a7a\u9593\u201d\u52a0\u4e0a\u201c\u8f38\u51fa\u7a7a\u9593\u201d\u3002

    \u66ab\u5b58\u7a7a\u9593\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

    • \u66ab\u5b58\u8cc7\u6599\uff1a\u7528\u65bc\u5132\u5b58\u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u5404\u7a2e\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u7b49\u3002
    • \u5806\u758a\u5e40\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u547c\u53eb\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u6599\u3002\u7cfb\u7d71\u5728\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\u90fd\u6703\u5728\u5806\u758a\u9802\u90e8\u5efa\u7acb\u4e00\u500b\u5806\u758a\u5e40\uff0c\u51fd\u5f0f\u8fd4\u56de\u5f8c\uff0c\u5806\u758a\u5e40\u7a7a\u9593\u6703\u88ab\u91cb\u653e\u3002
    • \u6307\u4ee4\u7a7a\u9593\uff1a\u7528\u65bc\u5132\u5b58\u7de8\u8b6f\u5f8c\u7684\u7a0b\u5f0f\u6307\u4ee4\uff0c\u5728\u5be6\u969b\u7d71\u8a08\u4e2d\u901a\u5e38\u5ffd\u7565\u4e0d\u8a08\u3002

    \u5728\u5206\u6790\u4e00\u6bb5\u7a0b\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6642\uff0c\u6211\u5011\u901a\u5e38\u7d71\u8a08\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u8f38\u51fa\u8cc7\u6599\u4e09\u90e8\u5206\uff0c\u5982\u5716 2-15 \u6240\u793a\u3002

    \u5716 2-15 \u00a0 \u6f14\u7b97\u6cd5\u4f7f\u7528\u7684\u76f8\u95dc\u7a7a\u9593

    \u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class Node:\n    \"\"\"\u985e\u5225\"\"\"\n    def __init__(self, x: int):\n        self.val: int = x              # \u7bc0\u9ede\u503c\n        self.next: Node | None = None  # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\ndef function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n\ndef algorithm(n) -> int:  # \u8f38\u5165\u8cc7\u6599\n    A = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff0c\u4e00\u822c\u7528\u5927\u5beb\u5b57\u6bcd\u8868\u793a\uff09\n    b = 0                 # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node(0)        # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function()        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return A + b + c      # \u8f38\u51fa\u8cc7\u6599\n
    /* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    int val;\n    Node *next;\n    Node(int x) : val(x), next(nullptr) {}\n};\n\n/* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node* node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = func();           // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    int val;\n    Node next;\n    Node(int x) { val = x; }\n}\n\n/* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    final int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node(int x) {\n    int val = x;\n    Node next;\n}\n\n/* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint Algorithm(int n) {        // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;          // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    Node node = new(0);       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    int c = Function();       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u7d50\u69cb\u9ad4 */\ntype node struct {\n    val  int\n    next *node\n}\n\n/* \u5efa\u7acb node \u7d50\u69cb\u9ad4  */\nfunc newNode(val int) *node {\n    return &node{val: val}\n}\n\n/* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n int) int { // \u8f38\u5165\u8cc7\u6599\n    const a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b := 0                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    newNode(0)              // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c := function()         // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c        // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    var val: Int\n    var next: Node?\n\n    init(x: Int) {\n        val = x\n    }\n}\n\n/* \u51fd\u5f0f */\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfunc algorithm(n: Int) -> Int { // \u8f38\u5165\u8cc7\u6599\n    let a = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0             // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node(x: 0) // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function()    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c      // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    val;\n    next;\n    constructor(val) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n) {       // \u8f38\u5165\u8cc7\u6599\n    const a = 0;              // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0); // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;         // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n    val: number;\n    next: Node | null;\n    constructor(val?: number) {\n        this.val = val === undefined ? 0 : val; // \u7bc0\u9ede\u503c\n        this.next = null;                       // \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n    }\n}\n\n/* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\nfunction algorithm(n: number): number { // \u8f38\u5165\u8cc7\u6599\n    const a = 0;                        // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let b = 0;                          // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    const node = new Node(0);           // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    const c = constFunc();              // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;                   // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node {\n  int val;\n  Node next;\n  Node(this.val, [this.next]);\n}\n\n/* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n  return 0;\n}\n\nint algorithm(int n) {  // \u8f38\u5165\u8cc7\u6599\n  const int a = 0;      // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n  int b = 0;            // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n  Node node = Node(0);  // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n  int c = function();   // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n  return a + b + c;     // \u8f38\u51fa\u8cc7\u6599\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u7d50\u69cb\u9ad4 */\nstruct Node {\n    val: i32,\n    next: Option<Rc<RefCell<Node>>>,\n}\n\n/* \u5efa\u7acb Node \u7d50\u69cb\u9ad4 */\nimpl Node {\n    fn new(val: i32) -> Self {\n        Self { val: val, next: None }\n    }\n}\n\n/* \u51fd\u5f0f */\nfn function() -> i32 {      \n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nfn algorithm(n: i32) -> i32 {       // \u8f38\u5165\u8cc7\u6599\n    const a: i32 = 0;               // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    let mut b = 0;                  // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    let node = Node::new(0);        // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    let c = function();             // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;               // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0;\n}\n\nint algorithm(int n) { // \u8f38\u5165\u8cc7\u6599\n    const int a = 0;   // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    int b = 0;         // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    int c = func();    // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c;  // \u8f38\u51fa\u8cc7\u6599\n}\n
    /* \u985e\u5225 */\nclass Node(var _val: Int) {\n    var next: Node? = null\n}\n\n/* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\nfun algorithm(n: Int): Int { // \u8f38\u5165\u8cc7\u6599\n    val a = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    var b = 0                // \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    val node = Node(0)       // \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    val c = function()       // \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    return a + b + c         // \u8f38\u51fa\u8cc7\u6599\n}\n
    ### \u985e\u5225 ###\nclass Node\n    attr_accessor :val      # \u7bc0\u9ede\u503c\n    attr_accessor :next     # \u6307\u5411\u4e0b\u4e00\u7bc0\u9ede\u7684\u5f15\u7528\n\n    def initialize(x)\n        @val = x\n    end\nend\n\n### \u51fd\u5f0f ###\ndef function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    0\nend\n\n### \u6f14\u7b97\u6cd5 ###\ndef algorithm(n)        # \u8f38\u5165\u8cc7\u6599\n    a = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u5e38\u6578\uff09\n    b = 0               # \u66ab\u5b58\u8cc7\u6599\uff08\u8b8a\u6578\uff09\n    node = Node.new(0)  # \u66ab\u5b58\u8cc7\u6599\uff08\u7269\u4ef6\uff09\n    c = function        # \u5806\u758a\u5e40\u7a7a\u9593\uff08\u547c\u53eb\u51fd\u5f0f\uff09\n    a + b + c           # \u8f38\u51fa\u8cc7\u6599\nend\n
    \n
    "},{"location":"chapter_computational_complexity/space_complexity/#242","title":"2.4.2 \u00a0 \u63a8\u7b97\u65b9\u6cd5","text":"

    \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u8207\u6642\u9593\u8907\u96dc\u5ea6\u5927\u81f4\u76f8\u540c\uff0c\u53ea\u9700\u5c07\u7d71\u8a08\u7269\u4ef6\u5f9e\u201c\u64cd\u4f5c\u6578\u91cf\u201d\u8f49\u70ba\u201c\u4f7f\u7528\u7a7a\u9593\u5927\u5c0f\u201d\u3002

    \u800c\u8207\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u7684\u662f\uff0c\u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u3002\u9019\u662f\u56e0\u70ba\u8a18\u61b6\u9ad4\u7a7a\u9593\u662f\u4e00\u9805\u786c\u6027\u8981\u6c42\uff0c\u6211\u5011\u5fc5\u9808\u78ba\u4fdd\u5728\u6240\u6709\u8f38\u5165\u8cc7\u6599\u4e0b\u90fd\u6709\u8db3\u5920\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u9810\u7559\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u201c\u6700\u5dee\u201d\u6709\u5169\u5c64\u542b\u7fa9\u3002

    1. \u4ee5\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u70ba\u6e96\uff1a\u7576 \\(n < 10\\) \u6642\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1b\u4f46\u7576 \\(n > 10\\) \u6642\uff0c\u521d\u59cb\u5316\u7684\u9663\u5217 nums \u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
    2. \u4ee5\u6f14\u7b97\u6cd5\u57f7\u884c\u4e2d\u7684\u5cf0\u503c\u8a18\u61b6\u9ad4\u70ba\u6e96\uff1a\u4f8b\u5982\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6700\u5f8c\u4e00\u884c\u4e4b\u524d\uff0c\u4f54\u7528 \\(O(1)\\) \u7a7a\u9593\uff1b\u7576\u521d\u59cb\u5316\u9663\u5217 nums \u6642\uff0c\u7a0b\u5f0f\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\uff0c\u56e0\u6b64\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(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\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u7d71\u8a08\u5806\u758a\u5e40\u7a7a\u9593\u3002\u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def function() -> int:\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef loop(n: int):\n    \"\"\"\u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1)\"\"\"\n    for _ in range(n):\n        function()\n\ndef recur(n: int):\n    \"\"\"\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\"\"\"\n    if n == 1:\n        return\n    return recur(n - 1)\n
    int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    int Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid Loop(int n) {\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nint Recur(int n) {\n    if (n == 1) return 1;\n    return Recur(n - 1);\n}\n
    func function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n int) {\n    for i := 0; i < n; i++ {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n int) {\n    if n == 1 {\n        return\n    }\n    recur(n - 1)\n}\n
    @discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunc loop(n: Int) {\n    for _ in 0 ..< n {\n        function()\n    }\n}\n\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunc recur(n: Int) {\n    if n == 1 {\n        return\n    }\n    recur(n: n - 1)\n}\n
    function constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n) {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n) {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    function constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfunction loop(n: number): void {\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfunction recur(n: number): void {\n    if (n === 1) return;\n    return recur(n - 1);\n}\n
    int function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n  for (int i = 0; i < n; i++) {\n    function();\n  }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n  if (n == 1) return;\n  return recur(n - 1);\n}\n
    fn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfn loop(n: i32) {\n    for i in 0..n {\n        function();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfn recur(n: i32) {\n    if n == 1 {\n        return;\n    }\n    recur(n - 1);\n}\n
    int func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nvoid loop(int n) {\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nvoid recur(int n) {\n    if (n == 1) return;\n    return recur(n - 1);\n}\n
    fun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n/* \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) */\nfun loop(n: Int) {\n    for (i in 0..<n) {\n        function()\n    }\n}\n/* \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) */\nfun recur(n: Int) {\n    if (n == 1) return\n    return recur(n - 1)\n}\n
    def function\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    0\nend\n\n### \u8ff4\u5708\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(1) ###\ndef loop(n)\n    (0...n).each { function }\nend\n\n### \u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n) ###\ndef recur(n)\n    return if n == 1\n    recur(n - 1)\nend\n
    \n

    \u51fd\u5f0f loop() \u548c recur() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u4f46\u7a7a\u9593\u8907\u96dc\u5ea6\u4e0d\u540c\u3002

    • \u51fd\u5f0f loop() \u5728\u8ff4\u5708\u4e2d\u547c\u53eb\u4e86 \\(n\\) \u6b21 function() \uff0c\u6bcf\u8f2a\u4e2d\u7684 function() \u90fd\u8fd4\u56de\u4e26\u91cb\u653e\u4e86\u5806\u758a\u5e40\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \u3002
    • \u905e\u8ff4\u51fd\u5f0f recur() \u5728\u57f7\u884c\u904e\u7a0b\u4e2d\u6703\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 recur() \uff0c\u5f9e\u800c\u4f54\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
    "},{"location":"chapter_computational_complexity/space_complexity/#243","title":"2.4.3 \u00a0 \u5e38\u898b\u578b\u5225","text":"

    \u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5716 2-16 \u5c55\u793a\u4e86\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\uff08\u5f9e\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\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} \\end{aligned} \\]

    \u5716 2-16 \u00a0 \u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225

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

    \u5e38\u6578\u968e\u5e38\u898b\u65bc\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u7684\u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u8ff4\u5708\u4e2d\u521d\u59cb\u5316\u8b8a\u6578\u6216\u547c\u53eb\u51fd\u5f0f\u800c\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\uff0c\u5728\u9032\u5165\u4e0b\u4e00\u8ff4\u5708\u5f8c\u5c31\u6703\u88ab\u91cb\u653e\uff0c\u56e0\u6b64\u4e0d\u6703\u7d2f\u7a4d\u4f54\u7528\u7a7a\u9593\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def function() -> int:\n    \"\"\"\u51fd\u5f0f\"\"\"\n    # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n\ndef constant(n: int):\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    a = 0\n    nums = [0] * 10000\n    node = ListNode(0)\n    # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        c = 0\n    # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in range(n):\n        function()\n
    space_complexity.cpp
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    vector<int> nums(10000);\n    ListNode node(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.java
    /* \u51fd\u5f0f */\nint function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    final int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        function();\n    }\n}\n
    space_complexity.cs
    /* \u51fd\u5f0f */\nint Function() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid Constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    int a = 0;\n    int b = 0;\n    int[] nums = new int[10000];\n    ListNode node = new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        Function();\n    }\n}\n
    space_complexity.go
    /* \u51fd\u5f0f */\nfunc function() int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c...\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc spaceConstant(n int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0\n    b := 0\n    nums := make([]int, 10000)\n    node := newNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    var c int\n    for i := 0; i < n; i++ {\n        c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\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\u5f0f */\n@discardableResult\nfunc function() -> Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfunc constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    let a = 0\n    var b = 0\n    let nums = Array(repeating: 0, count: 10000)\n    let node = ListNode(x: 0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        let c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for _ in 0 ..< n {\n        function()\n    }\n}\n
    space_complexity.js
    /* \u51fd\u5f0f */\nfunction constFunc() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.ts
    /* \u51fd\u5f0f */\nfunction constFunc(): number {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nfunction constant(n: number): void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const a = 0;\n    const b = 0;\n    const nums = new Array(10000);\n    const node = new ListNode(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        const c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (let i = 0; i < n; i++) {\n        constFunc();\n    }\n}\n
    space_complexity.dart
    /* \u51fd\u5f0f */\nint function() {\n  // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n  // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  final int a = 0;\n  int b = 0;\n  List<int> nums = List.filled(10000, 0);\n  ListNode node = ListNode(0);\n  // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    int c = 0;\n  }\n  // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  for (var i = 0; i < n; i++) {\n    function();\n  }\n}\n
    space_complexity.rs
    /* \u51fd\u5f0f */\nfn function() -> i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\n#[allow(unused)]\nfn constant(n: i32) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const A: i32 = 0;\n    let b = 0;\n    let nums = vec![0; 10000];\n    let node = ListNode::new(0);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        let c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for i in 0..n {\n        function();\n    }\n}\n
    space_complexity.c
    /* \u51fd\u5f0f */\nint func() {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n/* \u5e38\u6578\u968e */\nvoid constant(int n) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    const int a = 0;\n    int b = 0;\n    int nums[1000];\n    ListNode *node = newListNode(0);\n    free(node);\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        int c = 0;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (int i = 0; i < n; i++) {\n        func();\n    }\n}\n
    space_complexity.kt
    /* \u51fd\u5f0f */\nfun function(): Int {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0\n}\n\n/* \u5e38\u6578\u968e */\nfun constant(n: Int) {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n    val a = 0\n    var b = 0\n    val nums = Array(10000) { 0 }\n    val node = ListNode(0)\n    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        val c = 0\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    for (i in 0..<n) {\n        function()\n    }\n}\n
    space_complexity.rb
    ### \u51fd\u5f0f ###\ndef function\n  # \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n  0\nend\n\n### \u5e38\u6578\u968e ###\ndef constant(n)\n  # \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\n  a = 0\n  nums = [0] * 10000\n  node = ListNode.new\n\n  # \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { c = 0 }\n  # \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n  (0...n).each { function }\nend\n
    space_complexity.zig
    // \u51fd\u5f0f\nfn function() i32 {\n    // \u57f7\u884c\u67d0\u4e9b\u64cd\u4f5c\n    return 0;\n}\n\n// \u5e38\u6578\u968e\nfn constant(n: i32) void {\n    // \u5e38\u6578\u3001\u8b8a\u6578\u3001\u7269\u4ef6\u4f54\u7528 O(1) \u7a7a\u9593\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    // \u8ff4\u5708\u4e2d\u7684\u8b8a\u6578\u4f54\u7528 O(1) \u7a7a\u9593\n    while (i < n) : (i += 1) {\n        var c: i32 = 0;\n        _ = c;\n    }\n    // \u8ff4\u5708\u4e2d\u7684\u51fd\u5f0f\u4f54\u7528 O(1) \u7a7a\u9593\n    i = 0;\n    while (i < n) : (i += 1) {\n        _ = function();\n    }\n    _ = a;\n    _ = b;\n    _ = nums;\n    _ = node;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7dda\u6027\u968e\u5e38\u898b\u65bc\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u6b63\u6bd4\u7684\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u7b49\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def linear(n: int):\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    nums = [0] * n\n    # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    hmap = dict[int, str]()\n    for i in range(n):\n        hmap[i] = str(i)\n
    space_complexity.cpp
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<int> nums(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    vector<ListNode> nodes;\n    for (int i = 0; i < n; i++) {\n        nodes.push_back(ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = new ArrayList<>();\n    for (int i = 0; i < n; i++) {\n        nodes.add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid Linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int[] nums = new int[n];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    List<ListNode> nodes = [];\n    for (int i = 0; i < n; i++) {\n        nodes.Add(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunc spaceLinear(n int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    _ = make([]int, n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nodes []*node\n    for i := 0; i < n; i++ {\n        nodes = append(nodes, newNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunc linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nums = Array(repeating: 0, count: n)\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let nodes = (0 ..< n).map { ListNode(x: $0) }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    let map = Dictionary(uniqueKeysWithValues: (0 ..< n).map { ($0, \"\\($0)\") })\n}\n
    space_complexity.js
    /* \u7dda\u6027\u968e */\nfunction linear(n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nfunction linear(n: number): void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nums = new Array(n);\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    const nodes: ListNode[] = [];\n    for (let i = 0; i < n; i++) {\n        nodes.push(new ListNode(i));\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\nvoid linear(int n) {\n  // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<int> nums = List.filled(n, 0);\n  // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  List<ListNode> nodes = [];\n  for (var i = 0; i < n; i++) {\n    nodes.add(ListNode(i));\n  }\n  // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u7dda\u6027\u968e */\n#[allow(unused)]\nfn linear(n: i32) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nums = vec![0; n as usize];\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    let mut nodes = Vec::new();\n    for i in 0..n {\n        nodes.push(ListNode::new(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    /* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u7dda\u6027\u968e */\nvoid linear(int n) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    int *nums = malloc(sizeof(int) * n);\n    free(nums);\n\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    ListNode **nodes = malloc(sizeof(ListNode *) * n);\n    for (int i = 0; i < n; i++) {\n        nodes[i] = newListNode(i);\n    }\n    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(nodes[i]);\n    }\n    free(nodes);\n\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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    // \u8a18\u61b6\u9ad4\u91cb\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
    /* \u7dda\u6027\u968e */\nfun linear(n: Int) {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nums = Array(n) { 0 }\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    val nodes = mutableListOf<ListNode>()\n    for (i in 0..<n) {\n        nodes.add(ListNode(i))\n    }\n    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n    val map = mutableMapOf<Int, String>()\n    for (i in 0..<n) {\n        map[i] = i.toString()\n    }\n}\n
    space_complexity.rb
    ### \u7dda\u6027\u968e ###\ndef linear(n)\n  # \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n  nums = Array.new(n, 0)\n\n  # \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\n  hmap = {}\n  for i in 0...n\n    hmap[i] = i.to_s\n  end\nend\n
    space_complexity.zig
    // \u7dda\u6027\u968e\nfn linear(comptime n: i32) !void {\n    // \u9577\u5ea6\u70ba n \u7684\u9663\u5217\u4f54\u7528 O(n) \u7a7a\u9593\n    var nums = [_]i32{0}**n;\n    // \u9577\u5ea6\u70ba n \u7684\u4e32\u5217\u4f54\u7528 O(n) \u7a7a\u9593\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    // \u9577\u5ea6\u70ba n \u7684\u96dc\u6e4a\u8868\u4f54\u7528 O(n) \u7a7a\u9593\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 2-17 \u6240\u793a\uff0c\u6b64\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5373\u540c\u6642\u5b58\u5728 \\(n\\) \u500b\u672a\u8fd4\u56de\u7684 linear_recur() \u51fd\u5f0f\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\uff1a

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

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-17 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u7dda\u6027\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

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

    \u5e73\u65b9\u968e\u5e38\u898b\u65bc\u77e9\u9663\u548c\u5716\uff0c\u5143\u7d20\u6578\u91cf\u8207 \\(n\\) \u6210\u5e73\u65b9\u95dc\u4fc2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic(n: int):\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    num_matrix = [[0] * n for _ in range(n)]\n
    space_complexity.cpp
    /* \u5e73\u65b9\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[][] numMatrix = new int[n][n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid Quadratic(int n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    int[,] numMatrix = new int[n, n];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunc spaceQuadratic(n int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunc quadratic(n: Int) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let numList = Array(repeating: Array(repeating: 0, count: n), count: n)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u968e */\nfunction quadratic(n) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nfunction quadratic(n: number): void {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    const numMatrix = Array(n)\n        .fill(null)\n        .map(() => Array(n).fill(null));\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n  // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n  List<List<int>> numMatrix = List.generate(n, (_) => List.filled(n, 0));\n  // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\n#[allow(unused)]\nfn quadratic(n: i32) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    let num_matrix = vec![vec![0; n as usize]; n as usize];\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e */\nvoid quadratic(int n) {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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    // \u8a18\u61b6\u9ad4\u91cb\u653e\n    for (int i = 0; i < n; i++) {\n        free(numMatrix[i]);\n    }\n    free(numMatrix);\n}\n
    space_complexity.kt
    /* \u5e73\u65b9\u968e */\nfun quadratic(n: Int) {\n    // \u77e9\u9663\u4f54\u7528 O(n^2) \u7a7a\u9593\n    val numMatrix = arrayOfNulls<Array<Int>?>(n)\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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\u968e ###\ndef quadratic(n)\n  # \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\n  Array.new(n) { Array.new(n, 0) }\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u968e\nfn quadratic(n: i32) !void {\n    // \u4e8c\u7dad\u4e32\u5217\u4f54\u7528 O(n^2) \u7a7a\u9593\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 2-18 \u6240\u793a\uff0c\u8a72\u51fd\u5f0f\u7684\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u5728\u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u90fd\u521d\u59cb\u5316\u4e86\u4e00\u500b\u9663\u5217\uff0c\u9577\u5ea6\u5206\u5225\u70ba \\(n\\)\u3001\\(n-1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u5e73\u5747\u9577\u5ea6\u70ba \\(n / 2\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u4f54\u7528 \\(O(n^2)\\) \u7a7a\u9593\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def quadratic_recur(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 0:\n        return 0\n    # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    nums = [0] * n\n    return quadratic_recur(n - 1)\n
    space_complexity.cpp
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    vector<int> nums(n);\n    cout << \"\u905e\u8ff4 n = \" << n << \" \u4e2d\u7684 nums \u9577\u5ea6 = \" << nums.size() << endl;\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.java
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    int[] nums = new int[n];\n    System.out.println(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.length);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.cs
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint QuadraticRecur(int n) {\n    if (n <= 0) return 0;\n    int[] nums = new int[n];\n    Console.WriteLine(\"\u905e\u8ff4 n = \" + n + \" \u4e2d\u7684 nums \u9577\u5ea6 = \" + nums.Length);\n    return QuadraticRecur(n - 1);\n}\n
    space_complexity.go
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc spaceQuadraticRecur(n int) int {\n    if n <= 0 {\n        return 0\n    }\n    nums := make([]int, n)\n    fmt.Printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\u5ea6 = %d \\n\", n, len(nums))\n    return spaceQuadraticRecur(n - 1)\n}\n
    space_complexity.swift
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\n@discardableResult\nfunc quadraticRecur(n: Int) -> Int {\n    if n <= 0 {\n        return 0\n    }\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = Array(repeating: 0, count: n)\n    print(\"\u905e\u8ff4 n = \\(n) \u4e2d\u7684 nums \u9577\u5ea6 = \\(nums.count)\")\n    return quadraticRecur(n: n - 1)\n}\n
    space_complexity.js
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n) {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.ts
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction quadraticRecur(n: number): number {\n    if (n <= 0) return 0;\n    const nums = new Array(n);\n    console.log(`\u905e\u8ff4 n = ${n} \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}`);\n    return quadraticRecur(n - 1);\n}\n
    space_complexity.dart
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n  if (n <= 0) return 0;\n  List<int> nums = List.filled(n, 0);\n  print('\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.length}');\n  return quadraticRecur(n - 1);\n}\n
    space_complexity.rs
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn quadratic_recur(n: i32) -> i32 {\n    if n <= 0 {\n        return 0;\n    };\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    let nums = vec![0; n as usize];\n    println!(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\", n, nums.len());\n    return quadratic_recur(n - 1);\n}\n
    space_complexity.c
    /* \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint quadraticRecur(int n) {\n    if (n <= 0)\n        return 0;\n    int *nums = malloc(sizeof(int) * n);\n    printf(\"\u905e\u8ff4 n = %d \u4e2d\u7684 nums \u9577\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\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\ntailrec fun quadraticRecur(n: Int): Int {\n    if (n <= 0)\n        return 0\n    // \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n    val nums = Array(n) { 0 }\n    println(\"\u905e\u8ff4 n = $n \u4e2d\u7684 nums \u9577\u5ea6 = ${nums.size}\")\n    return quadraticRecur(n - 1)\n}\n
    space_complexity.rb
    ### \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef quadratic_recur(n)\n  return 0 unless n > 0\n\n  # \u9663\u5217 nums \u9577\u5ea6\u70ba n, n-1, ..., 2, 1\n  nums = Array.new(n, 0)\n  quadratic_recur(n - 1)\nend\n
    space_complexity.zig
    // \u5e73\u65b9\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn quadraticRecur(comptime n: i32) i32 {\n    if (n <= 0) return 0;\n    var nums = [_]i32{0}**n;\n    std.debug.print(\"\u905e\u8ff4 n = {} \u4e2d\u7684 nums \u9577\u5ea6 = {}\\n\", .{n, nums.len});\n    return quadraticRecur(n - 1);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-18 \u00a0 \u905e\u8ff4\u51fd\u5f0f\u7522\u751f\u7684\u5e73\u65b9\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

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

    \u6307\u6578\u968e\u5e38\u898b\u65bc\u4e8c\u5143\u6a39\u3002\u89c0\u5bdf\u5716 2-19 \uff0c\u5c64\u6578\u70ba \\(n\\) \u7684\u201c\u6eff\u4e8c\u5143\u6a39\u201d\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(2^n - 1\\) \uff0c\u4f54\u7528 \\(O(2^n)\\) \u7a7a\u9593\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig space_complexity.py
    def build_tree(n: int) -> TreeNode | None:\n    \"\"\"\u6307\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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\u6578\u968e\uff08\u5efa\u7acb\u6eff\u4e8c\u5143\u6a39\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-19 \u00a0 \u6eff\u4e8c\u5143\u6a39\u7522\u751f\u7684\u6307\u6578\u968e\u7a7a\u9593\u8907\u96dc\u5ea6

    "},{"location":"chapter_computational_complexity/space_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

    \u5c0d\u6578\u968e\u5e38\u898b\u65bc\u5206\u6cbb\u6f14\u7b97\u6cd5\u3002\u4f8b\u5982\u5408\u4f75\u6392\u5e8f\uff0c\u8f38\u5165\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u6bcf\u8f2a\u905e\u8ff4\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u534a\uff0c\u5f62\u6210\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002

    \u518d\u4f8b\u5982\u5c07\u6578\u5b57\u8f49\u5316\u70ba\u5b57\u4e32\uff0c\u8f38\u5165\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5b83\u7684\u4f4d\u6578\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u5373\u5c0d\u61c9\u5b57\u4e32\u9577\u5ea6\u70ba \\(\\lfloor \\log_{10} n \\rfloor + 1\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_{10} n + 1) = O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/space_complexity/#244","title":"2.4.4 \u00a0 \u6b0a\u8861\u6642\u9593\u8207\u7a7a\u9593","text":"

    \u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u80fd\u9054\u5230\u6700\u512a\u3002\u7136\u800c\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u540c\u6642\u6700\u4f73\u5316\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u975e\u5e38\u56f0\u96e3\u3002

    \u964d\u4f4e\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u9700\u8981\u4ee5\u63d0\u5347\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba\u4ee3\u50f9\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u6211\u5011\u5c07\u72a7\u7272\u8a18\u61b6\u9ad4\u7a7a\u9593\u4f86\u63d0\u5347\u6f14\u7b97\u6cd5\u57f7\u884c\u901f\u5ea6\u7684\u601d\u8def\u7a31\u70ba\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff1b\u53cd\u4e4b\uff0c\u5247\u7a31\u70ba\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002

    \u9078\u64c7\u54ea\u7a2e\u601d\u8def\u53d6\u6c7a\u65bc\u6211\u5011\u66f4\u770b\u91cd\u54ea\u500b\u65b9\u9762\u3002\u5728\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u6642\u9593\u6bd4\u7a7a\u9593\u66f4\u5bf6\u8cb4\uff0c\u56e0\u6b64\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u901a\u5e38\u662f\u66f4\u5e38\u7528\u7684\u7b56\u7565\u3002\u7576\u7136\uff0c\u5728\u8cc7\u6599\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u4e0b\uff0c\u63a7\u5236\u7a7a\u9593\u8907\u96dc\u5ea6\u4e5f\u975e\u5e38\u91cd\u8981\u3002

    "},{"location":"chapter_computational_complexity/summary/","title":"2.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_computational_complexity/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"

    \u6f14\u7b97\u6cd5\u6548\u7387\u8a55\u4f30

    • \u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u662f\u8861\u91cf\u6f14\u7b97\u6cd5\u512a\u52a3\u7684\u5169\u500b\u4e3b\u8981\u8a55\u50f9\u6307\u6a19\u3002
    • \u6211\u5011\u53ef\u4ee5\u900f\u904e\u5be6\u969b\u6e2c\u8a66\u4f86\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u96e3\u4ee5\u6d88\u9664\u6e2c\u8a66\u74b0\u5883\u7684\u5f71\u97ff\uff0c\u4e14\u6703\u8017\u8cbb\u5927\u91cf\u8a08\u7b97\u8cc7\u6e90\u3002
    • \u8907\u96dc\u5ea6\u5206\u6790\u53ef\u4ee5\u6d88\u9664\u5be6\u969b\u6e2c\u8a66\u7684\u5f0a\u7aef\uff0c\u5206\u6790\u7d50\u679c\u9069\u7528\u65bc\u6240\u6709\u57f7\u884c\u5e73\u81fa\uff0c\u4e26\u4e14\u80fd\u5920\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u4e0d\u540c\u8cc7\u6599\u898f\u6a21\u4e0b\u7684\u6548\u7387\u3002

    \u6642\u9593\u8907\u96dc\u5ea6

    • \u6642\u9593\u8907\u96dc\u5ea6\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\uff0c\u53ef\u4ee5\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u80fd\u5931\u6548\uff0c\u5982\u5728\u8f38\u5165\u7684\u8cc7\u6599\u91cf\u8f03\u5c0f\u6216\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\u6642\uff0c\u7121\u6cd5\u7cbe\u78ba\u5c0d\u6bd4\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u512a\u52a3\u3002
    • \u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f7f\u7528\u5927 \\(O\\) \u7b26\u865f\u8868\u793a\uff0c\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u53cd\u6620\u7576 \\(n\\) \u8da8\u5411\u6b63\u7121\u7aae\u6642\uff0c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u7684\u589e\u9577\u7d1a\u5225\u3002
    • \u63a8\u7b97\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u5169\u6b65\uff0c\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002
    • \u5e38\u898b\u6642\u9593\u8907\u96dc\u5ea6\u5f9e\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\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u975e\u56fa\u5b9a\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u6642\u9593\u8907\u96dc\u5ea6\u5206\u70ba\u6700\u5dee\u3001\u6700\u4f73\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u5e7e\u4e4e\u4e0d\u7528\uff0c\u56e0\u70ba\u8f38\u5165\u8cc7\u6599\u4e00\u822c\u9700\u8981\u6eff\u8db3\u56b4\u683c\u689d\u4ef6\u624d\u80fd\u9054\u5230\u6700\u4f73\u60c5\u6cc1\u3002
    • \u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53cd\u6620\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8cc7\u6599\u8f38\u5165\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u6700\u63a5\u8fd1\u5be6\u969b\u61c9\u7528\u4e2d\u7684\u6f14\u7b97\u6cd5\u6548\u80fd\u3002\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u9700\u8981\u7d71\u8a08\u8f38\u5165\u8cc7\u6599\u5206\u4f48\u4ee5\u53ca\u7d9c\u5408\u5f8c\u7684\u6578\u5b78\u671f\u671b\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6

    • \u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u4f5c\u7528\u985e\u4f3c\u65bc\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u7528\u65bc\u8861\u91cf\u6f14\u7b97\u6cd5\u4f54\u7528\u8a18\u61b6\u9ad4\u7a7a\u9593\u96a8\u8cc7\u6599\u91cf\u589e\u9577\u7684\u8da8\u52e2\u3002
    • \u6f14\u7b97\u6cd5\u57f7\u884c\u904e\u7a0b\u4e2d\u7684\u76f8\u95dc\u8a18\u61b6\u9ad4\u7a7a\u9593\u53ef\u5206\u70ba\u8f38\u5165\u7a7a\u9593\u3001\u66ab\u5b58\u7a7a\u9593\u3001\u8f38\u51fa\u7a7a\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u8f38\u5165\u7a7a\u9593\u4e0d\u7d0d\u5165\u7a7a\u9593\u8907\u96dc\u5ea6\u8a08\u7b97\u3002\u66ab\u5b58\u7a7a\u9593\u53ef\u5206\u70ba\u66ab\u5b58\u8cc7\u6599\u3001\u5806\u758a\u5e40\u7a7a\u9593\u548c\u6307\u4ee4\u7a7a\u9593\uff0c\u5176\u4e2d\u5806\u758a\u5e40\u7a7a\u9593\u901a\u5e38\u50c5\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\u5f71\u97ff\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u6211\u5011\u901a\u5e38\u53ea\u95dc\u6ce8\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5373\u7d71\u8a08\u6f14\u7b97\u6cd5\u5728\u6700\u5dee\u8f38\u5165\u8cc7\u6599\u548c\u6700\u5dee\u57f7\u884c\u6642\u523b\u4e0b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u5e38\u898b\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e\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\u905e\u8ff4\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u55ce\uff1f

    \u7406\u8ad6\u4e0a\uff0c\u5c3e\u905e\u8ff4\u51fd\u5f0f\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002\u4e0d\u904e\u7d55\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\u3001Python\u3001C++\u3001Go\u3001C# \u7b49\uff09\u4e0d\u652f\u6301\u81ea\u52d5\u6700\u4f73\u5316\u5c3e\u905e\u8ff4\uff0c\u56e0\u6b64\u901a\u5e38\u8a8d\u70ba\u7a7a\u9593\u8907\u96dc\u5ea6\u662f \\(O(n)\\) \u3002

    Q\uff1a\u51fd\u5f0f\u548c\u65b9\u6cd5\u9019\u5169\u500b\u8853\u8a9e\u7684\u5340\u5225\u662f\u4ec0\u9ebc\uff1f

    \u51fd\u5f0f\uff08function\uff09\u53ef\u4ee5\u88ab\u7368\u7acb\u57f7\u884c\uff0c\u6240\u6709\u53c3\u6578\u90fd\u4ee5\u986f\u5f0f\u50b3\u905e\u3002\u65b9\u6cd5\uff08method\uff09\u8207\u4e00\u500b\u7269\u4ef6\u95dc\u806f\uff0c\u88ab\u96b1\u5f0f\u50b3\u905e\u7d66\u547c\u53eb\u5b83\u7684\u7269\u4ef6\uff0c\u80fd\u5920\u5c0d\u985e\u5225\u7684\u4f8b\u9805\u4e2d\u5305\u542b\u7684\u8cc7\u6599\u9032\u884c\u64cd\u4f5c\u3002

    \u4e0b\u9762\u4ee5\u5e7e\u7a2e\u5e38\u898b\u7684\u7a0b\u5f0f\u8a9e\u8a00\u70ba\u4f8b\u4f86\u8aaa\u660e\u3002

    • C \u8a9e\u8a00\u662f\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\u8a9e\u8a00\uff0c\u6c92\u6709\u7269\u4ef6\u5c0e\u5411\u7684\u6982\u5ff5\uff0c\u6240\u4ee5\u53ea\u6709\u51fd\u5f0f\u3002\u4f46\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5efa\u7acb\u7d50\u69cb\u9ad4\uff08struct\uff09\u4f86\u6a21\u64ec\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff0c\u8207\u7d50\u69cb\u9ad4\u76f8\u95dc\u806f\u7684\u51fd\u5f0f\u5c31\u76f8\u7576\u65bc\u5176\u4ed6\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u65b9\u6cd5\u3002
    • Java \u548c C# \u662f\u7269\u4ef6\u5c0e\u5411\u7684\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u78bc\u584a\uff08\u65b9\u6cd5\uff09\u901a\u5e38\u4f5c\u70ba\u67d0\u500b\u985e\u5225\u7684\u4e00\u90e8\u5206\u3002\u975c\u614b\u65b9\u6cd5\u7684\u884c\u70ba\u985e\u4f3c\u65bc\u51fd\u5f0f\uff0c\u56e0\u70ba\u5b83\u88ab\u7e6b\u7d50\u5728\u985e\u5225\u4e0a\uff0c\u4e0d\u80fd\u8a2a\u554f\u7279\u5b9a\u7684\u4f8b\u9805\u8b8a\u6578\u3002
    • C++ \u548c Python \u65e2\u652f\u6301\u7a0b\u5e8f\u5f0f\u7a0b\u5f0f\u8a2d\u8a08\uff08\u51fd\u5f0f\uff09\uff0c\u4e5f\u652f\u6301\u7269\u4ef6\u5c0e\u5411\u7a0b\u5f0f\u8a2d\u8a08\uff08\u65b9\u6cd5\uff09\u3002

    Q\uff1a\u5716\u89e3\u201c\u5e38\u898b\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u578b\u5225\u201d\u53cd\u6620\u7684\u662f\u5426\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\uff1f

    \u4e0d\u662f\uff0c\u8a72\u5716\u5c55\u793a\u7684\u662f\u7a7a\u9593\u8907\u96dc\u5ea6\uff0c\u5176\u53cd\u6620\u7684\u662f\u589e\u9577\u8da8\u52e2\uff0c\u800c\u4e0d\u662f\u4f54\u7528\u7a7a\u9593\u7684\u7d55\u5c0d\u5927\u5c0f\u3002

    \u5047\u8a2d\u53d6 \\(n = 8\\) \uff0c\u4f60\u53ef\u80fd\u6703\u767c\u73fe\u6bcf\u689d\u66f2\u7dda\u7684\u503c\u8207\u51fd\u5f0f\u5c0d\u61c9\u4e0d\u4e0a\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u689d\u66f2\u7dda\u90fd\u5305\u542b\u4e00\u500b\u5e38\u6578\u9805\uff0c\u7528\u65bc\u5c07\u53d6\u503c\u7bc4\u570d\u58d3\u7e2e\u5230\u4e00\u500b\u8996\u89ba\u8212\u9069\u7684\u7bc4\u570d\u5167\u3002

    \u5728\u5be6\u969b\u4e2d\uff0c\u56e0\u70ba\u6211\u5011\u901a\u5e38\u4e0d\u77e5\u9053\u6bcf\u500b\u65b9\u6cd5\u7684\u201c\u5e38\u6578\u9805\u201d\u8907\u96dc\u5ea6\u662f\u591a\u5c11\uff0c\u6240\u4ee5\u4e00\u822c\u7121\u6cd5\u50c5\u6191\u8907\u96dc\u5ea6\u4f86\u9078\u64c7 \\(n = 8\\) \u4e4b\u4e0b\u7684\u6700\u512a\u89e3\u6cd5\u3002\u4f46\u5c0d\u65bc \\(n = 8^5\\) \u5c31\u5f88\u597d\u9078\u4e86\uff0c\u9019\u6642\u589e\u9577\u8da8\u52e2\u5df2\u7d93\u4f54\u4e3b\u5c0e\u4e86\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/","title":"2.3 \u00a0 \u6642\u9593\u8907\u96dc\u5ea6","text":"

    \u57f7\u884c\u6642\u9593\u53ef\u4ee5\u76f4\u89c0\u4e14\u6e96\u78ba\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3002\u5982\u679c\u6211\u5011\u60f3\u6e96\u78ba\u9810\u4f30\u4e00\u6bb5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6642\u9593\uff0c\u61c9\u8a72\u5982\u4f55\u64cd\u4f5c\u5462\uff1f

    1. \u78ba\u5b9a\u57f7\u884c\u5e73\u81fa\uff0c\u5305\u62ec\u786c\u9ad4\u914d\u7f6e\u3001\u7a0b\u5f0f\u8a9e\u8a00\u3001\u7cfb\u7d71\u74b0\u5883\u7b49\uff0c\u9019\u4e9b\u56e0\u7d20\u90fd\u6703\u5f71\u97ff\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u6548\u7387\u3002
    2. \u8a55\u4f30\u5404\u7a2e\u8a08\u7b97\u64cd\u4f5c\u6240\u9700\u7684\u57f7\u884c\u6642\u9593\uff0c\u4f8b\u5982\u52a0\u6cd5\u64cd\u4f5c + \u9700\u8981 1 ns \uff0c\u4e58\u6cd5\u64cd\u4f5c * \u9700\u8981 10 ns \uff0c\u5217\u5370\u64cd\u4f5c print() \u9700\u8981 5 ns \u7b49\u3002
    3. \u7d71\u8a08\u7a0b\u5f0f\u78bc\u4e2d\u6240\u6709\u7684\u8a08\u7b97\u64cd\u4f5c\uff0c\u4e26\u5c07\u6240\u6709\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u6c42\u548c\uff0c\u5f9e\u800c\u5f97\u5230\u57f7\u884c\u6642\u9593\u3002

    \u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff1a

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

    \u6839\u64da\u4ee5\u4e0a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5f97\u5230\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u70ba \\((6n + 12)\\) ns \uff1a

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

    \u4f46\u5be6\u969b\u4e0a\uff0c\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\u65e2\u4e0d\u5408\u7406\u4e5f\u4e0d\u73fe\u5be6\u3002\u9996\u5148\uff0c\u6211\u5011\u4e0d\u5e0c\u671b\u5c07\u9810\u4f30\u6642\u9593\u548c\u57f7\u884c\u5e73\u81fa\u7e6b\u7d50\uff0c\u56e0\u70ba\u6f14\u7b97\u6cd5\u9700\u8981\u5728\u5404\u7a2e\u4e0d\u540c\u7684\u5e73\u81fa\u4e0a\u57f7\u884c\u3002\u5176\u6b21\uff0c\u6211\u5011\u5f88\u96e3\u7372\u77e5\u6bcf\u7a2e\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\uff0c\u9019\u7d66\u9810\u4f30\u904e\u7a0b\u5e36\u4f86\u4e86\u6975\u5927\u7684\u96e3\u5ea6\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#231","title":"2.3.1 \u00a0 \u7d71\u8a08\u6642\u9593\u589e\u9577\u8da8\u52e2","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u7d71\u8a08\u7684\u4e0d\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\uff0c\u800c\u662f\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457\u8cc7\u6599\u91cf\u8b8a\u5927\u6642\u7684\u589e\u9577\u8da8\u52e2\u3002

    \u201c\u6642\u9593\u589e\u9577\u8da8\u52e2\u201d\u9019\u500b\u6982\u5ff5\u6bd4\u8f03\u62bd\u8c61\uff0c\u6211\u5011\u900f\u904e\u4e00\u500b\u4f8b\u5b50\u4f86\u52a0\u4ee5\u7406\u89e3\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7d66\u5b9a\u4e09\u500b\u6f14\u7b97\u6cd5 A\u3001B \u548c C \uff1a

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

    \u5716 2-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u4e09\u500b\u6f14\u7b97\u6cd5\u51fd\u5f0f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

    • \u6f14\u7b97\u6cd5 A \u53ea\u6709 \\(1\\) \u500b\u5217\u5370\u64cd\u4f5c\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u4e0d\u96a8\u8457 \\(n\\) \u589e\u5927\u800c\u589e\u9577\u3002\u6211\u5011\u7a31\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002
    • \u6f14\u7b97\u6cd5 B \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(n\\) \u6b21\uff0c\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u96a8\u8457 \\(n\\) \u589e\u5927\u5448\u7dda\u6027\u589e\u9577\u3002\u6b64\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u88ab\u7a31\u70ba\u201c\u7dda\u6027\u968e\u201d\u3002
    • \u6f14\u7b97\u6cd5 C \u4e2d\u7684\u5217\u5370\u64cd\u4f5c\u9700\u8981\u8ff4\u5708 \\(1000000\\) \u6b21\uff0c\u96d6\u7136\u57f7\u884c\u6642\u9593\u5f88\u9577\uff0c\u4f46\u5b83\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\u3002\u56e0\u6b64 C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u548c A \u76f8\u540c\uff0c\u4ecd\u70ba\u201c\u5e38\u6578\u968e\u201d\u3002

    \u5716 2-7 \u00a0 \u6f14\u7b97\u6cd5 A\u3001B \u548c C \u7684\u6642\u9593\u589e\u9577\u8da8\u52e2

    \u76f8\u8f03\u65bc\u76f4\u63a5\u7d71\u8a08\u6f14\u7b97\u6cd5\u7684\u57f7\u884c\u6642\u9593\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u6709\u54ea\u4e9b\u7279\u9ede\u5462\uff1f

    • \u6642\u9593\u8907\u96dc\u5ea6\u80fd\u5920\u6709\u6548\u8a55\u4f30\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4f8b\u5982\uff0c\u6f14\u7b97\u6cd5 B \u7684\u57f7\u884c\u6642\u9593\u5448\u7dda\u6027\u589e\u9577\uff0c\u5728 \\(n > 1\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 A \u66f4\u6162\uff0c\u5728 \\(n > 1000000\\) \u6642\u6bd4\u6f14\u7b97\u6cd5 C \u66f4\u6162\u3002\u4e8b\u5be6\u4e0a\uff0c\u53ea\u8981\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8db3\u5920\u5927\uff0c\u8907\u96dc\u5ea6\u70ba\u201c\u5e38\u6578\u968e\u201d\u7684\u6f14\u7b97\u6cd5\u4e00\u5b9a\u512a\u65bc\u201c\u7dda\u6027\u968e\u201d\u7684\u6f14\u7b97\u6cd5\uff0c\u9019\u6b63\u662f\u6642\u9593\u589e\u9577\u8da8\u52e2\u7684\u542b\u7fa9\u3002
    • \u6642\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u66f4\u7c21\u4fbf\u3002\u986f\u7136\uff0c\u57f7\u884c\u5e73\u81fa\u548c\u8a08\u7b97\u64cd\u4f5c\u578b\u5225\u90fd\u8207\u6f14\u7b97\u6cd5\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u7121\u95dc\u3002\u56e0\u6b64\u5728\u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u5c07\u6240\u6709\u8a08\u7b97\u64cd\u4f5c\u7684\u57f7\u884c\u6642\u9593\u8996\u70ba\u76f8\u540c\u7684\u201c\u55ae\u4f4d\u6642\u9593\u201d\uff0c\u5f9e\u800c\u5c07\u201c\u8a08\u7b97\u64cd\u4f5c\u57f7\u884c\u6642\u9593\u7d71\u8a08\u201d\u7c21\u5316\u70ba\u201c\u8a08\u7b97\u64cd\u4f5c\u6578\u91cf\u7d71\u8a08\u201d\uff0c\u9019\u6a23\u4e00\u4f86\u4f30\u7b97\u96e3\u5ea6\u5c31\u5927\u5927\u964d\u4f4e\u4e86\u3002
    • \u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u5b58\u5728\u4e00\u5b9a\u7684\u4fb7\u9650\u6027\u3002\u4f8b\u5982\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 A \u548c C \u7684\u6642\u9593\u8907\u96dc\u5ea6\u76f8\u540c\uff0c\u4f46\u5be6\u969b\u57f7\u884c\u6642\u9593\u5dee\u5225\u5f88\u5927\u3002\u540c\u6a23\uff0c\u5118\u7ba1\u6f14\u7b97\u6cd5 B \u7684\u6642\u9593\u8907\u96dc\u5ea6\u6bd4 C \u9ad8\uff0c\u4f46\u5728\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u8f03\u5c0f\u6642\uff0c\u6f14\u7b97\u6cd5 B \u660e\u986f\u512a\u65bc\u6f14\u7b97\u6cd5 C \u3002\u5728\u9019\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5f88\u96e3\u50c5\u6191\u6642\u9593\u8907\u96dc\u5ea6\u5224\u65b7\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u9ad8\u4f4e\u3002\u7576\u7136\uff0c\u5118\u7ba1\u5b58\u5728\u4e0a\u8ff0\u554f\u984c\uff0c\u8907\u96dc\u5ea6\u5206\u6790\u4ecd\u7136\u662f\u8a55\u5224\u6f14\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\u5f0f\u6f38\u8fd1\u4e0a\u754c","text":"

    \u7d66\u5b9a\u4e00\u500b\u8f38\u5165\u5927\u5c0f\u70ba \\(n\\) \u7684\u51fd\u5f0f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    def algorithm(n: int):\n    a = 1      # +1\n    a = a + 1  # +1\n    a = a * 2  # +1\n    # \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 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    // \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for(let i = 0; i < n; i++){ // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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  // \u8ff4\u5708 n \u6b21\n  for (int i = 0; i < n; i++) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for _ in 0..n { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (int i = 0; i < n; i++) {   // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    // \u8ff4\u5708 n \u6b21\n    for (i in 0..<n) { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\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    # \u8ff4\u5708 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    // \u8ff4\u5708 n \u6b21\n    for (0..n) |_| { // +1\uff08\u6bcf\u8f2a\u90fd\u57f7\u884c i ++\uff09\n        std.debug.print(\"{}\\n\", .{0}); // +1\n    }\n}\n

    \u8a2d\u6f14\u7b97\u6cd5\u7684\u64cd\u4f5c\u6578\u91cf\u662f\u4e00\u500b\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7684\u51fd\u5f0f\uff0c\u8a18\u70ba \\(T(n)\\) \uff0c\u5247\u4ee5\u4e0a\u51fd\u5f0f\u7684\u64cd\u4f5c\u6578\u91cf\u70ba\uff1a

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

    \\(T(n)\\) \u662f\u4e00\u6b21\u51fd\u5f0f\uff0c\u8aaa\u660e\u5176\u57f7\u884c\u6642\u9593\u7684\u589e\u9577\u8da8\u52e2\u662f\u7dda\u6027\u7684\uff0c\u56e0\u6b64\u5b83\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u7dda\u6027\u968e\u3002

    \u6211\u5011\u5c07\u7dda\u6027\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8a18\u70ba \\(O(n)\\) \uff0c\u9019\u500b\u6578\u5b78\u7b26\u865f\u7a31\u70ba\u5927 \\(O\\) \u8a18\u865f\uff08big-\\(O\\) notation\uff09\uff0c\u8868\u793a\u51fd\u5f0f \\(T(n)\\) \u7684\u6f38\u8fd1\u4e0a\u754c\uff08asymptotic upper bound\uff09\u3002

    \u6642\u9593\u8907\u96dc\u5ea6\u5206\u6790\u672c\u8cea\u4e0a\u662f\u8a08\u7b97\u201c\u64cd\u4f5c\u6578\u91cf \\(T(n)\\)\u201d\u7684\u6f38\u8fd1\u4e0a\u754c\uff0c\u5b83\u5177\u6709\u660e\u78ba\u7684\u6578\u5b78\u5b9a\u7fa9\u3002

    \u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c

    \u82e5\u5b58\u5728\u6b63\u5be6\u6578 \\(c\\) \u548c\u5be6\u6578 \\(n_0\\) \uff0c\u4f7f\u5f97\u5c0d\u65bc\u6240\u6709\u7684 \\(n > n_0\\) \uff0c\u5747\u6709 \\(T(n) \\leq c \\cdot f(n)\\) \uff0c\u5247\u53ef\u8a8d\u70ba \\(f(n)\\) \u7d66\u51fa\u4e86 \\(T(n)\\) \u7684\u4e00\u500b\u6f38\u8fd1\u4e0a\u754c\uff0c\u8a18\u70ba \\(T(n) = O(f(n))\\) \u3002

    \u5982\u5716 2-8 \u6240\u793a\uff0c\u8a08\u7b97\u6f38\u8fd1\u4e0a\u754c\u5c31\u662f\u5c0b\u627e\u4e00\u500b\u51fd\u5f0f \\(f(n)\\) \uff0c\u4f7f\u5f97\u7576 \\(n\\) \u8da8\u5411\u65bc\u7121\u7aae\u5927\u6642\uff0c\\(T(n)\\) \u548c \\(f(n)\\) \u8655\u65bc\u76f8\u540c\u7684\u589e\u9577\u7d1a\u5225\uff0c\u50c5\u76f8\u5dee\u4e00\u500b\u5e38\u6578\u9805 \\(c\\) \u7684\u500d\u6578\u3002

    \u5716 2-8 \u00a0 \u51fd\u5f0f\u7684\u6f38\u8fd1\u4e0a\u754c

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

    \u6f38\u8fd1\u4e0a\u754c\u7684\u6578\u5b78\u5473\u5152\u6709\u9ede\u91cd\uff0c\u5982\u679c\u4f60\u611f\u89ba\u6c92\u6709\u5b8c\u5168\u7406\u89e3\uff0c\u4e5f\u7121\u9808\u64d4\u5fc3\u3002\u6211\u5011\u53ef\u4ee5\u5148\u638c\u63e1\u63a8\u7b97\u65b9\u6cd5\uff0c\u5728\u4e0d\u65b7\u7684\u5be6\u8e10\u4e2d\uff0c\u5c31\u53ef\u4ee5\u9010\u6f38\u9818\u609f\u5176\u6578\u5b78\u610f\u7fa9\u3002

    \u6839\u64da\u5b9a\u7fa9\uff0c\u78ba\u5b9a \\(f(n)\\) \u4e4b\u5f8c\uff0c\u6211\u5011\u4fbf\u53ef\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6 \\(O(f(n))\\) \u3002\u90a3\u9ebc\u5982\u4f55\u78ba\u5b9a\u6f38\u8fd1\u4e0a\u754c \\(f(n)\\) \u5462\uff1f\u7e3d\u9ad4\u5206\u70ba\u5169\u6b65\uff1a\u9996\u5148\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf\uff0c\u7136\u5f8c\u5224\u65b7\u6f38\u8fd1\u4e0a\u754c\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#1","title":"1. \u00a0 \u7b2c\u4e00\u6b65\uff1a\u7d71\u8a08\u64cd\u4f5c\u6578\u91cf","text":"

    \u91dd\u5c0d\u7a0b\u5f0f\u78bc\uff0c\u9010\u884c\u5f9e\u4e0a\u5230\u4e0b\u8a08\u7b97\u5373\u53ef\u3002\u7136\u800c\uff0c\u7531\u65bc\u4e0a\u8ff0 \\(c \\cdot f(n)\\) \u4e2d\u7684\u5e38\u6578\u9805 \\(c\\) \u53ef\u4ee5\u53d6\u4efb\u610f\u5927\u5c0f\uff0c\u56e0\u6b64\u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u4e2d\u7684\u5404\u7a2e\u4fc2\u6578\u3001\u5e38\u6578\u9805\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002\u6839\u64da\u6b64\u539f\u5247\uff0c\u53ef\u4ee5\u7e3d\u7d50\u51fa\u4ee5\u4e0b\u8a08\u6578\u7c21\u5316\u6280\u5de7\u3002

    1. \u5ffd\u7565 \\(T(n)\\) \u4e2d\u7684\u5e38\u6578\u9805\u3002\u56e0\u70ba\u5b83\u5011\u90fd\u8207 \\(n\\) \u7121\u95dc\uff0c\u6240\u4ee5\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u7522\u751f\u5f71\u97ff\u3002
    2. \u7701\u7565\u6240\u6709\u4fc2\u6578\u3002\u4f8b\u5982\uff0c\u8ff4\u5708 \\(2n\\) \u6b21\u3001\\(5n + 1\\) \u6b21\u7b49\uff0c\u90fd\u53ef\u4ee5\u7c21\u5316\u8a18\u70ba \\(n\\) \u6b21\uff0c\u56e0\u70ba \\(n\\) \u524d\u9762\u7684\u4fc2\u6578\u5c0d\u6642\u9593\u8907\u96dc\u5ea6\u6c92\u6709\u5f71\u97ff\u3002
    3. \u8ff4\u5708\u5de2\u72c0\u6642\u4f7f\u7528\u4e58\u6cd5\u3002\u7e3d\u64cd\u4f5c\u6578\u91cf\u7b49\u65bc\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u64cd\u4f5c\u6578\u91cf\u4e4b\u7a4d\uff0c\u6bcf\u4e00\u5c64\u8ff4\u5708\u4f9d\u7136\u53ef\u4ee5\u5206\u5225\u5957\u7528\u7b2c 1. \u9ede\u548c\u7b2c 2. \u9ede\u7684\u6280\u5de7\u3002

    \u7d66\u5b9a\u4e00\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u4e0a\u8ff0\u6280\u5de7\u4f86\u7d71\u8a08\u64cd\u4f5c\u6578\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\u5f8c\u7684\u7d71\u8a08\u7d50\u679c\uff0c\u5169\u8005\u63a8\u7b97\u51fa\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002

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

    \u6642\u9593\u8907\u96dc\u5ea6\u7531 \\(T(n)\\) \u4e2d\u6700\u9ad8\u968e\u7684\u9805\u4f86\u6c7a\u5b9a\u3002\u9019\u662f\u56e0\u70ba\u5728 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u6700\u9ad8\u968e\u7684\u9805\u5c07\u767c\u63ee\u4e3b\u5c0e\u4f5c\u7528\uff0c\u5176\u4ed6\u9805\u7684\u5f71\u97ff\u90fd\u53ef\u4ee5\u5ffd\u7565\u3002

    \u8868 2-2 \u5c55\u793a\u4e86\u4e00\u4e9b\u4f8b\u5b50\uff0c\u5176\u4e2d\u4e00\u4e9b\u8a87\u5f35\u7684\u503c\u662f\u70ba\u4e86\u5f37\u8abf\u201c\u4fc2\u6578\u7121\u6cd5\u64bc\u52d5\u968e\u6578\u201d\u9019\u4e00\u7d50\u8ad6\u3002\u7576 \\(n\\) \u8da8\u65bc\u7121\u7aae\u5927\u6642\uff0c\u9019\u4e9b\u5e38\u6578\u8b8a\u5f97\u7121\u8db3\u8f15\u91cd\u3002

    \u8868 2-2 \u00a0 \u4e0d\u540c\u64cd\u4f5c\u6578\u91cf\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u64cd\u4f5c\u6578\u91cf \\(T(n)\\) \u6642\u9593\u8907\u96dc\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\u898b\u578b\u5225","text":"

    \u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225\u5982\u5716 2-9 \u6240\u793a\uff08\u6309\u7167\u5f9e\u4f4e\u5230\u9ad8\u7684\u9806\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\u6578\u968e} < \\text{\u5c0d\u6578\u968e} < \\text{\u7dda\u6027\u968e} < \\text{\u7dda\u6027\u5c0d\u6578\u968e} < \\text{\u5e73\u65b9\u968e} < \\text{\u6307\u6578\u968e} < \\text{\u968e\u4e58\u968e} \\end{aligned} \\]

    \u5716 2-9 \u00a0 \u5e38\u898b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u578b\u5225

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

    \u5e38\u6578\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u5373\u4e0d\u96a8\u8457 \\(n\\) \u7684\u8b8a\u5316\u800c\u8b8a\u5316\u3002

    \u5728\u4ee5\u4e0b\u51fd\u5f0f\u4e2d\uff0c\u5118\u7ba1\u64cd\u4f5c\u6578\u91cf size \u53ef\u80fd\u5f88\u5927\uff0c\u4f46\u7531\u65bc\u5176\u8207\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u7121\u95dc\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(1)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def constant(n: int) -> int:\n    \"\"\"\u5e38\u6578\u968e\"\"\"\n    count = 0\n    size = 100000\n    for _ in range(size):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e38\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e */\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\u6578\u968e ###\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\u6578\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u7dda\u6027\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u7dda\u6027\u7d1a\u5225\u589e\u9577\u3002\u7dda\u6027\u968e\u901a\u5e38\u51fa\u73fe\u5728\u55ae\u5c64\u8ff4\u5708\u4e2d\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear(n: int) -> int:\n    \"\"\"\u7dda\u6027\u968e\"\"\"\n    count = 0\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\nfunction linear(n) {\n    let count = 0;\n    for (let i = 0; i < n; i++) count++;\n    return count;\n}\n
    time_complexity.ts
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    /* \u7dda\u6027\u968e */\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
    ### \u7dda\u6027\u968e ###\ndef linear(n)\n  count = 0\n  (0...n).each { count += 1 }\n  count\nend\n
    time_complexity.zig
    // \u7dda\u6027\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8d70\u8a2a\u9663\u5217\u548c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u7b49\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u9577\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def array_traversal(nums: list[int]) -> int:\n    \"\"\"\u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for num in nums:\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(vector<int> &nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int num : nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint ArrayTraversal(int[] nums) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    foreach (int num in nums) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums []int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for range nums {\n        count++\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunc arrayTraversal(nums: [Int]) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1\n    }\n    return count\n}\n
    time_complexity.js
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfunction arrayTraversal(nums: number[]): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (let i = 0; i < nums.length; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(List<int> nums) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for (var _num in nums) {\n    count++;\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfn array_traversal(nums: &[i32]) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for _ in nums {\n        count += 1;\n    }\n    count\n}\n
    time_complexity.c
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nint arrayTraversal(int *nums, int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (int i = 0; i < n; i++) {\n        count++;\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09 */\nfun arrayTraversal(nums: IntArray): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (num in nums) {\n        count++\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09###\ndef array_traversal(nums)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n  for num in nums\n    count += 1\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u7dda\u6027\u968e\uff08\u8d70\u8a2a\u9663\u5217\uff09\nfn arrayTraversal(nums: []i32) i32 {\n    var count: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u9663\u5217\u9577\u5ea6\u6210\u6b63\u6bd4\n    for (nums) |_| {\n        count += 1;\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u9700\u6839\u64da\u8f38\u5165\u8cc7\u6599\u7684\u578b\u5225\u4f86\u5177\u9ad4\u78ba\u5b9a\u3002\u6bd4\u5982\u5728\u7b2c\u4e00\u500b\u793a\u4f8b\u4e2d\uff0c\u8b8a\u6578 \\(n\\) \u70ba\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\uff1b\u5728\u7b2c\u4e8c\u500b\u793a\u4f8b\u4e2d\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u70ba\u8cc7\u6599\u5927\u5c0f\u3002

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

    \u5e73\u65b9\u968e\u7684\u64cd\u4f5c\u6578\u91cf\u76f8\u5c0d\u65bc\u8f38\u5165\u8cc7\u6599\u5927\u5c0f \\(n\\) \u4ee5\u5e73\u65b9\u7d1a\u5225\u589e\u9577\u3002\u5e73\u65b9\u968e\u901a\u5e38\u51fa\u73fe\u5728\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5916\u5c64\u8ff4\u5708\u548c\u5167\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n)\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def quadratic(n: int) -> int:\n    \"\"\"\u5e73\u65b9\u968e\"\"\"\n    count = 0\n    # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for i in range(n):\n        for j in range(n):\n            count += 1\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint Quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunc quadratic(n int) int {\n    count := 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunc quadratic(n: Int) -> Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunction quadratic(n) {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfunction quadratic(n: number): number {\n    let count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nint quadratic(int n) {\n  int count = 0;\n  // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfn quadratic(n: i32) -> i32 {\n    let mut count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\n    for _ in 0..n {\n        for _ in 0..n {\n            count += 1;\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u968e */\nint quadratic(int n) {\n    int count = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e */\nfun quadratic(n: Int): Int {\n    var count = 0\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e ###\ndef quadratic(n)\n  count = 0\n\n  # \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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\u968e\nfn quadratic(n: i32) i32 {\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u8ff4\u5708\u6b21\u6578\u8207\u8cc7\u6599\u5927\u5c0f n \u6210\u5e73\u65b9\u95dc\u4fc2\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-10 \u5c0d\u6bd4\u4e86\u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u4e09\u7a2e\u6642\u9593\u8907\u96dc\u5ea6\u3002

    \u5716 2-10 \u00a0 \u5e38\u6578\u968e\u3001\u7dda\u6027\u968e\u548c\u5e73\u65b9\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u4ee5\u6ce1\u6cab\u6392\u5e8f\u70ba\u4f8b\uff0c\u5916\u5c64\u8ff4\u5708\u57f7\u884c \\(n - 1\\) \u6b21\uff0c\u5167\u5c64\u8ff4\u5708\u57f7\u884c \\(n-1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u5e73\u5747\u70ba \\(n / 2\\) \u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(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\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\"\"\"\n    count = 0  # \u8a08\u6578\u5668\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(len(nums) - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n    return count\n
    time_complexity.cpp
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(vector<int> &nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int[] nums) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint BubbleSort(int[] nums) {\n    int count = 0;  // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                count += 3;  // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums []int) int {\n    count := 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                tmp := nums[j]\n                nums[j] = nums[j+1]\n                nums[j+1] = tmp\n                count += 3 // \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunc bubbleSort(nums: inout [Int]) -> Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.js
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums) {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfunction bubbleSort(nums: number[]): number {\n    let count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(List<int> nums) {\n  int count = 0; // \u8a08\u6578\u5668\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (var i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (var j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      }\n    }\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfn bubble_sort(nums: &mut [i32]) -> i32 {\n    let mut count = 0; // \u8a08\u6578\u5668\n\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    count\n}\n
    time_complexity.c
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nint bubbleSort(int *nums, int n) {\n    int count = 0; // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = n - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    time_complexity.kt
    /* \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09 */\nfun bubbleSort(nums: IntArray): Int {\n    var count = 0 // \u8a08\u6578\u5668\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09###\ndef bubble_sort(nums)\n  count = 0  # \u8a08\u6578\u5668\n\n  # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for i in (nums.length - 1).downto(0)\n    # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for j in 0...i\n      if nums[j] > nums[j + 1]\n        # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        tmp = nums[j]\n        nums[j] = nums[j + 1]\n        nums[j + 1] = tmp\n        count += 3 # \u5143\u7d20\u4ea4\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n      end\n    end\n  end\n\n  count\nend\n
    time_complexity.zig
    // \u5e73\u65b9\u968e\uff08\u6ce1\u6cab\u6392\u5e8f\uff09\nfn bubbleSort(nums: []i32) i32 {\n    var count: i32 = 0;  // \u8a08\u6578\u5668 \n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: i32 = @as(i32, @intCast(nums.len)) - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u63db\u5305\u542b 3 \u500b\u55ae\u5143\u64cd\u4f5c\n            }\n        }\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

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

    \u751f\u7269\u5b78\u7684\u201c\u7d30\u80de\u5206\u88c2\u201d\u662f\u6307\u6578\u968e\u589e\u9577\u7684\u5178\u578b\u4f8b\u5b50\uff1a\u521d\u59cb\u72c0\u614b\u70ba \\(1\\) \u500b\u7d30\u80de\uff0c\u5206\u88c2\u4e00\u8f2a\u5f8c\u8b8a\u70ba \\(2\\) \u500b\uff0c\u5206\u88c2\u5169\u8f2a\u5f8c\u8b8a\u70ba \\(4\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u5206\u88c2 \\(n\\) \u8f2a\u5f8c\u6709 \\(2^n\\) \u500b\u7d30\u80de\u3002

    \u5716 2-11 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u7d30\u80de\u5206\u88c2\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exponential(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    base = 1\n    # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0, base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint Exponential(int n) {\n    int count = 0, bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09*/\nfunc exponential(n int) int {\n    count, base := 0, 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunc exponential(n: Int) -> Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n) {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfunction exponential(n: number): number {\n    let count = 0,\n        base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n  int count = 0, base = 1;\n  // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfn exponential(n: i32) -> i32 {\n    let mut count = 0;\n    let mut base = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nint exponential(int n) {\n    int count = 0;\n    int bas = 1;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09 */\nfun exponential(n: Int): Int {\n    var count = 0\n    var base = 1\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09###\ndef exponential(n)\n  count, base = 0, 1\n\n  # \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\nfn exponential(n: i32) i32 {\n    var count: i32 = 0;\n    var bas: i32 = 1;\n    var i: i32 = 0;\n    // \u7d30\u80de\u6bcf\u8f2a\u4e00\u5206\u70ba\u4e8c\uff0c\u5f62\u6210\u6578\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-11 \u00a0 \u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u5728\u5be6\u969b\u6f14\u7b97\u6cd5\u4e2d\uff0c\u6307\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4f8b\u5982\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u5176\u905e\u8ff4\u5730\u4e00\u5206\u70ba\u4e8c\uff0c\u7d93\u904e \\(n\\) \u6b21\u5206\u88c2\u5f8c\u505c\u6b62\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def exp_recur(n: int) -> int:\n    \"\"\"\u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 1:\n        return 1\n    return exp_recur(n - 1) + exp_recur(n - 1) + 1\n
    time_complexity.cpp
    /* \u6307\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn expRecur(n: i32) i32 {\n    if (n == 1) return 1;\n    return expRecur(n - 1) + expRecur(n - 1) + 1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6307\u6578\u968e\u589e\u9577\u975e\u5e38\u8fc5\u901f\uff0c\u5728\u7aae\u8209\u6cd5\uff08\u66b4\u529b\u641c\u5c0b\u3001\u56de\u6eaf\u7b49\uff09\u4e2d\u6bd4\u8f03\u5e38\u898b\u3002\u5c0d\u65bc\u8cc7\u6599\u898f\u6a21\u8f03\u5927\u7684\u554f\u984c\uff0c\u6307\u6578\u968e\u662f\u4e0d\u53ef\u63a5\u53d7\u7684\uff0c\u901a\u5e38\u9700\u8981\u4f7f\u7528\u52d5\u614b\u898f\u5283\u6216\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7b49\u4f86\u89e3\u6c7a\u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#5-olog-n","title":"5. \u00a0 \u5c0d\u6578\u968e \\(O(\\log n)\\)","text":"

    \u8207\u6307\u6578\u968e\u76f8\u53cd\uff0c\u5c0d\u6578\u968e\u53cd\u6620\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u60c5\u6cc1\u3002\u8a2d\u8f38\u5165\u8cc7\u6599\u5927\u5c0f\u70ba \\(n\\) \uff0c\u7531\u65bc\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u662f \\(\\log_2 n\\) \uff0c\u5373 \\(2^n\\) \u7684\u53cd\u51fd\u5f0f\u3002

    \u5716 2-12 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6a21\u64ec\u4e86\u201c\u6bcf\u8f2a\u7e2e\u6e1b\u5230\u4e00\u534a\u201d\u7684\u904e\u7a0b\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log_2 n)\\) \uff0c\u7c21\u8a18\u70ba \\(O(\\log n)\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def logarithmic(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\uff09\"\"\"\n    count = 0\n    while n > 1:\n        n = n / 2\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    ### \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    // \u5c0d\u6578\u968e\uff08\u8ff4\u5708\u5be6\u73fe\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-12 \u00a0 \u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u8207\u6307\u6578\u968e\u985e\u4f3c\uff0c\u5c0d\u6578\u968e\u4e5f\u5e38\u51fa\u73fe\u65bc\u905e\u8ff4\u51fd\u5f0f\u4e2d\u3002\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5f62\u6210\u4e86\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(\\log_2 n\\) \u7684\u905e\u8ff4\u6a39\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def log_recur(n: int) -> int:\n    \"\"\"\u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n <= 1:\n        return 0\n    return log_recur(n / 2) + 1\n
    time_complexity.cpp
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.java
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.cs
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint LogRecur(int n) {\n    if (n <= 1) return 0;\n    return LogRecur(n / 2) + 1;\n}\n
    time_complexity.go
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n) {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.ts
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction logRecur(n: number): number {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.dart
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n  if (n <= 1) return 0;\n  return logRecur(n ~/ 2) + 1;\n}\n
    time_complexity.rs
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint logRecur(int n) {\n    if (n <= 1)\n        return 0;\n    return logRecur(n / 2) + 1;\n}\n
    time_complexity.kt
    /* \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun logRecur(n: Int): Int {\n    if (n <= 1)\n        return 0\n    return logRecur(n / 2) + 1\n}\n
    time_complexity.rb
    ### \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef log_recur(n)\n  return 0 unless n > 1\n  log_recur(n / 2) + 1\nend\n
    time_complexity.zig
    // \u5c0d\u6578\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn logRecur(n: i32) i32 {\n    if (n <= 1) return 0;\n    return logRecur(n / 2) + 1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6f14\u7b97\u6cd5\u4e2d\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u591a\u201d\u548c\u201c\u5316\u7e41\u70ba\u7c21\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002\u5b83\u589e\u9577\u7de9\u6162\uff0c\u662f\u50c5\u6b21\u65bc\u5e38\u6578\u968e\u7684\u7406\u60f3\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

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

    \u6e96\u78ba\u4f86\u8aaa\uff0c\u201c\u4e00\u5206\u70ba \\(m\\)\u201d\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(\\log_m n)\\) \u3002\u800c\u900f\u904e\u5c0d\u6578\u63db\u5e95\u516c\u5f0f\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5177\u6709\u4e0d\u540c\u5e95\u6578\u3001\u76f8\u7b49\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff1a

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

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5e95\u6578 \\(m\\) \u53ef\u4ee5\u5728\u4e0d\u5f71\u97ff\u8907\u96dc\u5ea6\u7684\u524d\u63d0\u4e0b\u8f49\u63db\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u7701\u7565\u5e95\u6578 \\(m\\) \uff0c\u5c07\u5c0d\u6578\u968e\u76f4\u63a5\u8a18\u70ba \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_computational_complexity/time_complexity/#6-on-log-n","title":"6. \u00a0 \u7dda\u6027\u5c0d\u6578\u968e \\(O(n \\log n)\\)","text":"

    \u7dda\u6027\u5c0d\u6578\u968e\u5e38\u51fa\u73fe\u65bc\u5de2\u72c0\u8ff4\u5708\u4e2d\uff0c\u5169\u5c64\u8ff4\u5708\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5206\u5225\u70ba \\(O(\\log n)\\) \u548c \\(O(n)\\) \u3002\u76f8\u95dc\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def linear_log_recur(n: int) -> int:\n    \"\"\"\u7dda\u6027\u5c0d\u6578\u968e\"\"\"\n    if n <= 1:\n        return 1\n    count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)\n    for _ in range(n):\n        count += 1\n    return count\n
    time_complexity.cpp
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    /* \u7dda\u6027\u5c0d\u6578\u968e */\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
    ### \u7dda\u6027\u5c0d\u6578\u968e ###\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
    // \u7dda\u6027\u5c0d\u6578\u968e\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-13 \u5c55\u793a\u4e86\u7dda\u6027\u5c0d\u6578\u968e\u7684\u751f\u6210\u65b9\u5f0f\u3002\u4e8c\u5143\u6a39\u7684\u6bcf\u4e00\u5c64\u7684\u64cd\u4f5c\u7e3d\u6578\u90fd\u70ba \\(n\\) \uff0c\u6a39\u5171\u6709 \\(\\log_2 n + 1\\) \u5c64\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u5716 2-13 \u00a0 \u7dda\u6027\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u7b49\u3002

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

    \u968e\u4e58\u968e\u5c0d\u61c9\u6578\u5b78\u4e0a\u7684\u201c\u5168\u6392\u5217\u201d\u554f\u984c\u3002\u7d66\u5b9a \\(n\\) \u500b\u4e92\u4e0d\u91cd\u8907\u7684\u5143\u7d20\uff0c\u6c42\u5176\u6240\u6709\u53ef\u80fd\u7684\u6392\u5217\u65b9\u6848\uff0c\u65b9\u6848\u6578\u91cf\u70ba\uff1a

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

    \u968e\u4e58\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u5be6\u73fe\u3002\u5982\u5716 2-14 \u548c\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u7b2c\u4e00\u5c64\u5206\u88c2\u51fa \\(n\\) \u500b\uff0c\u7b2c\u4e8c\u5c64\u5206\u88c2\u51fa \\(n - 1\\) \u500b\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u7b2c \\(n\\) \u5c64\u6642\u505c\u6b62\u5206\u88c2\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig time_complexity.py
    def factorial_recur(n: int) -> int:\n    \"\"\"\u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\"\"\"\n    if n == 0:\n        return 1\n    count = 0\n    # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in range(n):\n        count += factorial_recur(n - 1)\n    return count\n
    time_complexity.cpp
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.java
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n    if (n == 0)\n        return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.cs
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint FactorialRecur(int n) {\n    if (n == 0) return 1;\n    int count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (int i = 0; i < n; i++) {\n        count += FactorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.go
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n int) int {\n    if n == 0 {\n        return 1\n    }\n    count := 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for i := 0; i < n; i++ {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.swift
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunc factorialRecur(n: Int) -> Int {\n    if n == 0 {\n        return 1\n    }\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0 ..< n {\n        count += factorialRecur(n: n - 1)\n    }\n    return count\n}\n
    time_complexity.js
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n) {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.ts
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfunction factorialRecur(n: number): number {\n    if (n === 0) return 1;\n    let count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (let i = 0; i < n; i++) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    time_complexity.dart
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nint factorialRecur(int n) {\n  if (n == 0) return 1;\n  int count = 0;\n  // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  for (var i = 0; i < n; i++) {\n    count += factorialRecur(n - 1);\n  }\n  return count;\n}\n
    time_complexity.rs
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfn factorial_recur(n: i32) -> i32 {\n    if n == 0 {\n        return 1;\n    }\n    let mut count = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for _ in 0..n {\n        count += factorial_recur(n - 1);\n    }\n    count\n}\n
    time_complexity.c
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\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
    /* \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09 */\nfun factorialRecur(n: Int): Int {\n    if (n == 0)\n        return 1\n    var count = 0\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    for (i in 0..<n) {\n        count += factorialRecur(n - 1)\n    }\n    return count\n}\n
    time_complexity.rb
    ### \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09###\ndef factorial_recur(n)\n  return 1 if n == 0\n\n  count = 0\n  # \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n  (0...n).each { count += factorial_recur(n - 1) }\n\n  count\nend\n
    time_complexity.zig
    // \u968e\u4e58\u968e\uff08\u905e\u8ff4\u5be6\u73fe\uff09\nfn factorialRecur(n: i32) i32 {\n    if (n == 0) return 1;\n    var count: i32 = 0;\n    var i: i32 = 0;\n    // \u5f9e 1 \u500b\u5206\u88c2\u51fa n \u500b\n    while (i < n) : (i += 1) {\n        count += factorialRecur(n - 1);\n    }\n    return count;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 2-14 \u00a0 \u968e\u4e58\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6

    \u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u7576 \\(n \\geq 4\\) \u6642\u6046\u6709 \\(n! > 2^n\\) \uff0c\u6240\u4ee5\u968e\u4e58\u968e\u6bd4\u6307\u6578\u968e\u589e\u9577\u5f97\u66f4\u5feb\uff0c\u5728 \\(n\\) \u8f03\u5927\u6642\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\u6642\u9593\u8907\u96dc\u5ea6","text":"

    \u6f14\u7b97\u6cd5\u7684\u6642\u9593\u6548\u7387\u5f80\u5f80\u4e0d\u662f\u56fa\u5b9a\u7684\uff0c\u800c\u662f\u8207\u8f38\u5165\u8cc7\u6599\u7684\u5206\u4f48\u6709\u95dc\u3002\u5047\u8a2d\u8f38\u5165\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d nums \u7531\u5f9e \\(1\\) \u81f3 \\(n\\) \u7684\u6578\u5b57\u7d44\u6210\uff0c\u6bcf\u500b\u6578\u5b57\u53ea\u51fa\u73fe\u4e00\u6b21\uff1b\u4f46\u5143\u7d20\u9806\u5e8f\u662f\u96a8\u6a5f\u6253\u4e82\u7684\uff0c\u4efb\u52d9\u76ee\u6a19\u662f\u8fd4\u56de\u5143\u7d20 \\(1\\) \u7684\u7d22\u5f15\u3002\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

    • \u7576 nums = [?, ?, ..., 1] \uff0c\u5373\u7576\u672b\u5c3e\u5143\u7d20\u662f \\(1\\) \u6642\uff0c\u9700\u8981\u5b8c\u6574\u8d70\u8a2a\u9663\u5217\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
    • \u7576 nums = [1, ?, ?, ...] \uff0c\u5373\u7576\u9996\u500b\u5143\u7d20\u70ba \\(1\\) \u6642\uff0c\u7121\u8ad6\u9663\u5217\u591a\u9577\u90fd\u4e0d\u9700\u8981\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(\\Omega(1)\\) \u3002

    \u201c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0a\u754c\uff0c\u4f7f\u7528\u5927 \\(O\\) \u8a18\u865f\u8868\u793a\u3002\u76f8\u61c9\u5730\uff0c\u201c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u201d\u5c0d\u61c9\u51fd\u5f0f\u6f38\u8fd1\u4e0b\u754c\uff0c\u7528 \\(\\Omega\\) \u8a18\u865f\u8868\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig worst_best_time_complexity.py
    def random_numbers(n: int) -> list[int]:\n    \"\"\"\u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82\"\"\"\n    # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n    nums = [i for i in range(1, n + 1)]\n    # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    random.shuffle(nums)\n    return nums\n\ndef find_one(nums: list[int]) -> int:\n    \"\"\"\u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\"\"\"\n    for i in range(len(nums)):\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if nums[i] == 1:\n            return i\n    return -1\n
    worst_best_time_complexity.cpp
    /* \u751f\u6210\u4e00\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nvector<int> randomNumbers(int n) {\n    vector<int> nums(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u4f7f\u7528\u7cfb\u7d71\u6642\u9593\u751f\u6210\u96a8\u6a5f\u7a2e\u5b50\n    unsigned seed = chrono::system_clock::now().time_since_epoch().count();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    shuffle(nums.begin(), nums.end(), default_random_engine(seed));\n    return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(vector<int> &nums) {\n    for (int i = 0; i < nums.size(); i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] randomNumbers(int n) {\n    Integer[] nums = new Integer[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int[] nums) {\n    for (int i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint[] RandomNumbers(int n) {\n    int[] nums = new int[n];\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint FindOne(int[] nums) {\n    for (int i = 0; i < nums.Length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n int) []int {\n    nums := make([]int, n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for i := 0; i < n; i++ {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums []int) int {\n    for i := 0; i < len(nums); i++ {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunc randomNumbers(n: Int) -> [Int] {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    var nums = Array(1 ... n)\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle()\n    return nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunc findOne(nums: [Int]) -> Int {\n    for i in nums.indices {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n) {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums) {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfunction randomNumbers(n: number): number[] {\n    const nums = Array(n);\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (let i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfunction findOne(nums: number[]): number {\n    for (let i = 0; i < nums.length; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nList<int> randomNumbers(int n) {\n  final nums = List.filled(n, 0);\n  // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n  for (var i = 0; i < n; i++) {\n    nums[i] = i + 1;\n  }\n  // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle();\n\n  return nums;\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(List<int> nums) {\n  for (var i = 0; i < nums.length; i++) {\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfn random_numbers(n: i32) -> Vec<i32> {\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    let mut nums = (1..=n).collect::<Vec<i32>>();\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    nums.shuffle(&mut thread_rng());\n    nums\n}\n\n/* \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfn find_one(nums: &[i32]) -> Option<usize> {\n    for i in 0..nums.len() {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nint *randomNumbers(int n) {\n    // \u5206\u914d\u5806\u7a4d\u5340\u8a18\u61b6\u9ad4\uff08\u5efa\u7acb\u4e00\u7dad\u53ef\u8b8a\u9577\u9663\u5217\uff1a\u9663\u5217\u4e2d\u5143\u7d20\u6578\u91cf\u70ba n \uff0c\u5143\u7d20\u578b\u5225\u70ba int \uff09\n    int *nums = (int *)malloc(n * sizeof(int));\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (int i = 0; i < n; i++) {\n        nums[i] = i + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nint findOne(int *nums, int n) {\n    for (int i = 0; i < n; i++) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82 */\nfun randomNumbers(n: Int): Array<Int?> {\n    val nums = IntArray(n)\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (i in 0..<n) {\n        nums[i] = i + 1\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\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\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 */\nfun findOne(nums: Array<Int?>): Int {\n    for (i in nums.indices) {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba: 1, 2, ..., n \uff0c\u9806\u5e8f\u88ab\u6253\u4e82 ###\ndef random_numbers(n)\n  # \u751f\u6210\u9663\u5217 nums =: 1, 2, 3, ..., n\n  nums = Array.new(n) { |i| i + 1 }\n  # \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n  nums.shuffle!\nend\n\n### \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15 ###\ndef find_one(nums)\n  for i in 0...nums.length\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n    # \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\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\u500b\u9663\u5217\uff0c\u5143\u7d20\u70ba { 1, 2, ..., n }\uff0c\u9806\u5e8f\u88ab\u6253\u4e82\nfn randomNumbers(comptime n: usize) [n]i32 {\n    var nums: [n]i32 = undefined;\n    // \u751f\u6210\u9663\u5217 nums = { 1, 2, 3, ..., n }\n    for (&nums, 0..) |*num, i| {\n        num.* = @as(i32, @intCast(i)) + 1;\n    }\n    // \u96a8\u6a5f\u6253\u4e82\u9663\u5217\u5143\u7d20\n    const rand = std.crypto.random;\n    rand.shuffle(i32, &nums);\n    return nums;\n}\n\n// \u67e5\u8a62\u9663\u5217 nums \u4e2d\u6578\u5b57 1 \u6240\u5728\u7d22\u5f15\nfn findOne(nums: []i32) i32 {\n    for (nums, 0..) |num, i| {\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u982d\u90e8\u6642\uff0c\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 O(1)\n        // \u7576\u5143\u7d20 1 \u5728\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u9054\u5230\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6 O(n)\n        if (num == 1) return @intCast(i);\n    }\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6211\u5011\u5728\u5be6\u969b\u4e2d\u5f88\u5c11\u4f7f\u7528\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u56e0\u70ba\u901a\u5e38\u53ea\u6709\u5728\u5f88\u5c0f\u6a5f\u7387\u4e0b\u624d\u80fd\u9054\u5230\uff0c\u53ef\u80fd\u6703\u5e36\u4f86\u4e00\u5b9a\u7684\u8aa4\u5c0e\u6027\u3002\u800c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u70ba\u5be6\u7528\uff0c\u56e0\u70ba\u5b83\u7d66\u51fa\u4e86\u4e00\u500b\u6548\u7387\u5b89\u5168\u503c\uff0c\u8b93\u6211\u5011\u53ef\u4ee5\u653e\u5fc3\u5730\u4f7f\u7528\u6f14\u7b97\u6cd5\u3002

    \u5f9e\u4e0a\u8ff0\u793a\u4f8b\u53ef\u4ee5\u770b\u51fa\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ea\u51fa\u73fe\u65bc\u201c\u7279\u6b8a\u7684\u8cc7\u6599\u5206\u4f48\u201d\uff0c\u9019\u4e9b\u60c5\u6cc1\u7684\u51fa\u73fe\u6a5f\u7387\u53ef\u80fd\u5f88\u5c0f\uff0c\u4e26\u4e0d\u80fd\u771f\u5be6\u5730\u53cd\u6620\u6f14\u7b97\u6cd5\u57f7\u884c\u6548\u7387\u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9ad4\u73fe\u6f14\u7b97\u6cd5\u5728\u96a8\u6a5f\u8f38\u5165\u8cc7\u6599\u4e0b\u7684\u57f7\u884c\u6548\u7387\uff0c\u7528 \\(\\Theta\\) \u8a18\u865f\u4f86\u8868\u793a\u3002

    \u5c0d\u65bc\u90e8\u5206\u6f14\u7b97\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u7c21\u55ae\u5730\u63a8\u7b97\u51fa\u96a8\u6a5f\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u5e73\u5747\u60c5\u6cc1\u3002\u6bd4\u5982\u4e0a\u8ff0\u793a\u4f8b\uff0c\u7531\u65bc\u8f38\u5165\u9663\u5217\u662f\u88ab\u6253\u4e82\u7684\uff0c\u56e0\u6b64\u5143\u7d20 \\(1\\) \u51fa\u73fe\u5728\u4efb\u610f\u7d22\u5f15\u7684\u6a5f\u7387\u90fd\u662f\u76f8\u7b49\u7684\uff0c\u90a3\u9ebc\u6f14\u7b97\u6cd5\u7684\u5e73\u5747\u8ff4\u5708\u6b21\u6578\u5c31\u662f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a \\(n / 2\\) \uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(\\Theta(n / 2) = \\Theta(n)\\) \u3002

    \u4f46\u5c0d\u65bc\u8f03\u70ba\u8907\u96dc\u7684\u6f14\u7b97\u6cd5\uff0c\u8a08\u7b97\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u5f80\u5f80\u6bd4\u8f03\u56f0\u96e3\uff0c\u56e0\u70ba\u5f88\u96e3\u5206\u6790\u51fa\u5728\u8cc7\u6599\u5206\u4f48\u4e0b\u7684\u6574\u9ad4\u6578\u5b78\u671f\u671b\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u4f5c\u70ba\u6f14\u7b97\u6cd5\u6548\u7387\u7684\u8a55\u5224\u6a19\u6e96\u3002

    \u70ba\u4ec0\u9ebc\u5f88\u5c11\u770b\u5230 \\(\\Theta\\) \u7b26\u865f\uff1f

    \u53ef\u80fd\u7531\u65bc \\(O\\) \u7b26\u865f\u904e\u65bc\u6717\u6717\u4e0a\u53e3\uff0c\u56e0\u6b64\u6211\u5011\u5e38\u5e38\u4f7f\u7528\u5b83\u4f86\u8868\u793a\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u3002\u4f46\u5f9e\u56b4\u683c\u610f\u7fa9\u4e0a\u8b1b\uff0c\u9019\u7a2e\u505a\u6cd5\u4e26\u4e0d\u898f\u7bc4\u3002\u5728\u672c\u66f8\u548c\u5176\u4ed6\u8cc7\u6599\u4e2d\uff0c\u82e5\u9047\u5230\u985e\u4f3c\u201c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\)\u201d\u7684\u8868\u8ff0\uff0c\u8acb\u5c07\u5176\u76f4\u63a5\u7406\u89e3\u70ba \\(\\Theta(n)\\) \u3002

    "},{"location":"chapter_data_structure/","title":"\u7b2c 3 \u7ae0 \u00a0 \u8cc7\u6599\u7d50\u69cb","text":"

    Abstract

    \u8cc7\u6599\u7d50\u69cb\u5982\u540c\u4e00\u526f\u7a69\u56fa\u800c\u591a\u6a23\u7684\u6846\u67b6\u3002

    \u5b83\u70ba\u8cc7\u6599\u7684\u6709\u5e8f\u7d44\u7e54\u63d0\u4f9b\u4e86\u85cd\u5716\uff0c\u6f14\u7b97\u6cd5\u5f97\u4ee5\u5728\u6b64\u57fa\u790e\u4e0a\u751f\u52d5\u8d77\u4f86\u3002

    "},{"location":"chapter_data_structure/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e
    • 3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225
    • 3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *
    • 3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *
    • 3.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_data_structure/basic_data_types/","title":"3.2 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225","text":"

    \u7576\u8ac7\u53ca\u8a08\u7b97\u6a5f\u4e2d\u7684\u8cc7\u6599\u6642\uff0c\u6211\u5011\u6703\u60f3\u5230\u6587\u5b57\u3001\u5716\u7247\u3001\u5f71\u7247\u3001\u8a9e\u97f3\u30013D \u6a21\u578b\u7b49\u5404\u7a2e\u5f62\u5f0f\u3002\u5118\u7ba1\u9019\u4e9b\u8cc7\u6599\u7684\u7d44\u7e54\u5f62\u5f0f\u5404\u7570\uff0c\u4f46\u5b83\u5011\u90fd\u7531\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u69cb\u6210\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u662f CPU \u53ef\u4ee5\u76f4\u63a5\u9032\u884c\u904b\u7b97\u7684\u578b\u5225\uff0c\u5728\u6f14\u7b97\u6cd5\u4e2d\u76f4\u63a5\u88ab\u4f7f\u7528\uff0c\u4e3b\u8981\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u3002

    • \u6574\u6578\u578b\u5225 byte\u3001short\u3001int\u3001long \u3002
    • \u6d6e\u9ede\u6578\u578b\u5225 float\u3001double \uff0c\u7528\u65bc\u8868\u793a\u5c0f\u6578\u3002
    • \u5b57\u5143\u578b\u5225 char \uff0c\u7528\u65bc\u8868\u793a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u6bcd\u3001\u6a19\u9ede\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002
    • \u5e03\u6797\u578b\u5225 bool \uff0c\u7528\u65bc\u8868\u793a\u201c\u662f\u201d\u8207\u201c\u5426\u201d\u5224\u65b7\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u4ee5\u4e8c\u9032\u4f4d\u5236\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u3002\u4e00\u500b\u4e8c\u9032\u4f4d\u5236\u4f4d\u5373\u70ba \\(1\\) \u4f4d\u5143\u3002\u5728\u7d55\u5927\u591a\u6578\u73fe\u4ee3\u4f5c\u696d\u7cfb\u7d71\u4e2d\uff0c\\(1\\) \u4f4d\u5143\u7d44\uff08byte\uff09\u7531 \\(8\\) \u4f4d\u5143\uff08bit\uff09\u7d44\u6210\u3002

    \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u5176\u4f54\u7528\u7684\u7a7a\u9593\u5927\u5c0f\u3002\u4e0b\u9762\u4ee5 Java \u70ba\u4f8b\u3002

    • \u6574\u6578\u578b\u5225 byte \u4f54\u7528 \\(1\\) \u4f4d\u5143\u7d44 = \\(8\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{8}\\) \u500b\u6578\u5b57\u3002
    • \u6574\u6578\u578b\u5225 int \u4f54\u7528 \\(4\\) \u4f4d\u5143\u7d44 = \\(32\\) \u4f4d\u5143 \uff0c\u53ef\u4ee5\u8868\u793a \\(2^{32}\\) \u500b\u6578\u5b57\u3002

    \u8868 3-1 \u5217\u8209\u4e86 Java \u4e2d\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u3002\u6b64\u8868\u683c\u7121\u9808\u6b7b\u8a18\u786c\u80cc\uff0c\u5927\u81f4\u7406\u89e3\u5373\u53ef\uff0c\u9700\u8981\u6642\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u4f86\u56de\u61b6\u3002

    \u8868 3-1 \u00a0 \u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u4f54\u7528\u7a7a\u9593\u548c\u53d6\u503c\u7bc4\u570d

    \u578b\u5225 \u7b26\u865f \u4f54\u7528\u7a7a\u9593 \u6700\u5c0f\u503c \u6700\u5927\u503c \u9810\u8a2d\u503c \u6574\u6578 byte 1 \u4f4d\u5143\u7d44 \\(-2^7\\) (\\(-128\\)) \\(2^7 - 1\\) (\\(127\\)) \\(0\\) short 2 \u4f4d\u5143\u7d44 \\(-2^{15}\\) \\(2^{15} - 1\\) \\(0\\) int 4 \u4f4d\u5143\u7d44 \\(-2^{31}\\) \\(2^{31} - 1\\) \\(0\\) long 8 \u4f4d\u5143\u7d44 \\(-2^{63}\\) \\(2^{63} - 1\\) \\(0\\) \u6d6e\u9ede\u6578 float 4 \u4f4d\u5143\u7d44 \\(1.175 \\times 10^{-38}\\) \\(3.403 \\times 10^{38}\\) \\(0.0\\text{f}\\) double 8 \u4f4d\u5143\u7d44 \\(2.225 \\times 10^{-308}\\) \\(1.798 \\times 10^{308}\\) \\(0.0\\) \u5b57\u5143 char 2 \u4f4d\u5143\u7d44 \\(0\\) \\(2^{16} - 1\\) \\(0\\) \u5e03\u6797 bool 1 \u4f4d\u5143\u7d44 \\(\\text{false}\\) \\(\\text{true}\\) \\(\\text{false}\\)

    \u8acb\u6ce8\u610f\uff0c\u8868 3-1 \u91dd\u5c0d\u7684\u662f Java \u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u60c5\u6cc1\u3002\u6bcf\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u90fd\u6709\u5404\u81ea\u7684\u8cc7\u6599\u578b\u5225\u5b9a\u7fa9\uff0c\u5b83\u5011\u7684\u4f54\u7528\u7a7a\u9593\u3001\u53d6\u503c\u7bc4\u570d\u548c\u9810\u8a2d\u503c\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002

    • \u5728 Python \u4e2d\uff0c\u6574\u6578\u578b\u5225 int \u53ef\u4ee5\u662f\u4efb\u610f\u5927\u5c0f\uff0c\u53ea\u53d7\u9650\u65bc\u53ef\u7528\u8a18\u61b6\u9ad4\uff1b\u6d6e\u9ede\u6578 float \u662f\u96d9\u7cbe\u5ea6 64 \u4f4d\uff1b\u6c92\u6709 char \u578b\u5225\uff0c\u55ae\u500b\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32 str \u3002
    • C \u548c C++ \u672a\u660e\u78ba\u898f\u5b9a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u5927\u5c0f\uff0c\u800c\u56e0\u5be6\u73fe\u548c\u5e73\u81fa\u5404\u7570\u3002\u8868 3-1 \u9075\u5faa LP64 \u8cc7\u6599\u6a21\u578b\uff0c\u5176\u7528\u65bc\u5305\u62ec Linux \u548c macOS \u5728\u5167\u7684 Unix 64 \u4f4d\u4f5c\u696d\u7cfb\u7d71\u3002
    • \u5b57\u5143 char \u7684\u5927\u5c0f\u5728 C \u548c C++ \u4e2d\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5728\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u53d6\u6c7a\u65bc\u7279\u5b9a\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\uff0c\u8a73\u898b\u201c\u5b57\u5143\u7de8\u78bc\u201d\u7ae0\u7bc0\u3002
    • \u5373\u4f7f\u8868\u793a\u5e03\u6797\u91cf\u50c5\u9700 1 \u4f4d\uff08\\(0\\) \u6216 \\(1\\)\uff09\uff0c\u5b83\u5728\u8a18\u61b6\u9ad4\u4e2d\u901a\u5e38\u4e5f\u5132\u5b58\u70ba 1 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba\u73fe\u4ee3\u8a08\u7b97\u6a5f CPU \u901a\u5e38\u5c07 1 \u4f4d\u5143\u7d44\u4f5c\u70ba\u6700\u5c0f\u5b9a\u5740\u8a18\u61b6\u9ad4\u55ae\u5143\u3002

    \u90a3\u9ebc\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u9593\u6709\u4ec0\u9ebc\u95dc\u806f\u5462\uff1f\u6211\u5011\u77e5\u9053\uff0c\u8cc7\u6599\u7d50\u69cb\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u8207\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002\u9019\u53e5\u8a71\u7684\u4e3b\u8a9e\u662f\u201c\u7d50\u69cb\u201d\u800c\u975e\u201c\u8cc7\u6599\u201d\u3002

    \u5982\u679c\u60f3\u8868\u793a\u201c\u4e00\u6392\u6578\u5b57\u201d\uff0c\u6211\u5011\u81ea\u7136\u6703\u60f3\u5230\u4f7f\u7528\u9663\u5217\u3002\u9019\u662f\u56e0\u70ba\u9663\u5217\u7684\u7dda\u6027\u7d50\u69cb\u53ef\u4ee5\u8868\u793a\u6578\u5b57\u7684\u76f8\u9130\u95dc\u4fc2\u548c\u9806\u5e8f\u95dc\u4fc2\uff0c\u4f46\u81f3\u65bc\u5132\u5b58\u7684\u5167\u5bb9\u662f\u6574\u6578 int\u3001\u5c0f\u6578 float \u9084\u662f\u5b57\u5143 char \uff0c\u5247\u8207\u201c\u8cc7\u6599\u7d50\u69cb\u201d\u7121\u95dc\u3002

    \u63db\u53e5\u8a71\u8aaa\uff0c\u57fa\u672c\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u5167\u5bb9\u578b\u5225\u201d\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u63d0\u4f9b\u4e86\u8cc7\u6599\u7684\u201c\u7d44\u7e54\u65b9\u5f0f\u201d\u3002\u4f8b\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u7528\u76f8\u540c\u7684\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\uff09\u4f86\u5132\u5b58\u8207\u8868\u793a\u4e0d\u540c\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c\u5305\u62ec int\u3001float\u3001char\u3001bool \u7b49\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nnumbers: list[int] = [0] * 5\ndecimals: list[float] = [0.0] * 5\n# Python \u7684\u5b57\u5143\u5be6\u969b\u4e0a\u662f\u9577\u5ea6\u70ba 1 \u7684\u5b57\u4e32\ncharacters: list[str] = ['0'] * 5\nbools: list[bool] = [False] * 5\n# Python \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', False, ListNode(0)]\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[5];\nfloat decimals[5];\nchar characters[5];\nbool bools[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nboolean[] bools = new boolean[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint[] numbers = new int[5];\nfloat[] decimals = new float[5];\nchar[] characters = new char[5];\nbool[] bools = new bool[5];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nvar numbers = [5]int{}\nvar decimals = [5]float64{}\nvar characters = [5]byte{}\nvar bools = [5]bool{}\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u9663\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\nconst array = [0, 0.0, 'a', false];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nconst numbers: number[] = [];\nconst characters: string[] = [];\nconst bools: boolean[] = [];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\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\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nint numbers[10];\nfloat decimals[10];\nchar characters[10];\nbool bools[10];\n
    // \u4f7f\u7528\u591a\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u4f86\u521d\u59cb\u5316\u9663\u5217\nval numbers = IntArray(5)\nval decinals = FloatArray(5)\nval characters = CharArray(5)\nval bools = BooleanArray(5)\n
    # Ruby \u7684\u4e32\u5217\u53ef\u4ee5\u81ea\u7531\u5132\u5b58\u5404\u7a2e\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u7269\u4ef6\u5f15\u7528\ndata = [0, 0.0, 'a', false, ListNode(0)]\n
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_data_structure/character_encoding/","title":"3.4 \u00a0 \u5b57\u5143\u7de8\u78bc *","text":"

    \u5728\u8a08\u7b97\u6a5f\u4e2d\uff0c\u6240\u6709\u8cc7\u6599\u90fd\u662f\u4ee5\u4e8c\u9032\u4f4d\u5236\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\uff0c\u5b57\u5143 char \u4e5f\u4e0d\u4f8b\u5916\u3002\u70ba\u4e86\u8868\u793a\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5efa\u7acb\u4e00\u5957\u201c\u5b57\u7b26\u96c6\u201d\uff0c\u898f\u5b9a\u6bcf\u500b\u5b57\u5143\u548c\u4e8c\u9032\u4f4d\u5236\u6578\u4e4b\u9593\u7684\u4e00\u4e00\u5c0d\u61c9\u95dc\u4fc2\u3002\u6709\u4e86\u5b57\u7b26\u96c6\u4e4b\u5f8c\uff0c\u8a08\u7b97\u6a5f\u5c31\u53ef\u4ee5\u900f\u904e\u67e5\u8868\u5b8c\u6210\u4e8c\u9032\u4f4d\u5236\u6578\u5230\u5b57\u5143\u7684\u8f49\u63db\u3002

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

    ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u5b57\u7b26\u96c6\uff0c\u5176\u5168\u7a31\u70ba American Standard Code for Information Interchange\uff08\u7f8e\u570b\u6a19\u6e96\u8cc7\u8a0a\u4ea4\u63db\u7a0b\u5f0f\u78bc\uff09\u3002\u5b83\u4f7f\u7528 7 \u4f4d\u4e8c\u9032\u4f4d\u5236\u6578\uff08\u4e00\u500b\u4f4d\u5143\u7d44\u7684\u4f4e 7 \u4f4d\uff09\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6700\u591a\u80fd\u5920\u8868\u793a 128 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002\u5982\u5716 3-6 \u6240\u793a\uff0cASCII \u78bc\u5305\u62ec\u82f1\u6587\u5b57\u6bcd\u7684\u5927\u5c0f\u5beb\u3001\u6578\u5b57 0 ~ 9\u3001\u4e00\u4e9b\u6a19\u9ede\u7b26\u865f\uff0c\u4ee5\u53ca\u4e00\u4e9b\u63a7\u5236\u5b57\u5143\uff08\u5982\u63db\u884c\u7b26\u548c\u88fd\u8868\u7b26\uff09\u3002

    \u5716 3-6 \u00a0 ASCII \u78bc

    \u7136\u800c\uff0cASCII \u78bc\u50c5\u80fd\u5920\u8868\u793a\u82f1\u6587\u3002\u96a8\u8457\u8a08\u7b97\u6a5f\u7684\u5168\u7403\u5316\uff0c\u8a95\u751f\u4e86\u4e00\u7a2e\u80fd\u5920\u8868\u793a\u66f4\u591a\u8a9e\u8a00\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u5b83\u5728 ASCII \u7684 7 \u4f4d\u57fa\u790e\u4e0a\u64f4\u5c55\u5230 8 \u4f4d\uff0c\u80fd\u5920\u8868\u793a 256 \u500b\u4e0d\u540c\u7684\u5b57\u5143\u3002

    \u5728\u4e16\u754c\u7bc4\u570d\u5167\uff0c\u9678\u7e8c\u51fa\u73fe\u4e86\u4e00\u6279\u9069\u7528\u65bc\u4e0d\u540c\u5730\u5340\u7684 EASCII \u5b57\u7b26\u96c6\u3002\u9019\u4e9b\u5b57\u7b26\u96c6\u7684\u524d 128 \u500b\u5b57\u5143\u7d71\u4e00\u70ba ASCII \u78bc\uff0c\u5f8c 128 \u500b\u5b57\u5143\u5b9a\u7fa9\u4e0d\u540c\uff0c\u4ee5\u9069\u61c9\u4e0d\u540c\u8a9e\u8a00\u7684\u9700\u6c42\u3002

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

    \u5f8c\u4f86\u4eba\u5011\u767c\u73fe\uff0cEASCII \u78bc\u4ecd\u7136\u7121\u6cd5\u6eff\u8db3\u8a31\u591a\u8a9e\u8a00\u7684\u5b57\u5143\u6578\u91cf\u8981\u6c42\u3002\u6bd4\u5982\u6f22\u5b57\u6709\u8fd1\u5341\u842c\u500b\uff0c\u5149\u65e5\u5e38\u4f7f\u7528\u7684\u5c31\u6709\u5e7e\u5343\u500b\u3002\u4e2d\u570b\u570b\u5bb6\u6a19\u6e96\u7e3d\u5c40\u65bc 1980 \u5e74\u91cb\u51fa\u4e86 GB2312 \u5b57\u7b26\u96c6\uff0c\u5176\u6536\u9304\u4e86 6763 \u500b\u6f22\u5b57\uff0c\u57fa\u672c\u6eff\u8db3\u4e86\u6f22\u5b57\u7684\u8a08\u7b97\u6a5f\u8655\u7406\u9700\u8981\u3002

    \u7136\u800c\uff0cGB2312 \u7121\u6cd5\u8655\u7406\u90e8\u5206\u7f55\u898b\u5b57\u548c\u7e41\u9ad4\u5b57\u3002GBK \u5b57\u7b26\u96c6\u662f\u5728 GB2312 \u7684\u57fa\u790e\u4e0a\u64f4\u5c55\u5f97\u5230\u7684\uff0c\u5b83\u5171\u6536\u9304\u4e86 21886 \u500b\u6f22\u5b57\u3002\u5728 GBK \u7684\u7de8\u78bc\u65b9\u6848\u4e2d\uff0cASCII \u5b57\u5143\u4f7f\u7528\u4e00\u500b\u4f4d\u5143\u7d44\u8868\u793a\uff0c\u6f22\u5b57\u4f7f\u7528\u5169\u500b\u4f4d\u5143\u7d44\u8868\u793a\u3002

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

    \u96a8\u8457\u8a08\u7b97\u6a5f\u6280\u8853\u7684\u84ec\u52c3\u767c\u5c55\uff0c\u5b57\u7b26\u96c6\u8207\u7de8\u78bc\u6a19\u6e96\u767e\u82b1\u9f4a\u653e\uff0c\u800c\u9019\u5e36\u4f86\u4e86\u8a31\u591a\u554f\u984c\u3002\u4e00\u65b9\u9762\uff0c\u9019\u4e9b\u5b57\u7b26\u96c6\u4e00\u822c\u53ea\u5b9a\u7fa9\u4e86\u7279\u5b9a\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u7121\u6cd5\u5728\u591a\u8a9e\u8a00\u74b0\u5883\u4e0b\u6b63\u5e38\u5de5\u4f5c\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u540c\u4e00\u7a2e\u8a9e\u8a00\u5b58\u5728\u591a\u7a2e\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u5982\u679c\u5169\u81fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u7684\u662f\u4e0d\u540c\u7684\u7de8\u78bc\u6a19\u6e96\uff0c\u5247\u5728\u8cc7\u8a0a\u50b3\u905e\u6642\u5c31\u6703\u51fa\u73fe\u4e82\u78bc\u3002

    \u90a3\u500b\u6642\u4ee3\u7684\u7814\u7a76\u4eba\u54e1\u5c31\u5728\u60f3\uff1a\u5982\u679c\u63a8\u51fa\u4e00\u500b\u8db3\u5920\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\uff0c\u5c07\u4e16\u754c\u7bc4\u570d\u5167\u7684\u6240\u6709\u8a9e\u8a00\u548c\u7b26\u865f\u90fd\u6536\u9304\u5176\u4e2d\uff0c\u4e0d\u5c31\u53ef\u4ee5\u89e3\u6c7a\u8de8\u8a9e\u8a00\u74b0\u5883\u548c\u4e82\u78bc\u554f\u984c\u4e86\u55ce\uff1f\u5728\u9019\u7a2e\u60f3\u6cd5\u7684\u9a45\u52d5\u4e0b\uff0c\u4e00\u500b\u5927\u800c\u5168\u7684\u5b57\u7b26\u96c6 Unicode \u61c9\u904b\u800c\u751f\u3002

    Unicode \u7684\u4e2d\u6587\u540d\u7a31\u70ba\u201c\u7d71\u4e00\u78bc\u201d\uff0c\u7406\u8ad6\u4e0a\u80fd\u5bb9\u7d0d 100 \u591a\u842c\u500b\u5b57\u5143\u3002\u5b83\u81f4\u529b\u65bc\u5c07\u5168\u7403\u7bc4\u570d\u5167\u7684\u5b57\u5143\u7d0d\u5165\u7d71\u4e00\u7684\u5b57\u7b26\u96c6\u4e4b\u4e2d\uff0c\u63d0\u4f9b\u4e00\u7a2e\u901a\u7528\u7684\u5b57\u7b26\u96c6\u4f86\u8655\u7406\u548c\u986f\u793a\u5404\u7a2e\u8a9e\u8a00\u6587\u5b57\uff0c\u6e1b\u5c11\u56e0\u70ba\u7de8\u78bc\u6a19\u6e96\u4e0d\u540c\u800c\u7522\u751f\u7684\u4e82\u78bc\u554f\u984c\u3002

    \u81ea 1991 \u5e74\u91cb\u51fa\u4ee5\u4f86\uff0cUnicode \u4e0d\u65b7\u64f4\u5145\u65b0\u7684\u8a9e\u8a00\u8207\u5b57\u5143\u3002\u622a\u81f3 2022 \u5e74 9 \u6708\uff0cUnicode \u5df2\u7d93\u5305\u542b 149186 \u500b\u5b57\u5143\uff0c\u5305\u62ec\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\u3001\u7b26\u865f\u751a\u81f3\u8868\u60c5\u7b26\u865f\u7b49\u3002\u5728\u9f90\u5927\u7684 Unicode \u5b57\u7b26\u96c6\u4e2d\uff0c\u5e38\u7528\u7684\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff0c\u6709\u4e9b\u751f\u50fb\u7684\u5b57\u5143\u4f54\u7528 3 \u4f4d\u5143\u7d44\u751a\u81f3 4 \u4f4d\u5143\u7d44\u3002

    Unicode \u662f\u4e00\u7a2e\u901a\u7528\u5b57\u7b26\u96c6\uff0c\u672c\u8cea\u4e0a\u662f\u7d66\u6bcf\u500b\u5b57\u5143\u5206\u914d\u4e00\u500b\u7de8\u865f\uff08\u7a31\u70ba\u201c\u78bc\u9ede\u201d\uff09\uff0c\u4f46\u5b83\u4e26\u6c92\u6709\u898f\u5b9a\u5728\u8a08\u7b97\u6a5f\u4e2d\u5982\u4f55\u5132\u5b58\u9019\u4e9b\u5b57\u5143\u78bc\u9ede\u3002\u6211\u5011\u4e0d\u7981\u6703\u554f\uff1a\u7576\u591a\u7a2e\u9577\u5ea6\u7684 Unicode \u78bc\u9ede\u540c\u6642\u51fa\u73fe\u5728\u4e00\u500b\u6587\u5b57\u4e2d\u6642\uff0c\u7cfb\u7d71\u5982\u4f55\u89e3\u6790\u5b57\u5143\uff1f\u4f8b\u5982\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u7684\u7de8\u78bc\uff0c\u7cfb\u7d71\u5982\u4f55\u78ba\u8a8d\u5b83\u662f\u4e00\u500b 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\u9084\u662f\u5169\u500b 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff1f

    \u5c0d\u65bc\u4ee5\u4e0a\u554f\u984c\uff0c\u4e00\u7a2e\u76f4\u63a5\u7684\u89e3\u6c7a\u65b9\u6848\u662f\u5c07\u6240\u6709\u5b57\u5143\u5132\u5b58\u70ba\u7b49\u9577\u7684\u7de8\u78bc\u3002\u5982\u5716 3-7 \u6240\u793a\uff0c\u201cHello\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff0c\u201c\u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u9ad8\u4f4d\u586b 0 \u5c07\u201cHello \u6f14\u7b97\u6cd5\u201d\u4e2d\u7684\u6240\u6709\u5b57\u5143\u90fd\u7de8\u78bc\u70ba 2 \u4f4d\u5143\u7d44\u9577\u5ea6\u3002\u9019\u6a23\u7cfb\u7d71\u5c31\u53ef\u4ee5\u6bcf\u9694 2 \u4f4d\u5143\u7d44\u89e3\u6790\u4e00\u500b\u5b57\u5143\uff0c\u6062\u5fa9\u9019\u500b\u77ed\u8a9e\u7684\u5167\u5bb9\u4e86\u3002

    \u5716 3-7 \u00a0 Unicode \u7de8\u78bc\u793a\u4f8b

    \u7136\u800c ASCII \u78bc\u5df2\u7d93\u5411\u6211\u5011\u8b49\u660e\uff0c\u7de8\u78bc\u82f1\u6587\u53ea\u9700 1 \u4f4d\u5143\u7d44\u3002\u82e5\u63a1\u7528\u4e0a\u8ff0\u65b9\u6848\uff0c\u82f1\u6587\u6587\u5b57\u4f54\u7528\u7a7a\u9593\u7684\u5927\u5c0f\u5c07\u6703\u662f ASCII \u7de8\u78bc\u4e0b\u7684\u5169\u500d\uff0c\u975e\u5e38\u6d6a\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u66f4\u52a0\u9ad8\u6548\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002

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

    \u76ee\u524d\uff0cUTF-8 \u5df2\u6210\u70ba\u570b\u969b\u4e0a\u4f7f\u7528\u6700\u5ee3\u6cdb\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\u3002\u5b83\u662f\u4e00\u7a2e\u53ef\u8b8a\u9577\u5ea6\u7684\u7de8\u78bc\uff0c\u4f7f\u7528 1 \u5230 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\uff0c\u6839\u64da\u5b57\u5143\u7684\u8907\u96dc\u6027\u800c\u8b8a\u3002ASCII \u5b57\u5143\u53ea\u9700 1 \u4f4d\u5143\u7d44\uff0c\u62c9\u4e01\u5b57\u6bcd\u548c\u5e0c\u81d8\u5b57\u6bcd\u9700\u8981 2 \u4f4d\u5143\u7d44\uff0c\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u5143\u9700\u8981 3 \u4f4d\u5143\u7d44\uff0c\u5176\u4ed6\u7684\u4e00\u4e9b\u751f\u50fb\u5b57\u5143\u9700\u8981 4 \u4f4d\u5143\u7d44\u3002

    UTF-8 \u7684\u7de8\u78bc\u898f\u5247\u4e26\u4e0d\u8907\u96dc\uff0c\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u5c0d\u65bc\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0c\u5c07\u6700\u9ad8\u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff0c\u5176\u9918 7 \u4f4d\u8a2d\u5b9a\u70ba Unicode \u78bc\u9ede\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0cASCII \u5b57\u5143\u5728 Unicode \u5b57\u7b26\u96c6\u4e2d\u4f54\u64da\u4e86\u524d 128 \u500b\u78bc\u9ede\u3002\u4e5f\u5c31\u662f\u8aaa\uff0cUTF-8 \u7de8\u78bc\u53ef\u4ee5\u5411\u4e0b\u76f8\u5bb9 ASCII \u78bc\u3002\u9019\u610f\u5473\u8457\u6211\u5011\u53ef\u4ee5\u4f7f\u7528 UTF-8 \u4f86\u89e3\u6790\u5e74\u4ee3\u4e45\u9060\u7684 ASCII \u78bc\u6587\u5b57\u3002
    • \u5c0d\u65bc\u9577\u5ea6\u70ba \\(n\\) \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff08\u5176\u4e2d \\(n > 1\\)\uff09\uff0c\u5c07\u9996\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u7b2c \\(n + 1\\) \u4f4d\u8a2d\u5b9a\u70ba \\(0\\) \uff1b\u5f9e\u7b2c\u4e8c\u500b\u4f4d\u5143\u7d44\u958b\u59cb\uff0c\u5c07\u6bcf\u500b\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \uff1b\u5176\u9918\u6240\u6709\u4f4d\u7528\u65bc\u586b\u5145\u5b57\u5143\u7684 Unicode \u78bc\u9ede\u3002

    \u5716 3-8 \u5c55\u793a\u4e86\u201cHello\u6f14\u7b97\u6cd5\u201d\u5c0d\u61c9\u7684 UTF-8 \u7de8\u78bc\u3002\u89c0\u5bdf\u767c\u73fe\uff0c\u7531\u65bc\u6700\u9ad8 \\(n\\) \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(1\\) \uff0c\u56e0\u6b64\u7cfb\u7d71\u53ef\u4ee5\u900f\u904e\u8b80\u53d6\u6700\u9ad8\u4f4d \\(1\\) \u7684\u500b\u6578\u4f86\u89e3\u6790\u51fa\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(n\\) \u3002

    \u4f46\u70ba\u4ec0\u9ebc\u8981\u5c07\u5176\u9918\u6240\u6709\u4f4d\u5143\u7d44\u7684\u9ad8 2 \u4f4d\u90fd\u8a2d\u5b9a\u70ba \\(10\\) \u5462\uff1f\u5be6\u969b\u4e0a\uff0c\u9019\u500b \\(10\\) \u80fd\u5920\u8d77\u5230\u6821\u9a57\u7b26\u7684\u4f5c\u7528\u3002\u5047\u8a2d\u7cfb\u7d71\u5f9e\u4e00\u500b\u932f\u8aa4\u7684\u4f4d\u5143\u7d44\u958b\u59cb\u89e3\u6790\u6587\u5b57\uff0c\u4f4d\u5143\u7d44\u982d\u90e8\u7684 \\(10\\) \u80fd\u5920\u5e6b\u52a9\u7cfb\u7d71\u5feb\u901f\u5224\u65b7\u51fa\u7570\u5e38\u3002

    \u4e4b\u6240\u4ee5\u5c07 \\(10\\) \u7576\u4f5c\u6821\u9a57\u7b26\uff0c\u662f\u56e0\u70ba\u5728 UTF-8 \u7de8\u78bc\u898f\u5247\u4e0b\uff0c\u4e0d\u53ef\u80fd\u6709\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \u3002\u9019\u500b\u7d50\u8ad6\u53ef\u4ee5\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\uff1a\u5047\u8a2d\u4e00\u500b\u5b57\u5143\u7684\u6700\u9ad8\u5169\u4f4d\u662f \\(10\\) \uff0c\u8aaa\u660e\u8a72\u5b57\u5143\u7684\u9577\u5ea6\u70ba \\(1\\) \uff0c\u5c0d\u61c9 ASCII \u78bc\u3002\u800c ASCII \u78bc\u7684\u6700\u9ad8\u4f4d\u61c9\u8a72\u662f \\(0\\) \uff0c\u8207\u5047\u8a2d\u77db\u76fe\u3002

    \u5716 3-8 \u00a0 UTF-8 \u7de8\u78bc\u793a\u4f8b

    \u9664\u4e86 UTF-8 \u4e4b\u5916\uff0c\u5e38\u898b\u7684\u7de8\u78bc\u65b9\u5f0f\u9084\u5305\u62ec\u4ee5\u4e0b\u5169\u7a2e\u3002

    • UTF-16 \u7de8\u78bc\uff1a\u4f7f\u7528 2 \u6216 4 \u4f4d\u5143\u7d44\u4f86\u8868\u793a\u4e00\u500b\u5b57\u5143\u3002\u6240\u6709\u7684 ASCII \u5b57\u5143\u548c\u5e38\u7528\u7684\u975e\u82f1\u6587\u5b57\u5143\uff0c\u90fd\u7528 2 \u4f4d\u5143\u7d44\u8868\u793a\uff1b\u5c11\u6578\u5b57\u7b26\u9700\u8981\u7528\u5230 4 \u4f4d\u5143\u7d44\u8868\u793a\u3002\u5c0d\u65bc 2 \u4f4d\u5143\u7d44\u7684\u5b57\u5143\uff0cUTF-16 \u7de8\u78bc\u8207 Unicode \u78bc\u9ede\u76f8\u7b49\u3002
    • UTF-32 \u7de8\u78bc\uff1a\u6bcf\u500b\u5b57\u5143\u90fd\u4f7f\u7528 4 \u4f4d\u5143\u7d44\u3002\u9019\u610f\u5473\u8457 UTF-32 \u6bd4 UTF-8 \u548c UTF-16 \u66f4\u4f54\u7528\u7a7a\u9593\uff0c\u7279\u5225\u662f\u5c0d\u65bc ASCII \u5b57\u5143\u4f54\u6bd4\u8f03\u9ad8\u7684\u6587\u5b57\u3002

    \u5f9e\u5132\u5b58\u7a7a\u9593\u4f54\u7528\u7684\u89d2\u5ea6\u770b\uff0c\u4f7f\u7528 UTF-8 \u8868\u793a\u82f1\u6587\u5b57\u5143\u975e\u5e38\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 1 \u4f4d\u5143\u7d44\uff1b\u4f7f\u7528 UTF-16 \u7de8\u78bc\u67d0\u4e9b\u975e\u82f1\u6587\u5b57\u5143\uff08\u4f8b\u5982\u4e2d\u6587\uff09\u6703\u66f4\u52a0\u9ad8\u6548\uff0c\u56e0\u70ba\u5b83\u50c5\u9700 2 \u4f4d\u5143\u7d44\uff0c\u800c UTF-8 \u53ef\u80fd\u9700\u8981 3 \u4f4d\u5143\u7d44\u3002

    \u5f9e\u76f8\u5bb9\u6027\u7684\u89d2\u5ea6\u770b\uff0cUTF-8 \u7684\u901a\u7528\u6027\u6700\u4f73\uff0c\u8a31\u591a\u5de5\u5177\u548c\u5eab\u512a\u5148\u652f\u6301 UTF-8 \u3002

    "},{"location":"chapter_data_structure/character_encoding/#345","title":"3.4.5 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc","text":"

    \u5c0d\u65bc\u4ee5\u5f80\u7684\u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\uff0c\u7a0b\u5f0f\u57f7\u884c\u4e2d\u7684\u5b57\u4e32\u90fd\u63a1\u7528 UTF-16 \u6216 UTF-32 \u9019\u985e\u7b49\u9577\u7de8\u78bc\u3002\u5728\u7b49\u9577\u7de8\u78bc\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b57\u4e32\u770b\u4f5c\u9663\u5217\u4f86\u8655\u7406\uff0c\u9019\u7a2e\u505a\u6cd5\u5177\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

    • \u96a8\u6a5f\u8a2a\u554f\uff1aUTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u9032\u884c\u96a8\u6a5f\u8a2a\u554f\u3002UTF-8 \u662f\u4e00\u7a2e\u8b8a\u9577\u7de8\u78bc\uff0c\u8981\u60f3\u627e\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u6211\u5011\u9700\u8981\u5f9e\u5b57\u4e32\u7684\u958b\u59cb\u8655\u8d70\u8a2a\u5230\u7b2c \\(i\\) \u500b\u5b57\u5143\uff0c\u9019\u9700\u8981 \\(O(n)\\) \u7684\u6642\u9593\u3002
    • \u5b57\u5143\u8a08\u6578\uff1a\u8207\u96a8\u6a5f\u8a2a\u554f\u985e\u4f3c\uff0c\u8a08\u7b97 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u4e5f\u662f \\(O(1)\\) \u7684\u64cd\u4f5c\u3002\u4f46\u662f\uff0c\u8a08\u7b97 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u7684\u9577\u5ea6\u9700\u8981\u8d70\u8a2a\u6574\u500b\u5b57\u4e32\u3002
    • \u5b57\u4e32\u64cd\u4f5c\uff1a\u5728 UTF-16 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u5f88\u591a\u5b57\u4e32\u64cd\u4f5c\uff08\u5982\u5206\u5272\u3001\u9023\u7dda\u3001\u63d2\u5165\u3001\u522a\u9664\u7b49\uff09\u66f4\u5bb9\u6613\u9032\u884c\u3002\u5728 UTF-8 \u7de8\u78bc\u7684\u5b57\u4e32\u4e0a\uff0c\u9032\u884c\u9019\u4e9b\u64cd\u4f5c\u901a\u5e38\u9700\u8981\u984d\u5916\u7684\u8a08\u7b97\uff0c\u4ee5\u78ba\u4fdd\u4e0d\u6703\u7522\u751f\u7121\u6548\u7684 UTF-8 \u7de8\u78bc\u3002

    \u5be6\u969b\u4e0a\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5b57\u5143\u7de8\u78bc\u65b9\u6848\u8a2d\u8a08\u662f\u4e00\u500b\u5f88\u6709\u8da3\u7684\u8a71\u984c\uff0c\u6d89\u53ca\u8a31\u591a\u56e0\u7d20\u3002

    • Java \u7684 String \u578b\u5225\u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\u3002\u9019\u662f\u56e0\u70ba Java \u8a9e\u8a00\u8a2d\u8a08\u4e4b\u521d\uff0c\u4eba\u5011\u8a8d\u70ba 16 \u4f4d\u8db3\u4ee5\u8868\u793a\u6240\u6709\u53ef\u80fd\u7684\u5b57\u5143\u3002\u7136\u800c\uff0c\u9019\u662f\u4e00\u500b\u4e0d\u6b63\u78ba\u7684\u5224\u65b7\u3002\u5f8c\u4f86 Unicode \u898f\u7bc4\u64f4\u5c55\u5230\u4e86\u8d85\u904e 16 \u4f4d\uff0c\u6240\u4ee5 Java \u4e2d\u7684\u5b57\u5143\u73fe\u5728\u53ef\u80fd\u7531\u4e00\u5c0d 16 \u4f4d\u7684\u503c\uff08\u7a31\u70ba\u201c\u4ee3\u7406\u5c0d\u201d\uff09\u8868\u793a\u3002
    • JavaScript \u548c TypeScript \u7684\u5b57\u4e32\u4f7f\u7528 UTF-16 \u7de8\u78bc\u7684\u539f\u56e0\u8207 Java \u985e\u4f3c\u3002\u7576 1995 \u5e74 Netscape \u516c\u53f8\u9996\u6b21\u63a8\u51fa JavaScript \u8a9e\u8a00\u6642\uff0cUnicode \u9084\u8655\u65bc\u767c\u5c55\u65e9\u671f\uff0c\u90a3\u6642\u5019\u4f7f\u7528 16 \u4f4d\u7684\u7de8\u78bc\u5c31\u8db3\u4ee5\u8868\u793a\u6240\u6709\u7684 Unicode \u5b57\u5143\u4e86\u3002
    • C# \u4f7f\u7528 UTF-16 \u7de8\u78bc\uff0c\u4e3b\u8981\u662f\u56e0\u70ba .NET \u5e73\u81fa\u662f\u7531 Microsoft \u8a2d\u8a08\u7684\uff0c\u800c Microsoft \u7684\u5f88\u591a\u6280\u8853\uff08\u5305\u62ec Windows \u4f5c\u696d\u7cfb\u7d71\uff09\u90fd\u5ee3\u6cdb\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002

    \u7531\u65bc\u4ee5\u4e0a\u7a0b\u5f0f\u8a9e\u8a00\u5c0d\u5b57\u5143\u6578\u91cf\u7684\u4f4e\u4f30\uff0c\u5b83\u5011\u4e0d\u5f97\u4e0d\u63a1\u53d6\u201c\u4ee3\u7406\u5c0d\u201d\u7684\u65b9\u5f0f\u4f86\u8868\u793a\u8d85\u904e 16 \u4f4d\u9577\u5ea6\u7684 Unicode \u5b57\u5143\u3002\u9019\u662f\u4e00\u500b\u4e0d\u5f97\u5df2\u70ba\u4e4b\u7684\u7121\u5948\u4e4b\u8209\u3002\u4e00\u65b9\u9762\uff0c\u5305\u542b\u4ee3\u7406\u5c0d\u7684\u5b57\u4e32\u4e2d\uff0c\u4e00\u500b\u5b57\u5143\u53ef\u80fd\u4f54\u7528 2 \u4f4d\u5143\u7d44\u6216 4 \u4f4d\u5143\u7d44\uff0c\u5f9e\u800c\u55aa\u5931\u4e86\u7b49\u9577\u7de8\u78bc\u7684\u512a\u52e2\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u8655\u7406\u4ee3\u7406\u5c0d\u9700\u8981\u984d\u5916\u589e\u52a0\u7a0b\u5f0f\u78bc\uff0c\u9019\u63d0\u9ad8\u4e86\u7a0b\u5f0f\u8a2d\u8a08\u7684\u8907\u96dc\u6027\u548c\u9664\u932f\u96e3\u5ea6\u3002

    \u51fa\u65bc\u4ee5\u4e0a\u539f\u56e0\uff0c\u90e8\u5206\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u51fa\u4e86\u4e00\u4e9b\u4e0d\u540c\u7684\u7de8\u78bc\u65b9\u6848\u3002

    • Python \u4e2d\u7684 str \u4f7f\u7528 Unicode \u7de8\u78bc\uff0c\u4e26\u63a1\u7528\u4e00\u7a2e\u9748\u6d3b\u7684\u5b57\u4e32\u8868\u793a\uff0c\u5132\u5b58\u7684\u5b57\u5143\u9577\u5ea6\u53d6\u6c7a\u65bc\u5b57\u4e32\u4e2d\u6700\u5927\u7684 Unicode \u78bc\u9ede\u3002\u82e5\u5b57\u4e32\u4e2d\u5168\u90e8\u662f ASCII \u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 1 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u5b57\u5143\u8d85\u51fa\u4e86 ASCII \u7bc4\u570d\uff0c\u4f46\u5168\u90e8\u5728\u57fa\u672c\u591a\u8a9e\u8a00\u5e73\u9762\uff08BMP\uff09\u5167\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 2 \u4f4d\u5143\u7d44\uff1b\u5982\u679c\u6709\u8d85\u51fa BMP \u7684\u5b57\u5143\uff0c\u5247\u6bcf\u500b\u5b57\u5143\u4f54\u7528 4 \u4f4d\u5143\u7d44\u3002
    • Go \u8a9e\u8a00\u7684 string \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Go \u8a9e\u8a00\u9084\u63d0\u4f9b\u4e86 rune \u578b\u5225\uff0c\u5b83\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002
    • Rust \u8a9e\u8a00\u7684 str \u548c String \u578b\u5225\u5728\u5167\u90e8\u4f7f\u7528 UTF-8 \u7de8\u78bc\u3002Rust \u4e5f\u63d0\u4f9b\u4e86 char \u578b\u5225\uff0c\u7528\u65bc\u8868\u793a\u55ae\u500b Unicode \u78bc\u9ede\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4ee5\u4e0a\u8a0e\u8ad6\u7684\u90fd\u662f\u5b57\u4e32\u5728\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u9019\u548c\u5b57\u4e32\u5982\u4f55\u5728\u6a94\u6848\u4e2d\u5132\u5b58\u6216\u5728\u7db2\u8def\u4e2d\u50b3\u8f38\u662f\u4e0d\u540c\u7684\u554f\u984c\u3002\u5728\u6a94\u6848\u5132\u5b58\u6216\u7db2\u8def\u50b3\u8f38\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u5b57\u4e32\u7de8\u78bc\u70ba UTF-8 \u683c\u5f0f\uff0c\u4ee5\u9054\u5230\u6700\u512a\u7684\u76f8\u5bb9\u6027\u548c\u7a7a\u9593\u6548\u7387\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/","title":"3.1 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5206\u985e","text":"

    \u5e38\u898b\u7684\u8cc7\u6599\u7d50\u69cb\u5305\u62ec\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\uff0c\u5b83\u5011\u53ef\u4ee5\u5f9e\u201c\u908f\u8f2f\u7d50\u69cb\u201d\u548c\u201c\u7269\u7406\u7d50\u69cb\u201d\u5169\u500b\u7dad\u5ea6\u9032\u884c\u5206\u985e\u3002

    "},{"location":"chapter_data_structure/classification_of_data_structure/#311","title":"3.1.1 \u00a0 \u908f\u8f2f\u7d50\u69cb\uff1a\u7dda\u6027\u8207\u975e\u7dda\u6027","text":"

    \u908f\u8f2f\u7d50\u69cb\u63ed\u793a\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\u3002\u5728\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u8cc7\u6599\u6309\u7167\u4e00\u5b9a\u9806\u5e8f\u6392\u5217\uff0c\u9ad4\u73fe\u4e86\u8cc7\u6599\u4e4b\u9593\u7684\u7dda\u6027\u95dc\u4fc2\uff1b\u800c\u5728\u6a39\u4e2d\uff0c\u8cc7\u6599\u5f9e\u9802\u90e8\u5411\u4e0b\u6309\u5c64\u6b21\u6392\u5217\uff0c\u8868\u73fe\u51fa\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff1b\u5716\u5247\u7531\u7bc0\u9ede\u548c\u908a\u69cb\u6210\uff0c\u53cd\u6620\u4e86\u8907\u96dc\u7684\u7db2\u8def\u95dc\u4fc2\u3002

    \u5982\u5716 3-1 \u6240\u793a\uff0c\u908f\u8f2f\u7d50\u69cb\u53ef\u5206\u70ba\u201c\u7dda\u6027\u201d\u548c\u201c\u975e\u7dda\u6027\u201d\u5169\u5927\u985e\u3002\u7dda\u6027\u7d50\u69cb\u6bd4\u8f03\u76f4\u89c0\uff0c\u6307\u8cc7\u6599\u5728\u908f\u8f2f\u95dc\u4fc2\u4e0a\u5448\u7dda\u6027\u6392\u5217\uff1b\u975e\u7dda\u6027\u7d50\u69cb\u5247\u76f8\u53cd\uff0c\u5448\u975e\u7dda\u6027\u6392\u5217\u3002

    • \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u4e00\u7684\u9806\u5e8f\u95dc\u4fc2\u3002
    • \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u96dc\u6e4a\u8868\u3002

    \u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u9032\u4e00\u6b65\u5283\u5206\u70ba\u6a39\u5f62\u7d50\u69cb\u548c\u7db2\u72c0\u7d50\u69cb\u3002

    • \u6a39\u5f62\u7d50\u69cb\uff1a\u6a39\u3001\u5806\u7a4d\u3001\u96dc\u6e4a\u8868\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u4e00\u5c0d\u591a\u7684\u95dc\u4fc2\u3002
    • \u7db2\u72c0\u7d50\u69cb\uff1a\u5716\uff0c\u5143\u7d20\u4e4b\u9593\u662f\u591a\u5c0d\u591a\u7684\u95dc\u4fc2\u3002

    \u5716 3-1 \u00a0 \u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u8207\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb

    "},{"location":"chapter_data_structure/classification_of_data_structure/#312","title":"3.1.2 \u00a0 \u7269\u7406\u7d50\u69cb\uff1a\u9023\u7e8c\u8207\u5206\u6563","text":"

    \u7576\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u6b63\u5728\u8655\u7406\u7684\u8cc7\u6599\u4e3b\u8981\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\u3002\u5716 3-2 \u5c55\u793a\u4e86\u4e00\u500b\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u689d\uff0c\u5176\u4e2d\u6bcf\u500b\u9ed1\u8272\u65b9\u584a\u90fd\u5305\u542b\u4e00\u584a\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u8a18\u61b6\u9ad4\u60f3\u8c61\u6210\u4e00\u500b\u5de8\u5927\u7684 Excel \u8868\u683c\uff0c\u5176\u4e2d\u6bcf\u500b\u55ae\u5143\u683c\u90fd\u53ef\u4ee5\u5132\u5b58\u4e00\u5b9a\u5927\u5c0f\u7684\u8cc7\u6599\u3002

    \u7cfb\u7d71\u900f\u904e\u8a18\u61b6\u9ad4\u4f4d\u5740\u4f86\u8a2a\u554f\u76ee\u6a19\u4f4d\u7f6e\u7684\u8cc7\u6599\u3002\u5982\u5716 3-2 \u6240\u793a\uff0c\u8a08\u7b97\u6a5f\u6839\u64da\u7279\u5b9a\u898f\u5247\u70ba\u8868\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5206\u914d\u7de8\u865f\uff0c\u78ba\u4fdd\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u6709\u552f\u4e00\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u3002\u6709\u4e86\u9019\u4e9b\u4f4d\u5740\uff0c\u7a0b\u5f0f\u4fbf\u53ef\u4ee5\u8a2a\u554f\u8a18\u61b6\u9ad4\u4e2d\u7684\u8cc7\u6599\u3002

    \u5716 3-2 \u00a0 \u8a18\u61b6\u9ad4\u689d\u3001\u8a18\u61b6\u9ad4\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u4f4d\u5740

    Tip

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5c07\u8a18\u61b6\u9ad4\u6bd4\u4f5c Excel \u8868\u683c\u662f\u4e00\u500b\u7c21\u5316\u7684\u985e\u6bd4\uff0c\u5be6\u969b\u8a18\u61b6\u9ad4\u7684\u5de5\u4f5c\u6a5f\u5236\u6bd4\u8f03\u8907\u96dc\uff0c\u6d89\u53ca\u4f4d\u5740\u7a7a\u9593\u3001\u8a18\u61b6\u9ad4\u7ba1\u7406\u3001\u5feb\u53d6\u6a5f\u5236\u3001\u865b\u64ec\u8a18\u61b6\u9ad4\u548c\u7269\u7406\u8a18\u61b6\u9ad4\u7b49\u6982\u5ff5\u3002

    \u8a18\u61b6\u9ad4\u662f\u6240\u6709\u7a0b\u5f0f\u7684\u5171\u4eab\u8cc7\u6e90\uff0c\u7576\u67d0\u584a\u8a18\u61b6\u9ad4\u88ab\u67d0\u500b\u7a0b\u5f0f\u4f54\u7528\u6642\uff0c\u5247\u7121\u6cd5\u88ab\u5176\u4ed6\u7a0b\u5f0f\u540c\u6642\u4f7f\u7528\u4e86\u3002\u56e0\u6b64\u5728\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u4e2d\uff0c\u8a18\u61b6\u9ad4\u8cc7\u6e90\u662f\u4e00\u500b\u91cd\u8981\u7684\u8003\u616e\u56e0\u7d20\u3002\u6bd4\u5982\uff0c\u6f14\u7b97\u6cd5\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u5cf0\u503c\u4e0d\u61c9\u8d85\u904e\u7cfb\u7d71\u5269\u9918\u7a7a\u9592\u8a18\u61b6\u9ad4\uff1b\u5982\u679c\u7f3a\u5c11\u9023\u7e8c\u5927\u584a\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u90a3\u9ebc\u6240\u9078\u7528\u7684\u8cc7\u6599\u7d50\u69cb\u5fc5\u9808\u80fd\u5920\u5132\u5b58\u5728\u5206\u6563\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u5167\u3002

    \u5982\u5716 3-3 \u6240\u793a\uff0c\u7269\u7406\u7d50\u69cb\u53cd\u6620\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\uff0c\u53ef\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u7269\u7406\u7d50\u69cb\u5f9e\u5e95\u5c64\u6c7a\u5b9a\u4e86\u8cc7\u6599\u7684\u8a2a\u554f\u3001\u66f4\u65b0\u3001\u589e\u522a\u7b49\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5169\u7a2e\u7269\u7406\u7d50\u69cb\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u65b9\u9762\u5448\u73fe\u51fa\u4e92\u88dc\u7684\u7279\u9ede\u3002

    \u5716 3-3 \u00a0 \u9023\u7e8c\u7a7a\u9593\u5132\u5b58\u8207\u5206\u6563\u7a7a\u9593\u5132\u5b58

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u57fa\u65bc\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u4e8c\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002\u4f8b\u5982\uff0c\u5806\u758a\u548c\u4f47\u5217\u65e2\u53ef\u4ee5\u4f7f\u7528\u9663\u5217\u5be6\u73fe\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1b\u800c\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u3002

    • \u57fa\u65bc\u9663\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u3001\u77e9\u9663\u3001\u5f35\u91cf\uff08\u7dad\u5ea6 \\(\\geq 3\\) \u7684\u9663\u5217\uff09\u7b49\u3002
    • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u53ef\u5be6\u73fe\uff1a\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u3002

    \u93c8\u7d50\u4e32\u5217\u5728\u521d\u59cb\u5316\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5728\u7a0b\u5f0f\u57f7\u884c\u904e\u7a0b\u4e2d\u5c0d\u5176\u9577\u5ea6\u9032\u884c\u8abf\u6574\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u52d5\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u9663\u5217\u5728\u521d\u59cb\u5316\u5f8c\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u9663\u5217\u53ef\u900f\u904e\u91cd\u65b0\u5206\u914d\u8a18\u61b6\u9ad4\u5be6\u73fe\u9577\u5ea6\u8b8a\u5316\uff0c\u5f9e\u800c\u5177\u5099\u4e00\u5b9a\u7684\u201c\u52d5\u614b\u6027\u201d\u3002

    Tip

    \u5982\u679c\u4f60\u611f\u89ba\u7269\u7406\u7d50\u69cb\u7406\u89e3\u8d77\u4f86\u6709\u56f0\u96e3\uff0c\u5efa\u8b70\u5148\u95b1\u8b80\u4e0b\u4e00\u7ae0\uff0c\u7136\u5f8c\u518d\u56de\u9867\u672c\u7bc0\u5167\u5bb9\u3002

    "},{"location":"chapter_data_structure/number_encoding/","title":"3.3 \u00a0 \u6578\u5b57\u7de8\u78bc *","text":"

    Note

    \u5728\u672c\u66f8\u4e2d\uff0c\u6a19\u984c\u5e36\u6709 * \u7b26\u865f\u7684\u662f\u9078\u8b80\u7ae0\u7bc0\u3002\u5982\u679c\u4f60\u6642\u9593\u6709\u9650\u6216\u611f\u5230\u7406\u89e3\u56f0\u96e3\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\uff0c\u7b49\u5b78\u5b8c\u5fc5\u8b80\u7ae0\u7bc0\u5f8c\u518d\u55ae\u7368\u653b\u514b\u3002

    "},{"location":"chapter_data_structure/number_encoding/#331","title":"3.3.1 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578","text":"

    \u5728\u4e0a\u4e00\u7bc0\u7684\u8868\u683c\u4e2d\u6211\u5011\u767c\u73fe\uff0c\u6240\u6709\u6574\u6578\u578b\u5225\u80fd\u5920\u8868\u793a\u7684\u8ca0\u6578\u90fd\u6bd4\u6b63\u6578\u591a\u4e00\u500b\uff0c\u4f8b\u5982 byte \u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \u3002\u9019\u500b\u73fe\u8c61\u6bd4\u8f03\u53cd\u76f4\u89ba\uff0c\u5b83\u7684\u5167\u5728\u539f\u56e0\u6d89\u53ca\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u76f8\u95dc\u77e5\u8b58\u3002

    \u9996\u5148\u9700\u8981\u6307\u51fa\uff0c\u6578\u5b57\u662f\u4ee5\u201c\u4e8c\u88dc\u6578\u201d\u7684\u5f62\u5f0f\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u4e2d\u7684\u3002\u5728\u5206\u6790\u9019\u6a23\u505a\u7684\u539f\u56e0\u4e4b\u524d\uff0c\u9996\u5148\u7d66\u51fa\u4e09\u8005\u7684\u5b9a\u7fa9\u3002

    • \u539f\u78bc\uff1a\u6211\u5011\u5c07\u6578\u5b57\u7684\u4e8c\u9032\u4f4d\u5236\u8868\u793a\u7684\u6700\u9ad8\u4f4d\u8996\u70ba\u7b26\u865f\u4f4d\uff0c\u5176\u4e2d \\(0\\) \u8868\u793a\u6b63\u6578\uff0c\\(1\\) \u8868\u793a\u8ca0\u6578\uff0c\u5176\u9918\u4f4d\u8868\u793a\u6578\u5b57\u7684\u503c\u3002
    • \u4e00\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e00\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e00\u88dc\u6578\u662f\u5c0d\u5176\u539f\u78bc\u9664\u7b26\u865f\u4f4d\u5916\u7684\u6240\u6709\u4f4d\u53d6\u53cd\u3002
    • \u4e8c\u88dc\u6578\uff1a\u6b63\u6578\u7684\u4e8c\u88dc\u6578\u8207\u5176\u539f\u78bc\u76f8\u540c\uff0c\u8ca0\u6578\u7684\u4e8c\u88dc\u6578\u662f\u5728\u5176\u4e00\u88dc\u6578\u7684\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u3002

    \u5716 3-4 \u5c55\u793a\u4e86\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u8f49\u63db\u65b9\u6cd5\u3002

    \u5716 3-4 \u00a0 \u539f\u78bc\u3001\u4e00\u88dc\u6578\u8207\u4e8c\u88dc\u6578\u4e4b\u9593\u7684\u76f8\u4e92\u8f49\u63db

    \u539f\u78bc\uff08sign-magnitude\uff09\u96d6\u7136\u6700\u76f4\u89c0\uff0c\u4f46\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002\u4e00\u65b9\u9762\uff0c\u8ca0\u6578\u7684\u539f\u78bc\u4e0d\u80fd\u76f4\u63a5\u7528\u65bc\u904b\u7b97\u3002\u4f8b\u5982\u5728\u539f\u78bc\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u5f97\u5230\u7684\u7d50\u679c\u662f \\(-3\\) \uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002

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

    \u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u8a08\u7b97\u6a5f\u5f15\u5165\u4e86\u4e00\u88dc\u6578\uff081's complement\uff09\u3002\u5982\u679c\u6211\u5011\u5148\u5c07\u539f\u78bc\u8f49\u63db\u70ba\u4e00\u88dc\u6578\uff0c\u4e26\u5728\u4e00\u88dc\u6578\u4e0b\u8a08\u7b97 \\(1 + (-2)\\) \uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5f9e\u4e00\u88dc\u6578\u8f49\u63db\u56de\u539f\u78bc\uff0c\u5247\u53ef\u5f97\u5230\u6b63\u78ba\u7d50\u679c \\(-1\\) \u3002

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

    \u53e6\u4e00\u65b9\u9762\uff0c\u6578\u5b57\u96f6\u7684\u539f\u78bc\u6709 \\(+0\\) \u548c \\(-0\\) \u5169\u7a2e\u8868\u793a\u65b9\u5f0f\u3002\u9019\u610f\u5473\u8457\u6578\u5b57\u96f6\u5c0d\u61c9\u5169\u500b\u4e0d\u540c\u7684\u4e8c\u9032\u4f4d\u5236\u7de8\u78bc\uff0c\u9019\u53ef\u80fd\u6703\u5e36\u4f86\u6b67\u7fa9\u3002\u6bd4\u5982\u5728\u689d\u4ef6\u5224\u65b7\u4e2d\uff0c\u5982\u679c\u6c92\u6709\u5340\u5206\u6b63\u96f6\u548c\u8ca0\u96f6\uff0c\u5247\u53ef\u80fd\u6703\u5c0e\u81f4\u5224\u65b7\u7d50\u679c\u51fa\u932f\u3002\u800c\u5982\u679c\u6211\u5011\u60f3\u8655\u7406\u6b63\u96f6\u548c\u8ca0\u96f6\u6b67\u7fa9\uff0c\u5247\u9700\u8981\u5f15\u5165\u984d\u5916\u7684\u5224\u65b7\u64cd\u4f5c\uff0c\u9019\u53ef\u80fd\u6703\u964d\u4f4e\u8a08\u7b97\u6a5f\u7684\u904b\u7b97\u6548\u7387\u3002

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

    \u8207\u539f\u78bc\u4e00\u6a23\uff0c\u4e00\u88dc\u6578\u4e5f\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u554f\u984c\uff0c\u56e0\u6b64\u8a08\u7b97\u6a5f\u9032\u4e00\u6b65\u5f15\u5165\u4e86\u4e8c\u88dc\u6578\uff082's complement\uff09\u3002\u6211\u5011\u5148\u4f86\u89c0\u5bdf\u4e00\u4e0b\u8ca0\u96f6\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u3001\u4e8c\u88dc\u6578\u7684\u8f49\u63db\u904e\u7a0b\uff1a

    \\[ \\begin{aligned} -0 \\rightarrow \\; & 1000 \\; 0000 \\; \\text{(\u539f\u78bc)} \\newline = \\; & 1111 \\; 1111 \\; \\text{(\u4e00\u88dc\u6578)} \\newline = 1 \\; & 0000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline \\end{aligned} \\]

    \u5728\u8ca0\u96f6\u7684\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u52a0 \\(1\\) \u6703\u7522\u751f\u9032\u4f4d\uff0c\u4f46 byte \u578b\u5225\u7684\u9577\u5ea6\u53ea\u6709 8 \u4f4d\uff0c\u56e0\u6b64\u6ea2\u4f4d\u5230\u7b2c 9 \u4f4d\u7684 \\(1\\) \u6703\u88ab\u6368\u68c4\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u8ca0\u96f6\u7684\u4e8c\u88dc\u6578\u70ba \\(0000 \\; 0000\\) \uff0c\u8207\u6b63\u96f6\u7684\u4e8c\u88dc\u6578\u76f8\u540c\u3002\u9019\u610f\u5473\u8457\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e2d\u53ea\u5b58\u5728\u4e00\u500b\u96f6\uff0c\u6b63\u8ca0\u96f6\u6b67\u7fa9\u5f9e\u800c\u5f97\u5230\u89e3\u6c7a\u3002

    \u9084\u5269\u6700\u5f8c\u4e00\u500b\u7591\u60d1\uff1abyte \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u662f \\([-128, 127]\\) \uff0c\u591a\u51fa\u4f86\u7684\u4e00\u500b\u8ca0\u6578 \\(-128\\) \u662f\u5982\u4f55\u5f97\u5230\u7684\u5462\uff1f\u6211\u5011\u6ce8\u610f\u5230\uff0c\u5340\u9593 \\([-127, +127]\\) \u5167\u7684\u6240\u6709\u6574\u6578\u90fd\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\uff0c\u4e26\u4e14\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e4b\u9593\u53ef\u4ee5\u4e92\u76f8\u8f49\u63db\u3002

    \u7136\u800c\uff0c\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u662f\u4e00\u500b\u4f8b\u5916\uff0c\u5b83\u4e26\u6c92\u6709\u5c0d\u61c9\u7684\u539f\u78bc\u3002\u6839\u64da\u8f49\u63db\u65b9\u6cd5\uff0c\u6211\u5011\u5f97\u5230\u8a72\u4e8c\u88dc\u6578\u7684\u539f\u78bc\u70ba \\(0000 \\; 0000\\) \u3002\u9019\u986f\u7136\u662f\u77db\u76fe\u7684\uff0c\u56e0\u70ba\u8a72\u539f\u78bc\u8868\u793a\u6578\u5b57 \\(0\\) \uff0c\u5b83\u7684\u4e8c\u88dc\u6578\u61c9\u8a72\u662f\u81ea\u8eab\u3002\u8a08\u7b97\u6a5f\u898f\u5b9a\u9019\u500b\u7279\u6b8a\u7684\u4e8c\u88dc\u6578 \\(1000 \\; 0000\\) \u4ee3\u8868 \\(-128\\) \u3002\u5be6\u969b\u4e0a\uff0c\\((-1) + (-127)\\) \u5728\u4e8c\u88dc\u6578\u4e0b\u7684\u8a08\u7b97\u7d50\u679c\u5c31\u662f \\(-128\\) \u3002

    \\[ \\begin{aligned} & (-127) + (-1) \\newline & \\rightarrow 1111 \\; 1111 \\; \\text{(\u539f\u78bc)} + 1000 \\; 0001 \\; \\text{(\u539f\u78bc)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e00\u88dc\u6578)} + 1111 \\; 1110 \\; \\text{(\u4e00\u88dc\u6578)} \\newline & = 1000 \\; 0001 \\; \\text{(\u4e8c\u88dc\u6578)} + 1111 \\; 1111 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & = 1000 \\; 0000 \\; \\text{(\u4e8c\u88dc\u6578)} \\newline & \\rightarrow -128 \\end{aligned} \\]

    \u4f60\u53ef\u80fd\u5df2\u7d93\u767c\u73fe\u4e86\uff0c\u4e0a\u8ff0\u6240\u6709\u8a08\u7b97\u90fd\u662f\u52a0\u6cd5\u904b\u7b97\u3002\u9019\u6697\u793a\u8457\u4e00\u500b\u91cd\u8981\u4e8b\u5be6\uff1a\u8a08\u7b97\u6a5f\u5167\u90e8\u7684\u786c\u9ad4\u96fb\u8def\u4e3b\u8981\u662f\u57fa\u65bc\u52a0\u6cd5\u904b\u7b97\u8a2d\u8a08\u7684\u3002\u9019\u662f\u56e0\u70ba\u52a0\u6cd5\u904b\u7b97\u76f8\u5c0d\u65bc\u5176\u4ed6\u904b\u7b97\uff08\u6bd4\u5982\u4e58\u6cd5\u3001\u9664\u6cd5\u548c\u6e1b\u6cd5\uff09\u4f86\u8aaa\uff0c\u786c\u9ad4\u5be6\u73fe\u8d77\u4f86\u66f4\u7c21\u55ae\uff0c\u66f4\u5bb9\u6613\u9032\u884c\u4e26\u884c\u5316\u8655\u7406\uff0c\u904b\u7b97\u901f\u5ea6\u66f4\u5feb\u3002

    \u8acb\u6ce8\u610f\uff0c\u9019\u4e26\u4e0d\u610f\u5473\u8457\u8a08\u7b97\u6a5f\u53ea\u80fd\u505a\u52a0\u6cd5\u3002\u900f\u904e\u5c07\u52a0\u6cd5\u8207\u4e00\u4e9b\u57fa\u672c\u908f\u8f2f\u904b\u7b97\u7d50\u5408\uff0c\u8a08\u7b97\u6a5f\u80fd\u5920\u5be6\u73fe\u5404\u7a2e\u5176\u4ed6\u7684\u6578\u5b78\u904b\u7b97\u3002\u4f8b\u5982\uff0c\u8a08\u7b97\u6e1b\u6cd5 \\(a - b\\) \u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u52a0\u6cd5 \\(a + (-b)\\) \uff1b\u8a08\u7b97\u4e58\u6cd5\u548c\u9664\u6cd5\u53ef\u4ee5\u8f49\u63db\u70ba\u8a08\u7b97\u591a\u6b21\u52a0\u6cd5\u6216\u6e1b\u6cd5\u3002

    \u73fe\u5728\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u8a08\u7b97\u6a5f\u4f7f\u7528\u4e8c\u88dc\u6578\u7684\u539f\u56e0\uff1a\u57fa\u65bc\u4e8c\u88dc\u6578\u8868\u793a\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u7528\u540c\u6a23\u7684\u96fb\u8def\u548c\u64cd\u4f5c\u4f86\u8655\u7406\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\uff0c\u4e0d\u9700\u8981\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\u4f86\u8655\u7406\u6e1b\u6cd5\uff0c\u4e26\u4e14\u7121\u9808\u7279\u5225\u8655\u7406\u6b63\u8ca0\u96f6\u7684\u6b67\u7fa9\u554f\u984c\u3002\u9019\u5927\u5927\u7c21\u5316\u4e86\u786c\u9ad4\u8a2d\u8a08\uff0c\u63d0\u9ad8\u4e86\u904b\u7b97\u6548\u7387\u3002

    \u4e8c\u88dc\u6578\u7684\u8a2d\u8a08\u975e\u5e38\u7cbe\u5999\uff0c\u56e0\u7bc7\u5e45\u95dc\u4fc2\u6211\u5011\u5c31\u5148\u4ecb\u7d39\u5230\u9019\u88e1\uff0c\u5efa\u8b70\u6709\u8208\u8da3\u7684\u8b80\u8005\u9032\u4e00\u6b65\u6df1\u5165\u77ad\u89e3\u3002

    "},{"location":"chapter_data_structure/number_encoding/#332","title":"3.3.2 \u00a0 \u6d6e\u9ede\u6578\u7de8\u78bc","text":"

    \u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u6703\u767c\u73fe\uff1aint \u548c float \u9577\u5ea6\u76f8\u540c\uff0c\u90fd\u662f 4 \u4f4d\u5143\u7d44 \uff0c\u4f46\u70ba\u4ec0\u9ebc float \u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \uff1f\u9019\u975e\u5e38\u53cd\u76f4\u89ba\uff0c\u56e0\u70ba\u6309\u7406\u8aaa float \u9700\u8981\u8868\u793a\u5c0f\u6578\uff0c\u53d6\u503c\u7bc4\u570d\u61c9\u8a72\u8b8a\u5c0f\u624d\u5c0d\u3002

    \u5be6\u969b\u4e0a\uff0c\u9019\u662f\u56e0\u70ba\u6d6e\u9ede\u6578 float \u63a1\u7528\u4e86\u4e0d\u540c\u7684\u8868\u793a\u65b9\u5f0f\u3002\u8a18\u4e00\u500b 32 \u4f4d\u5143\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u70ba\uff1a

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

    \u6839\u64da IEEE 754 \u6a19\u6e96\uff0c32-bit \u9577\u5ea6\u7684 float \u7531\u4ee5\u4e0b\u4e09\u500b\u90e8\u5206\u69cb\u6210\u3002

    • \u7b26\u865f\u4f4d \\(\\mathrm{S}\\) \uff1a\u4f54 1 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{31}\\) \u3002
    • \u6307\u6578\u4f4d \\(\\mathrm{E}\\) \uff1a\u4f54 8 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{30} b_{29} \\ldots b_{23}\\) \u3002
    • \u5206\u6578\u4f4d \\(\\mathrm{N}\\) \uff1a\u4f54 23 \u4f4d \uff0c\u5c0d\u61c9 \\(b_{22} b_{21} \\ldots b_0\\) \u3002

    \u4e8c\u9032\u4f4d\u5236\u6578 float \u5c0d\u61c9\u503c\u7684\u8a08\u7b97\u65b9\u6cd5\u70ba\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 \\]

    \u8f49\u5316\u5230\u5341\u9032\u4f4d\u5236\u4e0b\u7684\u8a08\u7b97\u516c\u5f0f\u70ba\uff1a

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

    \u5176\u4e2d\u5404\u9805\u7684\u53d6\u503c\u7bc4\u570d\u70ba\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} \\]

    \u5716 3-5 \u00a0 IEEE 754 \u6a19\u6e96\u4e0b\u7684 float \u7684\u8a08\u7b97\u793a\u4f8b

    \u89c0\u5bdf\u5716 3-5 \uff0c\u7d66\u5b9a\u4e00\u500b\u793a\u4f8b\u8cc7\u6599 \\(\\mathrm{S} = 0\\) \uff0c \\(\\mathrm{E} = 124\\) \uff0c\\(\\mathrm{N} = 2^{-2} + 2^{-3} = 0.375\\) \uff0c\u5247\u6709\uff1a

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

    \u73fe\u5728\u6211\u5011\u53ef\u4ee5\u56de\u7b54\u6700\u521d\u7684\u554f\u984c\uff1afloat \u7684\u8868\u793a\u65b9\u5f0f\u5305\u542b\u6307\u6578\u4f4d\uff0c\u5c0e\u81f4\u5176\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc int \u3002\u6839\u64da\u4ee5\u4e0a\u8a08\u7b97\uff0cfloat \u53ef\u8868\u793a\u7684\u6700\u5927\u6b63\u6578\u70ba \\(2^{254 - 127} \\times (2 - 2^{-23}) \\approx 3.4 \\times 10^{38}\\) \uff0c\u5207\u63db\u7b26\u865f\u4f4d\u4fbf\u53ef\u5f97\u5230\u6700\u5c0f\u8ca0\u6578\u3002

    \u5118\u7ba1\u6d6e\u9ede\u6578 float \u64f4\u5c55\u4e86\u53d6\u503c\u7bc4\u570d\uff0c\u4f46\u5176\u526f\u4f5c\u7528\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002\u6574\u6578\u578b\u5225 int \u5c07\u5168\u90e8 32 \u4f4d\u5143\u7528\u65bc\u8868\u793a\u6578\u5b57\uff0c\u6578\u5b57\u662f\u5747\u52fb\u5206\u4f48\u7684\uff1b\u800c\u7531\u65bc\u6307\u6578\u4f4d\u7684\u5b58\u5728\uff0c\u6d6e\u9ede\u6578 float \u7684\u6578\u503c\u8d8a\u5927\uff0c\u76f8\u9130\u5169\u500b\u6578\u5b57\u4e4b\u9593\u7684\u5dee\u503c\u5c31\u6703\u8da8\u5411\u8d8a\u5927\u3002

    \u5982\u8868 3-2 \u6240\u793a\uff0c\u6307\u6578\u4f4d \\(\\mathrm{E} = 0\\) \u548c \\(\\mathrm{E} = 255\\) \u5177\u6709\u7279\u6b8a\u542b\u7fa9\uff0c\u7528\u65bc\u8868\u793a\u96f6\u3001\u7121\u7aae\u5927\u3001\\(\\mathrm{NaN}\\) \u7b49\u3002

    \u8868 3-2 \u00a0 \u6307\u6578\u4f4d\u542b\u7fa9

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

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u6b21\u6b63\u898f\u6578\u986f\u8457\u63d0\u5347\u4e86\u6d6e\u9ede\u6578\u7684\u7cbe\u5ea6\u3002\u6700\u5c0f\u6b63\u6b63\u898f\u6578\u70ba \\(2^{-126}\\) \uff0c\u6700\u5c0f\u6b63\u6b21\u6b63\u898f\u6578\u70ba \\(2^{-126} \\times 2^{-23}\\) \u3002

    \u96d9\u7cbe\u5ea6 double \u4e5f\u63a1\u7528\u985e\u4f3c\u65bc float \u7684\u8868\u793a\u65b9\u6cd5\uff0c\u5728\u6b64\u4e0d\u505a\u8d05\u8ff0\u3002

    "},{"location":"chapter_data_structure/summary/","title":"3.5 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_data_structure/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u5f9e\u908f\u8f2f\u7d50\u69cb\u548c\u7269\u7406\u7d50\u69cb\u5169\u500b\u89d2\u5ea6\u9032\u884c\u5206\u985e\u3002\u908f\u8f2f\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5143\u7d20\u4e4b\u9593\u7684\u908f\u8f2f\u95dc\u4fc2\uff0c\u800c\u7269\u7406\u7d50\u69cb\u63cf\u8ff0\u4e86\u8cc7\u6599\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u7684\u5132\u5b58\u65b9\u5f0f\u3002
    • \u5e38\u898b\u7684\u908f\u8f2f\u7d50\u69cb\u5305\u62ec\u7dda\u6027\u3001\u6a39\u72c0\u548c\u7db2\u72c0\u7b49\u3002\u901a\u5e38\u6211\u5011\u6839\u64da\u908f\u8f2f\u7d50\u69cb\u5c07\u8cc7\u6599\u7d50\u69cb\u5206\u70ba\u7dda\u6027\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\uff09\u548c\u975e\u7dda\u6027\uff08\u6a39\u3001\u5716\u3001\u5806\u7a4d\uff09\u5169\u7a2e\u3002\u96dc\u6e4a\u8868\u7684\u5be6\u73fe\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002
    • \u7576\u7a0b\u5f0f\u57f7\u884c\u6642\uff0c\u8cc7\u6599\u88ab\u5132\u5b58\u5728\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u4e2d\u3002\u6bcf\u500b\u8a18\u61b6\u9ad4\u7a7a\u9593\u90fd\u64c1\u6709\u5c0d\u61c9\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\uff0c\u7a0b\u5f0f\u900f\u904e\u9019\u4e9b\u8a18\u61b6\u9ad4\u4f4d\u5740\u8a2a\u554f\u8cc7\u6599\u3002
    • \u7269\u7406\u7d50\u69cb\u4e3b\u8981\u5206\u70ba\u9023\u7e8c\u7a7a\u9593\u5132\u5b58\uff08\u9663\u5217\uff09\u548c\u5206\u6563\u7a7a\u9593\u5132\u5b58\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002\u6240\u6709\u8cc7\u6599\u7d50\u69cb\u90fd\u662f\u7531\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u6216\u5169\u8005\u7684\u7d44\u5408\u5be6\u73fe\u7684\u3002
    • \u8a08\u7b97\u6a5f\u4e2d\u7684\u57fa\u672c\u8cc7\u6599\u578b\u5225\u5305\u62ec\u6574\u6578 byte\u3001short\u3001int\u3001long \uff0c\u6d6e\u9ede\u6578 float\u3001double \uff0c\u5b57\u5143 char \u548c\u5e03\u6797 bool \u3002\u5b83\u5011\u7684\u53d6\u503c\u7bc4\u570d\u53d6\u6c7a\u65bc\u4f54\u7528\u7a7a\u9593\u5927\u5c0f\u548c\u8868\u793a\u65b9\u5f0f\u3002
    • \u539f\u78bc\u3001\u4e00\u88dc\u6578\u548c\u4e8c\u88dc\u6578\u662f\u5728\u8a08\u7b97\u6a5f\u4e2d\u7de8\u78bc\u6578\u5b57\u7684\u4e09\u7a2e\u65b9\u6cd5\uff0c\u5b83\u5011\u4e4b\u9593\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\u3002\u6574\u6578\u7684\u539f\u78bc\u7684\u6700\u9ad8\u4f4d\u662f\u7b26\u865f\u4f4d\uff0c\u5176\u9918\u4f4d\u662f\u6578\u5b57\u7684\u503c\u3002
    • \u6574\u6578\u5728\u8a08\u7b97\u6a5f\u4e2d\u662f\u4ee5\u4e8c\u88dc\u6578\u7684\u5f62\u5f0f\u5132\u5b58\u7684\u3002\u5728\u4e8c\u88dc\u6578\u8868\u793a\u4e0b\uff0c\u8a08\u7b97\u6a5f\u53ef\u4ee5\u5c0d\u6b63\u6578\u548c\u8ca0\u6578\u7684\u52a0\u6cd5\u4e00\u8996\u540c\u4ec1\uff0c\u4e0d\u9700\u8981\u70ba\u6e1b\u6cd5\u64cd\u4f5c\u55ae\u7368\u8a2d\u8a08\u7279\u6b8a\u7684\u786c\u9ad4\u96fb\u8def\uff0c\u4e26\u4e14\u4e0d\u5b58\u5728\u6b63\u8ca0\u96f6\u6b67\u7fa9\u7684\u554f\u984c\u3002
    • \u6d6e\u9ede\u6578\u7684\u7de8\u78bc\u7531 1 \u4f4d\u7b26\u865f\u4f4d\u30018 \u4f4d\u6307\u6578\u4f4d\u548c 23 \u4f4d\u5206\u6578\u4f4d\u69cb\u6210\u3002\u7531\u65bc\u5b58\u5728\u6307\u6578\u4f4d\uff0c\u56e0\u6b64\u6d6e\u9ede\u6578\u7684\u53d6\u503c\u7bc4\u570d\u9060\u5927\u65bc\u6574\u6578\uff0c\u4ee3\u50f9\u662f\u72a7\u7272\u4e86\u7cbe\u5ea6\u3002
    • ASCII \u78bc\u662f\u6700\u65e9\u51fa\u73fe\u7684\u82f1\u6587\u5b57\u7b26\u96c6\uff0c\u9577\u5ea6\u70ba 1 \u4f4d\u5143\u7d44\uff0c\u5171\u6536\u9304 127 \u500b\u5b57\u5143\u3002GBK \u5b57\u7b26\u96c6\u662f\u5e38\u7528\u7684\u4e2d\u6587\u5b57\u7b26\u96c6\uff0c\u5171\u6536\u9304\u5169\u842c\u591a\u500b\u6f22\u5b57\u3002Unicode \u81f4\u529b\u65bc\u63d0\u4f9b\u4e00\u500b\u5b8c\u6574\u7684\u5b57\u7b26\u96c6\u6a19\u6e96\uff0c\u6536\u9304\u4e16\u754c\u4e0a\u5404\u7a2e\u8a9e\u8a00\u7684\u5b57\u5143\uff0c\u5f9e\u800c\u89e3\u6c7a\u7531\u65bc\u5b57\u5143\u7de8\u78bc\u65b9\u6cd5\u4e0d\u4e00\u81f4\u800c\u5c0e\u81f4\u7684\u4e82\u78bc\u554f\u984c\u3002
    • UTF-8 \u662f\u6700\u53d7\u6b61\u8fce\u7684 Unicode \u7de8\u78bc\u65b9\u6cd5\uff0c\u901a\u7528\u6027\u975e\u5e38\u597d\u3002\u5b83\u662f\u4e00\u7a2e\u8b8a\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\uff0c\u5177\u6709\u5f88\u597d\u7684\u64f4\u5c55\u6027\uff0c\u6709\u6548\u63d0\u5347\u4e86\u5132\u5b58\u7a7a\u9593\u7684\u4f7f\u7528\u6548\u7387\u3002UTF-16 \u548c UTF-32 \u662f\u7b49\u9577\u7684\u7de8\u78bc\u65b9\u6cd5\u3002\u5728\u7de8\u78bc\u4e2d\u6587\u6642\uff0cUTF-16 \u4f54\u7528\u7684\u7a7a\u9593\u6bd4 UTF-8 \u66f4\u5c0f\u3002Java \u548c C# \u7b49\u7a0b\u5f0f\u8a9e\u8a00\u9810\u8a2d\u4f7f\u7528 UTF-16 \u7de8\u78bc\u3002
    "},{"location":"chapter_data_structure/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff1f

    \u96dc\u6e4a\u8868\u5e95\u5c64\u662f\u9663\u5217\uff0c\u800c\u70ba\u4e86\u89e3\u6c7a\u96dc\u6e4a\u885d\u7a81\uff0c\u6211\u5011\u53ef\u80fd\u6703\u4f7f\u7528\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\uff08\u5f8c\u7e8c\u201c\u96dc\u6e4a\u885d\u7a81\u201d\u7ae0\u7bc0\u6703\u8b1b\uff09\uff1a\u9663\u5217\u4e2d\u6bcf\u500b\u6876\u6307\u5411\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u8d85\u904e\u4e00\u5b9a\u95be\u503c\u6642\uff0c\u53c8\u53ef\u80fd\u88ab\u8f49\u5316\u70ba\u6a39\uff08\u901a\u5e38\u70ba\u7d05\u9ed1\u6a39\uff09\u3002

    \u5f9e\u5132\u5b58\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u96dc\u6e4a\u8868\u7684\u5e95\u5c64\u662f\u9663\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u6876\u69fd\u4f4d\u53ef\u80fd\u5305\u542b\u4e00\u500b\u503c\uff0c\u4e5f\u53ef\u80fd\u5305\u542b\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u6216\u4e00\u68f5\u6a39\u3002\u56e0\u6b64\uff0c\u96dc\u6e4a\u8868\u53ef\u80fd\u540c\u6642\u5305\u542b\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\uff09\u548c\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff08\u6a39\uff09\u3002

    Q\uff1achar \u578b\u5225\u7684\u9577\u5ea6\u662f 1 \u4f4d\u5143\u7d44\u55ce\uff1f

    char \u578b\u5225\u7684\u9577\u5ea6\u7531\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u7528\u7684\u7de8\u78bc\u65b9\u6cd5\u6c7a\u5b9a\u3002\u4f8b\u5982\uff0cJava\u3001JavaScript\u3001TypeScript\u3001C# \u90fd\u63a1\u7528 UTF-16 \u7de8\u78bc\uff08\u5132\u5b58 Unicode \u78bc\u9ede\uff09\uff0c\u56e0\u6b64 char \u578b\u5225\u7684\u9577\u5ea6\u70ba 2 \u4f4d\u5143\u7d44\u3002

    Q\uff1a\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u4e5f\u7a31\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d \u662f\u5426\u6709\u6b67\u7fa9\uff1f\u5806\u758a\u4e5f\u53ef\u4ee5\u9032\u884c\u51fa\u5806\u758a\u548c\u5165\u5806\u758a\u7b49\u64cd\u4f5c\uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u662f\u201c\u52d5\u614b\u201d\u7684\u3002

    \u5806\u758a\u78ba\u5be6\u53ef\u4ee5\u5be6\u73fe\u52d5\u614b\u7684\u8cc7\u6599\u64cd\u4f5c\uff0c\u4f46\u8cc7\u6599\u7d50\u69cb\u4ecd\u7136\u662f\u201c\u975c\u614b\u201d\uff08\u9577\u5ea6\u4e0d\u53ef\u8b8a\uff09\u7684\u3002\u5118\u7ba1\u57fa\u65bc\u9663\u5217\u7684\u8cc7\u6599\u7d50\u69cb\u53ef\u4ee5\u52d5\u614b\u5730\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\uff0c\u4f46\u5b83\u5011\u7684\u5bb9\u91cf\u662f\u56fa\u5b9a\u7684\u3002\u5982\u679c\u8cc7\u6599\u91cf\u8d85\u51fa\u4e86\u9810\u5206\u914d\u7684\u5927\u5c0f\uff0c\u5c31\u9700\u8981\u5efa\u7acb\u4e00\u500b\u65b0\u7684\u66f4\u5927\u7684\u9663\u5217\uff0c\u4e26\u5c07\u820a\u9663\u5217\u7684\u5167\u5bb9\u8907\u88fd\u5230\u65b0\u9663\u5217\u4e2d\u3002

    Q\uff1a\u5728\u69cb\u5efa\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u6642\u5019\uff0c\u672a\u6307\u5b9a\u5b83\u7684\u5927\u5c0f\uff0c\u70ba\u4ec0\u9ebc\u5b83\u5011\u662f\u201c\u975c\u614b\u8cc7\u6599\u7d50\u69cb\u201d\u5462\uff1f

    \u5728\u9ad8\u968e\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u6211\u5011\u7121\u9808\u4eba\u5de5\u6307\u5b9a\u5806\u758a\uff08\u4f47\u5217\uff09\u7684\u521d\u59cb\u5bb9\u91cf\uff0c\u9019\u500b\u5de5\u4f5c\u7531\u985e\u5225\u5167\u90e8\u81ea\u52d5\u5b8c\u6210\u3002\u4f8b\u5982\uff0cJava \u7684 ArrayList \u7684\u521d\u59cb\u5bb9\u91cf\u901a\u5e38\u70ba 10\u3002\u53e6\u5916\uff0c\u64f4\u5bb9\u64cd\u4f5c\u4e5f\u662f\u81ea\u52d5\u5be6\u73fe\u7684\u3002\u8a73\u898b\u5f8c\u7e8c\u7684\u201c\u4e32\u5217\u201d\u7ae0\u7bc0\u3002

    Q\uff1a\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u7684\u65b9\u6cd5\u662f\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\uff0c\u90a3\u9ebc\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u61c9\u8a72\u662f\u9006\u904b\u7b97\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff0c\u800c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u4e5f\u4e00\u6a23\u53ef\u4ee5\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff0c\u9019\u662f\u70ba\u4ec0\u9ebc\u5462\uff1f

    A\uff1a\u9019\u662f\u56e0\u70ba\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u76f8\u4e92\u8f49\u63db\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u201c\u88dc\u6578\u201d\u7684\u904e\u7a0b\u3002\u6211\u5011\u5148\u7d66\u51fa\u88dc\u6578\u7684\u5b9a\u7fa9\uff1a\u5047\u8a2d \\(a + b = c\\) \uff0c\u90a3\u9ebc\u6211\u5011\u7a31 \\(a\\) \u662f \\(b\\) \u5230 \\(c\\) \u7684\u88dc\u6578\uff0c\u53cd\u4e4b\u4e5f\u7a31 \\(b\\) \u662f \\(a\\) \u5230 \\(c\\) \u7684\u88dc\u6578\u3002

    \u7d66\u5b9a\u4e00\u500b \\(n = 4\\) \u4f4d\u9577\u5ea6\u7684\u4e8c\u9032\u4f4d\u5236\u6578 \\(0010\\) \uff0c\u5982\u679c\u5c07\u9019\u500b\u6578\u5b57\u770b\u4f5c\u539f\u78bc\uff08\u4e0d\u8003\u616e\u7b26\u865f\u4f4d\uff09\uff0c\u90a3\u9ebc\u5b83\u7684\u4e8c\u88dc\u6578\u9700\u900f\u904e\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\uff1a

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

    \u6211\u5011\u6703\u767c\u73fe\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u7684\u548c\u662f \\(0010 + 1110 = 10000\\) \uff0c\u4e5f\u5c31\u662f\u8aaa\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u662f\u539f\u78bc \\(0010\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u3002\u9019\u610f\u5473\u8457\u4e0a\u8ff0\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5be6\u969b\u4e0a\u662f\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\u7684\u904e\u7a0b\u3002

    \u90a3\u9ebc\uff0c\u4e8c\u88dc\u6578 \\(1110\\) \u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\u662f\u591a\u5c11\u5462\uff1f\u6211\u5011\u4f9d\u7136\u53ef\u4ee5\u7528\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u5f97\u5230\u5b83\uff1a

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

    \u63db\u53e5\u8a71\u8aaa\uff0c\u539f\u78bc\u548c\u4e8c\u88dc\u6578\u4e92\u70ba\u5c0d\u65b9\u5230 \\(10000\\) \u7684\u201c\u88dc\u6578\u201d\uff0c\u56e0\u6b64\u201c\u539f\u78bc\u8f49\u4e8c\u88dc\u6578\u201d\u548c\u201c\u4e8c\u88dc\u6578\u8f49\u539f\u78bc\u201d\u53ef\u4ee5\u7528\u76f8\u540c\u7684\u64cd\u4f5c\uff08\u5148\u53d6\u53cd\u5f8c\u52a0 1 \uff09\u5be6\u73fe\u3002

    \u7576\u7136\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u7528\u9006\u904b\u7b97\u4f86\u6c42\u4e8c\u88dc\u6578 \\(1110\\) \u7684\u539f\u78bc\uff0c\u5373\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\uff1a

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

    \u7e3d\u7d50\u4f86\u770b\uff0c\u201c\u5148\u53d6\u53cd\u5f8c\u52a0 1\u201d\u548c\u201c\u5148\u6e1b 1 \u5f8c\u53d6\u53cd\u201d\u9019\u5169\u7a2e\u904b\u7b97\u90fd\u662f\u5728\u8a08\u7b97\u5230 \\(10000\\) \u7684\u88dc\u6578\uff0c\u5b83\u5011\u662f\u7b49\u50f9\u7684\u3002

    \u672c\u8cea\u4e0a\u770b\uff0c\u201c\u53d6\u53cd\u201d\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u6c42\u5230 \\(1111\\) \u7684\u88dc\u6578\uff08\u56e0\u70ba\u6046\u6709 \u539f\u78bc + \u4e00\u88dc\u6578 = 1111\uff09\uff1b\u800c\u5728\u4e00\u88dc\u6578\u57fa\u790e\u4e0a\u518d\u52a0 1 \u5f97\u5230\u7684\u4e8c\u88dc\u6578\uff0c\u5c31\u662f\u5230 \\(10000\\) \u7684\u88dc\u6578\u3002

    \u4e0a\u8ff0 \\(n = 4\\) \u70ba\u4f8b\uff0c\u5176\u53ef\u63a8\u5ee3\u81f3\u4efb\u610f\u4f4d\u6578\u7684\u4e8c\u9032\u4f4d\u5236\u6578\u3002

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

    Abstract

    \u96e3\u984c\u88ab\u9010\u5c64\u62c6\u89e3\uff0c\u6bcf\u4e00\u6b21\u7684\u62c6\u89e3\u90fd\u4f7f\u5b83\u8b8a\u5f97\u66f4\u70ba\u7c21\u55ae\u3002

    \u5206\u800c\u6cbb\u4e4b\u63ed\u793a\u4e86\u4e00\u500b\u91cd\u8981\u7684\u4e8b\u5be6\uff1a\u5f9e\u7c21\u55ae\u505a\u8d77\uff0c\u4e00\u5207\u90fd\u4e0d\u518d\u8907\u96dc\u3002

    "},{"location":"chapter_divide_and_conquer/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5
    • 12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565
    • 12.3 \u00a0 \u69cb\u5efa\u6a39\u554f\u984c
    • 12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c
    • 12.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_divide_and_conquer/binary_search_recur/","title":"12.2 \u00a0 \u5206\u6cbb\u641c\u5c0b\u7b56\u7565","text":"

    \u6211\u5011\u5df2\u7d93\u5b78\u904e\uff0c\u641c\u5c0b\u6f14\u7b97\u6cd5\u5206\u70ba\u5169\u5927\u985e\u3002

    • \u66b4\u529b\u641c\u5c0b\uff1a\u5b83\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002
    • \u81ea\u9069\u61c9\u641c\u5c0b\uff1a\u5b83\u5229\u7528\u7279\u6709\u7684\u8cc7\u6599\u7d44\u7e54\u5f62\u5f0f\u6216\u5148\u9a57\u8cc7\u8a0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u5be6\u969b\u4e0a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u548c\u6a39\u3002

    • \u4e8c\u5206\u641c\u5c0b\u7684\u6bcf\u4e00\u6b65\u90fd\u5c07\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\u5206\u89e3\u70ba\u4e00\u500b\u5c0f\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\uff09\uff0c\u9019\u500b\u904e\u7a0b\u4e00\u76f4\u6301\u7e8c\u5230\u9663\u5217\u70ba\u7a7a\u6216\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
    • \u6a39\u662f\u5206\u6cbb\u601d\u60f3\u7684\u4ee3\u8868\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u5806\u7a4d\u7b49\u8cc7\u6599\u7d50\u69cb\u4e2d\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7686\u70ba \\(O(\\log n)\\) \u3002

    \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u7b56\u7565\u5982\u4e0b\u6240\u793a\u3002

    • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u4e8c\u5206\u641c\u5c0b\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\uff08\u5728\u9663\u5217\u4e2d\u9032\u884c\u67e5\u8a62\uff09\u5206\u89e3\u70ba\u5b50\u554f\u984c\uff08\u5728\u9663\u5217\u7684\u4e00\u534a\u4e2d\u9032\u884c\u67e5\u8a62\uff09\uff0c\u9019\u662f\u900f\u904e\u6bd4\u8f03\u4e2d\u9593\u5143\u7d20\u548c\u76ee\u6a19\u5143\u7d20\u4f86\u5be6\u73fe\u7684\u3002
    • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u8655\u7406\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5b83\u4e0d\u53d7\u5176\u4ed6\u5b50\u554f\u984c\u7684\u5f71\u97ff\u3002
    • \u5b50\u554f\u984c\u7684\u89e3\u7121\u9808\u5408\u4f75\uff1a\u4e8c\u5206\u641c\u5c0b\u65e8\u5728\u67e5\u8a62\u4e00\u500b\u7279\u5b9a\u5143\u7d20\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u3002\u7576\u5b50\u554f\u984c\u5f97\u5230\u89e3\u6c7a\u6642\uff0c\u539f\u554f\u984c\u4e5f\u6703\u540c\u6642\u5f97\u5230\u89e3\u6c7a\u3002

    \u5206\u6cbb\u80fd\u5920\u63d0\u5347\u641c\u5c0b\u6548\u7387\uff0c\u672c\u8cea\u4e0a\u662f\u56e0\u70ba\u66b4\u529b\u641c\u5c0b\u6bcf\u8f2a\u53ea\u80fd\u6392\u9664\u4e00\u500b\u9078\u9805\uff0c\u800c\u5206\u6cbb\u641c\u5c0b\u6bcf\u8f2a\u53ef\u4ee5\u6392\u9664\u4e00\u534a\u9078\u9805\u3002

    "},{"location":"chapter_divide_and_conquer/binary_search_recur/#1","title":"1. \u00a0 \u57fa\u65bc\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b","text":"

    \u5728\u4e4b\u524d\u7684\u7ae0\u7bc0\u4e2d\uff0c\u4e8c\u5206\u641c\u5c0b\u662f\u57fa\u65bc\u905e\u63a8\uff08\u8fed\u4ee3\uff09\u5be6\u73fe\u7684\u3002\u73fe\u5728\u6211\u5011\u57fa\u65bc\u5206\u6cbb\uff08\u905e\u8ff4\uff09\u4f86\u5be6\u73fe\u5b83\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u662f\u552f\u4e00\u7684\uff0c\u8acb\u67e5\u8a62\u5143\u7d20 target \u3002

    \u5f9e\u5206\u6cbb\u89d2\u5ea6\uff0c\u6211\u5011\u5c07\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u8a18\u70ba \\(f(i, j)\\) \u3002

    \u4ee5\u539f\u554f\u984c \\(f(0, n-1)\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u900f\u904e\u4ee5\u4e0b\u6b65\u9a5f\u9032\u884c\u4e8c\u5206\u641c\u5c0b\u3002

    1. \u8a08\u7b97\u641c\u5c0b\u5340\u9593 \\([i, j]\\) \u7684\u4e2d\u9ede \\(m\\) \uff0c\u6839\u64da\u5b83\u6392\u9664\u4e00\u534a\u641c\u5c0b\u5340\u9593\u3002
    2. \u905e\u8ff4\u6c42\u89e3\u898f\u6a21\u6e1b\u5c0f\u4e00\u534a\u7684\u5b50\u554f\u984c\uff0c\u53ef\u80fd\u70ba \\(f(i, m-1)\\) \u6216 \\(f(m+1, j)\\) \u3002
    3. \u8ff4\u5708\u7b2c 1. \u6b65\u548c\u7b2c 2. \u6b65\uff0c\u76f4\u81f3\u627e\u5230 target \u6216\u5340\u9593\u70ba\u7a7a\u6642\u8fd4\u56de\u3002

    \u5716 12-4 \u5c55\u793a\u4e86\u5728\u9663\u5217\u4e2d\u4e8c\u5206\u641c\u5c0b\u5143\u7d20 \\(6\\) \u7684\u5206\u6cbb\u904e\u7a0b\u3002

    \u5716 12-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u7684\u5206\u6cbb\u904e\u7a0b

    \u5728\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \u4f86\u6c42\u89e3\u554f\u984c \\(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\u641c\u5c0b\uff1a\u554f\u984c f(i, j)\"\"\"\n    # \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j:\n        return -1\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) // 2\n    if nums[m] < target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j)\n    elif nums[m] > target:\n        # \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1)\n    else:\n        # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n\ndef binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\"\"\"\n    n = len(nums)\n    # \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n
    binary_search_recur.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(vector<int> &nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(vector<int> &nums, int target) {\n    int n = nums.size();\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.java
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int[] nums, int target) {\n    int n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint DFS(int[] nums, int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return DFS(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return DFS(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint BinarySearch(int[] nums, int target) {\n    int n = nums.Length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return DFS(nums, target, 0, n - 1);\n}\n
    binary_search_recur.go
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums []int, target, i, j int) int {\n    // \u5982\u679c\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u6c92\u6709\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    //    \u8a08\u7b97\u7d22\u5f15\u4e2d\u9ede\n    m := i + ((j - i) >> 1)\n    //\u5224\u65b7\u4e2d\u9ede\u8207\u76ee\u6a19\u5143\u7d20\u5927\u5c0f\n    if nums[m] < target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u53f3\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m+1, j)\n    } else if nums[m] > target {\n        // \u5c0f\u65bc\u5247\u905e\u8ff4\u5de6\u534a\u9663\u5217\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m-1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\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\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunc dfs(nums: [Int], target: Int, i: Int, j: Int) -> Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    let m = (i + j) / 2\n    if nums[m] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums: nums, target: target, i: m + 1, j: j)\n    } else if nums[m] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums: nums, target: target, i: i, j: m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u6c42\u89e3\u554f\u984c 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\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums, target, i, j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums, target) {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfunction dfs(nums: number[], target: number, i: number, j: number): number {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    const m = i + ((j - i) >> 1);\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfunction binarySearch(nums: number[], target: number): number {\n    const n = nums.length;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(List<int> nums, int target, int i, int j) {\n  // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n  if (i > j) {\n    return -1;\n  }\n  // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n  int m = (i + j) ~/ 2;\n  if (nums[m] < target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n    return dfs(nums, target, m + 1, j);\n  } else if (nums[m] > target) {\n    // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n    return dfs(nums, target, i, m - 1);\n  } else {\n    // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return m;\n  }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(List<int> nums, int target) {\n  int n = nums.length;\n  // \u6c42\u89e3\u554f\u984c f(0, n-1)\n  return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfn dfs(nums: &[i32], target: i32, i: i32, j: i32) -> i32 {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if i > j {\n        return -1;\n    }\n    let m: i32 = (i + j) / 2;\n    if nums[m as usize] < target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if nums[m as usize] > target {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    let n = nums.len() as i32;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.c
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nint dfs(int nums[], int target, int i, int j) {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1;\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    int m = (i + j) / 2;\n    if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        return dfs(nums, target, m + 1, j);\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        return dfs(nums, target, i, m - 1);\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        return m;\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nint binarySearch(int nums[], int target, int numsSize) {\n    int n = numsSize;\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1);\n}\n
    binary_search_recur.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff1a\u554f\u984c f(i, j) */\nfun dfs(\n    nums: IntArray,\n    target: Int,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u5340\u9593\u70ba\u7a7a\uff0c\u4ee3\u8868\u7121\u76ee\u6a19\u5143\u7d20\uff0c\u5247\u8fd4\u56de -1\n    if (i > j) {\n        return -1\n    }\n    // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    val m = (i + j) / 2\n    return if (nums[m] < target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(m+1, j)\n        dfs(nums, target, m + 1, j)\n    } else if (nums[m] > target) {\n        // \u905e\u8ff4\u5b50\u554f\u984c f(i, m-1)\n        dfs(nums, target, i, m - 1)\n    } else {\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        m\n    }\n}\n\n/* \u4e8c\u5206\u641c\u5c0b */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    val n = nums.size\n    // \u6c42\u89e3\u554f\u984c f(0, n-1)\n    return dfs(nums, target, 0, n - 1)\n}\n
    binary_search_recur.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binary_search}\n
    binary_search_recur.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{binarySearch}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/","title":"12.3 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u68f5\u4e8c\u5143\u6a39\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \uff0c\u8acb\u5f9e\u4e2d\u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u8fd4\u56de\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5047\u8a2d\u4e8c\u5143\u6a39\u4e2d\u6c92\u6709\u503c\u91cd\u8907\u7684\u7bc0\u9ede\uff08\u5982\u5716 12-5 \u6240\u793a\uff09\u3002

    \u5716 12-5 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#1","title":"1. \u00a0 \u5224\u65b7\u662f\u5426\u70ba\u5206\u6cbb\u554f\u984c","text":"

    \u539f\u554f\u984c\u5b9a\u7fa9\u70ba\u5f9e preorder \u548c inorder \u69cb\u5efa\u4e8c\u5143\u6a39\uff0c\u662f\u4e00\u500b\u5178\u578b\u7684\u5206\u6cbb\u554f\u984c\u3002

    • \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u5f9e\u5206\u6cbb\u7684\u89d2\u5ea6\u5207\u5165\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\u3001\u69cb\u5efa\u53f3\u5b50\u6a39\uff0c\u52a0\u4e0a\u4e00\u6b65\u64cd\u4f5c\uff1a\u521d\u59cb\u5316\u6839\u7bc0\u9ede\u3002\u800c\u5c0d\u65bc\u6bcf\u68f5\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u8907\u7528\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u5c07\u5176\u5283\u5206\u70ba\u66f4\u5c0f\u7684\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c\uff08\u7a7a\u5b50\u6a39\uff09\u6642\u7d42\u6b62\u3002
    • \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u5b83\u5011\u4e4b\u9593\u6c92\u6709\u4ea4\u96c6\u3002\u5728\u69cb\u5efa\u5de6\u5b50\u6a39\u6642\uff0c\u6211\u5011\u53ea\u9700\u95dc\u6ce8\u4e2d\u5e8f\u8d70\u8a2a\u548c\u524d\u5e8f\u8d70\u8a2a\u4e2d\u8207\u5de6\u5b50\u6a39\u5c0d\u61c9\u7684\u90e8\u5206\u3002\u53f3\u5b50\u6a39\u540c\u7406\u3002
    • \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u4e00\u65e6\u5f97\u5230\u4e86\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5b83\u5011\u9023\u7d50\u5230\u6839\u7bc0\u9ede\u4e0a\uff0c\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#2","title":"2. \u00a0 \u5982\u4f55\u5283\u5206\u5b50\u6a39","text":"

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u9019\u9053\u984c\u53ef\u4ee5\u4f7f\u7528\u5206\u6cbb\u4f86\u6c42\u89e3\uff0c\u4f46\u5982\u4f55\u900f\u904e\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u4f86\u5283\u5206\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u5462\uff1f

    \u6839\u64da\u5b9a\u7fa9\uff0cpreorder \u548c inorder \u90fd\u53ef\u4ee5\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\u3002

    • \u524d\u5e8f\u8d70\u8a2a\uff1a[ \u6839\u7bc0\u9ede | \u5de6\u5b50\u6a39 | \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 3 | 9 | 2 1 7 ] \u3002
    • \u4e2d\u5e8f\u8d70\u8a2a\uff1a[ \u5de6\u5b50\u6a39 | \u6839\u7bc0\u9ede \uff5c \u53f3\u5b50\u6a39 ] \uff0c\u4f8b\u5982\u5716 12-5 \u7684\u6a39\u5c0d\u61c9 [ 9 | 3 | 1 2 7 ] \u3002

    \u4ee5\u4e0a\u5716\u8cc7\u6599\u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u5716 12-6 \u6240\u793a\u7684\u6b65\u9a5f\u5f97\u5230\u5283\u5206\u7d50\u679c\u3002

    1. \u524d\u5e8f\u8d70\u8a2a\u7684\u9996\u5143\u7d20 3 \u662f\u6839\u7bc0\u9ede\u7684\u503c\u3002
    2. \u67e5\u8a62\u6839\u7bc0\u9ede 3 \u5728 inorder \u4e2d\u7684\u7d22\u5f15\uff0c\u5229\u7528\u8a72\u7d22\u5f15\u53ef\u5c07 inorder \u5283\u5206\u70ba [ 9 | 3 \uff5c 1 2 7 ] \u3002
    3. \u6839\u64da inorder \u7684\u5283\u5206\u7d50\u679c\uff0c\u6613\u5f97\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u5206\u5225\u70ba 1 \u548c 3 \uff0c\u5f9e\u800c\u53ef\u5c07 preorder \u5283\u5206\u70ba [ 3 | 9 | 2 1 7 ] \u3002

    \u5716 12-6 \u00a0 \u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5283\u5206\u5b50\u6a39

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#3","title":"3. \u00a0 \u57fa\u65bc\u8b8a\u6578\u63cf\u8ff0\u5b50\u6a39\u5340\u9593","text":"

    \u6839\u64da\u4ee5\u4e0a\u5283\u5206\u65b9\u6cd5\uff0c\u6211\u5011\u5df2\u7d93\u5f97\u5230\u6839\u7bc0\u9ede\u3001\u5de6\u5b50\u6a39\u3001\u53f3\u5b50\u6a39\u5728 preorder \u548c inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002\u800c\u70ba\u4e86\u63cf\u8ff0\u9019\u4e9b\u7d22\u5f15\u5340\u9593\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u3002

    • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(i\\) \u3002
    • \u5c07\u7576\u524d\u6a39\u7684\u6839\u7bc0\u9ede\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u8a18\u70ba \\(m\\) \u3002
    • \u5c07\u7576\u524d\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u8a18\u70ba \\([l, r]\\) \u3002

    \u5982\u8868 12-1 \u6240\u793a\uff0c\u900f\u904e\u4ee5\u4e0a\u8b8a\u6578\u5373\u53ef\u8868\u793a\u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15\uff0c\u4ee5\u53ca\u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593\u3002

    \u8868 12-1 \u00a0 \u6839\u7bc0\u9ede\u548c\u5b50\u6a39\u5728\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u7684\u7d22\u5f15

    \u6839\u7bc0\u9ede\u5728 preorder \u4e2d\u7684\u7d22\u5f15 \u5b50\u6a39\u5728 inorder \u4e2d\u7684\u7d22\u5f15\u5340\u9593 \u7576\u524d\u6a39 \\(i\\) \\([l, r]\\) \u5de6\u5b50\u6a39 \\(i + 1\\) \\([l, m-1]\\) \u53f3\u5b50\u6a39 \\(i + 1 + (m - l)\\) \\([m+1, r]\\)

    \u8acb\u6ce8\u610f\uff0c\u53f3\u5b50\u6a39\u6839\u7bc0\u9ede\u7d22\u5f15\u4e2d\u7684 \\((m-l)\\) \u7684\u542b\u7fa9\u662f\u201c\u5de6\u5b50\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u201d\uff0c\u5efa\u8b70\u7d50\u5408\u5716 12-7 \u7406\u89e3\u3002

    \u5716 12-7 \u00a0 \u6839\u7bc0\u9ede\u548c\u5de6\u53f3\u5b50\u6a39\u7684\u7d22\u5f15\u5340\u9593\u8868\u793a

    "},{"location":"chapter_divide_and_conquer/build_binary_tree_problem/#4","title":"4. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u70ba\u4e86\u63d0\u5347\u67e5\u8a62 \\(m\\) \u7684\u6548\u7387\uff0c\u6211\u5011\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 hmap \u4f86\u5132\u5b58\u9663\u5217 inorder \u4e2d\u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb\"\"\"\n    # \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0:\n        return None\n    # \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root = TreeNode(preorder[i])\n    # \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m = inorder_map[preorder[i]]\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorder_map, i + 1, l, m - 1)\n    # \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r)\n    # \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n\ndef build_tree(preorder: list[int], inorder: list[int]) -> TreeNode | None:\n    \"\"\"\u69cb\u5efa\u4e8c\u5143\u6a39\"\"\"\n    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(vector<int> &preorder, unordered_map<int, int> &inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode dfs(int[] preorder, Map<Integer, Integer> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode buildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode? DFS(int[] preorder, Dictionary<int, int> inorderMap, int i, int l, int r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode root = new(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = DFS(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = DFS(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? BuildTree(int[] preorder, int[] inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfsBuildTree(preorder []int, inorderMap map[int]int, i, l, r int) *TreeNode {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r-l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    root := NewTreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    m := inorderMap[preorder[i]]\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.Left = dfsBuildTree(preorder, inorderMap, i+1, l, m-1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.Right = dfsBuildTree(preorder, inorderMap, i+1+m-l, m+1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder, inorder []int) *TreeNode {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunc dfs(preorder: [Int], inorderMap: [Int: Int], i: Int, l: Int, r: Int) -> TreeNode? {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return nil\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode(x: preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorderMap[preorder[i]]!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1, l: l, r: m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder: preorder, inorderMap: inorderMap, i: i + 1 + m - l, l: m + 1, r: r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunc buildTree(preorder: [Int], inorder: [Int]) -> TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nfunction dfs(preorder, inorderMap, i, l, r) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder, inorder) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    const root: TreeNode = new TreeNode(preorder[i]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    const m = inorderMap.get(preorder[i]);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfunction buildTree(preorder: number[], inorder: number[]): TreeNode | null {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n  if (r - l < 0) {\n    return null;\n  }\n  // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  TreeNode? root = TreeNode(preorder[i]);\n  // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n  int m = inorderMap[preorder[i]]!;\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n  root.left = dfs(preorder, inorderMap, i + 1, l, m - 1);\n  // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n  root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r);\n  // \u8fd4\u56de\u6839\u7bc0\u9ede\n  return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode? buildTree(List<int> preorder, List<int> inorder) {\n  // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if r - l < 0 {\n        return None;\n    }\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    let root = TreeNode::new(preorder[i as usize]);\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    let m = inorder_map.get(&preorder[i as usize]).unwrap();\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.borrow_mut().left = dfs(preorder, inorder_map, i + 1, l, m - 1);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.borrow_mut().right = dfs(preorder, inorder_map, i + 1 + m - l, m + 1, r);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    Some(root)\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfn build_tree(preorder: &[i32], inorder: &[i32]) -> Option<Rc<RefCell<TreeNode>>> {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\uff1a\u5206\u6cbb */\nTreeNode *dfs(int *preorder, int *inorderMap, int i, int l, int r, int size) {\n    // \u5b50\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0)\n        return NULL;\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));\n    root->val = preorder[i];\n    root->left = NULL;\n    root->right = NULL;\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    int m = inorderMap[preorder[i]];\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root->left = dfs(preorder, inorderMap, i + 1, l, m - 1, size);\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root->right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r, size);\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root;\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nTreeNode *buildTree(int *preorder, int preorderSize, int *inorder, int inorderSize) {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    /* \u69cb\u5efa\u4e8c\u5143\u6a39\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\u6a39\u5340\u9593\u70ba\u7a7a\u6642\u7d42\u6b62\n    if (r - l < 0) return null\n    // \u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    val root = TreeNode(preorder[i])\n    // \u67e5\u8a62 m \uff0c\u5f9e\u800c\u5283\u5206\u5de6\u53f3\u5b50\u6a39\n    val m = inorderMap[preorder[i]]!!\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u5de6\u5b50\u6a39\n    root.left = dfs(preorder, inorderMap, i + 1, l, m - 1)\n    // \u5b50\u554f\u984c\uff1a\u69cb\u5efa\u53f3\u5b50\u6a39\n    root.right = dfs(preorder, inorderMap, i + 1 + m - l, m + 1, r)\n    // \u8fd4\u56de\u6839\u7bc0\u9ede\n    return root\n}\n\n/* \u69cb\u5efa\u4e8c\u5143\u6a39 */\nfun buildTree(preorder: IntArray, inorder: IntArray): TreeNode? {\n    // \u521d\u59cb\u5316\u96dc\u6e4a\u8868\uff0c\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\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
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{build_tree}\n
    build_tree.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{buildTree}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 12-8 \u5c55\u793a\u4e86\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5404\u500b\u7bc0\u9ede\u662f\u5728\u5411\u4e0b\u201c\u905e\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\uff0c\u800c\u5404\u689d\u908a\uff08\u5f15\u7528\uff09\u662f\u5728\u5411\u4e0a\u201c\u8ff4\u201d\u7684\u904e\u7a0b\u4e2d\u5efa\u7acb\u7684\u3002

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

    \u5716 12-8 \u00a0 \u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b

    \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u5167\u7684\u524d\u5e8f\u8d70\u8a2a preorder \u548c\u4e2d\u5e8f\u8d70\u8a2a inorder \u7684\u5283\u5206\u7d50\u679c\u5982\u5716 12-9 \u6240\u793a\u3002

    \u5716 12-9 \u00a0 \u6bcf\u500b\u905e\u8ff4\u51fd\u5f0f\u4e2d\u7684\u5283\u5206\u7d50\u679c

    \u8a2d\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u521d\u59cb\u5316\u6bcf\u4e00\u500b\u7bc0\u9ede\uff08\u57f7\u884c\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs() \uff09\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u96dc\u6e4a\u8868\u5132\u5b58 inorder \u5143\u7d20\u5230\u7d22\u5f15\u7684\u5c0d\u6620\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u56e0\u6b64\u7e3d\u9ad4\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/","title":"12.1 \u00a0 \u5206\u6cbb\u6f14\u7b97\u6cd5","text":"

    \u5206\u6cbb\uff08divide and conquer\uff09\uff0c\u5168\u7a31\u5206\u800c\u6cbb\u4e4b\uff0c\u662f\u4e00\u7a2e\u975e\u5e38\u91cd\u8981\u4e14\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u7b56\u7565\u3002\u5206\u6cbb\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff0c\u5305\u62ec\u201c\u5206\u201d\u548c\u201c\u6cbb\u201d\u5169\u500b\u6b65\u9a5f\u3002

    1. \u5206\uff08\u5283\u5206\u968e\u6bb5\uff09\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u6216\u591a\u500b\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c\u6642\u7d42\u6b62\u3002
    2. \u6cbb\uff08\u5408\u4f75\u968e\u6bb5\uff09\uff1a\u5f9e\u5df2\u77e5\u89e3\u7684\u6700\u5c0f\u5b50\u554f\u984c\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

    \u5982\u5716 12-1 \u6240\u793a\uff0c\u201c\u5408\u4f75\u6392\u5e8f\u201d\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\u4e4b\u4e00\u3002

    1. \u5206\uff1a\u905e\u8ff4\u5730\u5c07\u539f\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\uff0c\u76f4\u5230\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\uff08\u6700\u5c0f\u5b50\u554f\u984c\uff09\u3002
    2. \u6cbb\uff1a\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u6709\u5e8f\u7684\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u9032\u884c\u5408\u4f75\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u7684\u539f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002

    \u5716 12-1 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1211","title":"12.1.1 \u00a0 \u5982\u4f55\u5224\u65b7\u5206\u6cbb\u554f\u984c","text":"

    \u4e00\u500b\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u5206\u6cbb\u89e3\u6c7a\uff0c\u901a\u5e38\u53ef\u4ee5\u53c3\u8003\u4ee5\u4e0b\u5e7e\u500b\u5224\u65b7\u4f9d\u64da\u3002

    1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u539f\u554f\u984c\u53ef\u4ee5\u5206\u89e3\u6210\u898f\u6a21\u66f4\u5c0f\u3001\u985e\u4f3c\u7684\u5b50\u554f\u984c\uff0c\u4ee5\u53ca\u80fd\u5920\u4ee5\u76f8\u540c\u65b9\u5f0f\u905e\u8ff4\u5730\u9032\u884c\u5283\u5206\u3002
    2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u5b50\u554f\u984c\u4e4b\u9593\u6c92\u6709\u91cd\u758a\uff0c\u4e92\u4e0d\u4f9d\u8cf4\uff0c\u53ef\u4ee5\u7368\u7acb\u89e3\u6c7a\u3002
    3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u539f\u554f\u984c\u7684\u89e3\u900f\u904e\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\u5f97\u4f86\u3002

    \u986f\u7136\uff0c\u5408\u4f75\u6392\u5e8f\u6eff\u8db3\u4ee5\u4e0a\u4e09\u500b\u5224\u65b7\u4f9d\u64da\u3002

    1. \u554f\u984c\u53ef\u4ee5\u5206\u89e3\uff1a\u905e\u8ff4\u5730\u5c07\u9663\u5217\uff08\u539f\u554f\u984c\uff09\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\uff09\u3002
    2. \u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff1a\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u53ef\u4ee5\u7368\u7acb\u5730\u9032\u884c\u6392\u5e8f\uff08\u5b50\u554f\u984c\u53ef\u4ee5\u7368\u7acb\u9032\u884c\u6c42\u89e3\uff09\u3002
    3. \u5b50\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u5408\u4f75\uff1a\u5169\u500b\u6709\u5e8f\u5b50\u9663\u5217\uff08\u5b50\u554f\u984c\u7684\u89e3\uff09\u53ef\u4ee5\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\uff08\u539f\u554f\u984c\u7684\u89e3\uff09\u3002
    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1212","title":"12.1.2 \u00a0 \u900f\u904e\u5206\u6cbb\u63d0\u5347\u6548\u7387","text":"

    \u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u6709\u6548\u5730\u89e3\u6c7a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u5f80\u5f80\u9084\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u5728\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u3001\u5408\u4f75\u6392\u5e8f\u3001\u5806\u7a4d\u6392\u5e8f\u76f8\u8f03\u65bc\u9078\u64c7\u3001\u5192\u6ce1\u3001\u63d2\u5165\u6392\u5e8f\u66f4\u5feb\uff0c\u5c31\u662f\u56e0\u70ba\u5b83\u5011\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\u3002

    \u90a3\u9ebc\uff0c\u6211\u5011\u4e0d\u7981\u767c\u554f\uff1a\u70ba\u4ec0\u9ebc\u5206\u6cbb\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u5176\u5e95\u5c64\u908f\u8f2f\u662f\u4ec0\u9ebc\uff1f\u63db\u53e5\u8a71\u8aaa\uff0c\u5c07\u5927\u554f\u984c\u5206\u89e3\u70ba\u591a\u500b\u5b50\u554f\u984c\u3001\u89e3\u6c7a\u5b50\u554f\u984c\u3001\u5c07\u5b50\u554f\u984c\u7684\u89e3\u5408\u4f75\u70ba\u539f\u554f\u984c\u7684\u89e3\uff0c\u9019\u5e7e\u6b65\u7684\u6548\u7387\u70ba\u4ec0\u9ebc\u6bd4\u76f4\u63a5\u89e3\u6c7a\u539f\u554f\u984c\u7684\u6548\u7387\u66f4\u9ad8\uff1f\u9019\u500b\u554f\u984c\u53ef\u4ee5\u5f9e\u64cd\u4f5c\u6578\u91cf\u548c\u5e73\u884c\u8a08\u7b97\u5169\u65b9\u9762\u4f86\u8a0e\u8ad6\u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1","title":"1. \u00a0 \u64cd\u4f5c\u6578\u91cf\u6700\u4f73\u5316","text":"

    \u4ee5\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u70ba\u4f8b\uff0c\u5176\u8655\u7406\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u9700\u8981 \\(O(n^2)\\) \u6642\u9593\u3002\u5047\u8a2d\u6211\u5011\u6309\u7167\u5716 12-2 \u6240\u793a\u7684\u65b9\u5f0f\uff0c\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u5247\u5283\u5206\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6bcf\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O((n / 2)^2)\\) \u6642\u9593\uff0c\u5408\u4f75\u5169\u500b\u5b50\u9663\u5217\u9700\u8981 \\(O(n)\\) \u6642\u9593\uff0c\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba\uff1a

    \\[ O(n + (\\frac{n}{2})^2 \\times 2 + n) = O(\\frac{n^2}{2} + 2n) \\]

    \u5716 12-2 \u00a0 \u5283\u5206\u9663\u5217\u524d\u5f8c\u7684\u6ce1\u6cab\u6392\u5e8f

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8a08\u7b97\u4ee5\u4e0b\u4e0d\u7b49\u5f0f\uff0c\u5176\u5de6\u908a\u548c\u53f3\u908a\u5206\u5225\u70ba\u5283\u5206\u524d\u548c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u7e3d\u6578\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} \\]

    \u9019\u610f\u5473\u8457\u7576 \\(n > 4\\) \u6642\uff0c\u5283\u5206\u5f8c\u7684\u64cd\u4f5c\u6578\u91cf\u66f4\u5c11\uff0c\u6392\u5e8f\u6548\u7387\u61c9\u8a72\u66f4\u9ad8\u3002\u8acb\u6ce8\u610f\uff0c\u5283\u5206\u5f8c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u7136\u662f\u5e73\u65b9\u968e \\(O(n^2)\\) \uff0c\u53ea\u662f\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\u4e86\u3002

    \u9032\u4e00\u6b65\u60f3\uff0c\u5982\u679c\u6211\u5011\u628a\u5b50\u9663\u5217\u4e0d\u65b7\u5730\u518d\u5f9e\u4e2d\u9ede\u8655\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u505c\u6b62\u5283\u5206\u5462\uff1f\u9019\u7a2e\u601d\u8def\u5be6\u969b\u4e0a\u5c31\u662f\u201c\u5408\u4f75\u6392\u5e8f\u201d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u518d\u601d\u8003\uff0c\u5982\u679c\u6211\u5011\u591a\u8a2d\u5b9a\u5e7e\u500b\u5283\u5206\u9ede\uff0c\u5c07\u539f\u9663\u5217\u5e73\u5747\u5283\u5206\u70ba \\(k\\) \u500b\u5b50\u9663\u5217\u5462\uff1f\u9019\u7a2e\u60c5\u6cc1\u8207\u201c\u6876\u6392\u5e8f\u201d\u975e\u5e38\u985e\u4f3c\uff0c\u5b83\u975e\u5e38\u9069\u5408\u6392\u5e8f\u6d77\u91cf\u8cc7\u6599\uff0c\u7406\u8ad6\u4e0a\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230 \\(O(n + k)\\) \u3002

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#2","title":"2. \u00a0 \u5e73\u884c\u8a08\u7b97\u6700\u4f73\u5316","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u5206\u6cbb\u751f\u6210\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u56e0\u6b64\u901a\u5e38\u53ef\u4ee5\u4e26\u884c\u89e3\u6c7a\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u5206\u6cbb\u4e0d\u50c5\u53ef\u4ee5\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u9084\u6709\u5229\u65bc\u4f5c\u696d\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002

    \u4e26\u884c\u6700\u4f73\u5316\u5728\u591a\u6838\u6216\u591a\u8655\u7406\u5668\u7684\u74b0\u5883\u4e2d\u5c24\u5176\u6709\u6548\uff0c\u56e0\u70ba\u7cfb\u7d71\u53ef\u4ee5\u540c\u6642\u8655\u7406\u591a\u500b\u5b50\u554f\u984c\uff0c\u66f4\u52a0\u5145\u5206\u5730\u5229\u7528\u8a08\u7b97\u8cc7\u6e90\uff0c\u5f9e\u800c\u986f\u8457\u6e1b\u5c11\u7e3d\u9ad4\u7684\u57f7\u884c\u6642\u9593\u3002

    \u6bd4\u5982\u5728\u5716 12-3 \u6240\u793a\u7684\u201c\u6876\u6392\u5e8f\u201d\u4e2d\uff0c\u6211\u5011\u5c07\u6d77\u91cf\u7684\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u5247\u53ef\u6240\u6709\u6876\u7684\u6392\u5e8f\u4efb\u52d9\u5206\u6563\u5230\u5404\u500b\u8a08\u7b97\u55ae\u5143\uff0c\u5b8c\u6210\u5f8c\u518d\u5408\u4f75\u7d50\u679c\u3002

    \u5716 12-3 \u00a0 \u6876\u6392\u5e8f\u7684\u5e73\u884c\u8a08\u7b97

    "},{"location":"chapter_divide_and_conquer/divide_and_conquer/#1213","title":"12.1.3 \u00a0 \u5206\u6cbb\u5e38\u898b\u61c9\u7528","text":"

    \u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u53ef\u4ee5\u7528\u4f86\u89e3\u6c7a\u8a31\u591a\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\u3002

    • \u5c0b\u627e\u6700\u8fd1\u9ede\u5c0d\uff1a\u8a72\u6f14\u7b97\u6cd5\u9996\u5148\u5c07\u9ede\u96c6\u5206\u6210\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u5206\u5225\u627e\u51fa\u5169\u90e8\u5206\u4e2d\u7684\u6700\u8fd1\u9ede\u5c0d\uff0c\u6700\u5f8c\u627e\u51fa\u8de8\u8d8a\u5169\u90e8\u5206\u7684\u6700\u8fd1\u9ede\u5c0d\u3002
    • \u5927\u6574\u6578\u4e58\u6cd5\uff1a\u4f8b\u5982 Karatsuba \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u6574\u6578\u4e58\u6cd5\u5206\u89e3\u70ba\u5e7e\u500b\u8f03\u5c0f\u7684\u6574\u6578\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u77e9\u9663\u4e58\u6cd5\uff1a\u4f8b\u5982 Strassen \u6f14\u7b97\u6cd5\uff0c\u5b83\u5c07\u5927\u77e9\u9663\u4e58\u6cd5\u5206\u89e3\u70ba\u591a\u500b\u5c0f\u77e9\u9663\u7684\u4e58\u6cd5\u548c\u52a0\u6cd5\u3002
    • \u6cb3\u5167\u5854\u554f\u984c\uff1a\u6cb3\u5167\u5854\u554f\u984c\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u89e3\u6c7a\uff0c\u9019\u662f\u5178\u578b\u7684\u5206\u6cbb\u7b56\u7565\u61c9\u7528\u3002
    • \u6c42\u89e3\u9006\u5e8f\u5c0d\uff1a\u5728\u4e00\u500b\u5e8f\u5217\u4e2d\uff0c\u5982\u679c\u524d\u9762\u7684\u6578\u5b57\u5927\u65bc\u5f8c\u9762\u7684\u6578\u5b57\uff0c\u90a3\u9ebc\u9019\u5169\u500b\u6578\u5b57\u69cb\u6210\u4e00\u500b\u9006\u5e8f\u5c0d\u3002\u6c42\u89e3\u9006\u5e8f\u5c0d\u554f\u984c\u53ef\u4ee5\u5229\u7528\u5206\u6cbb\u7684\u601d\u60f3\uff0c\u85c9\u52a9\u5408\u4f75\u6392\u5e8f\u9032\u884c\u6c42\u89e3\u3002

    \u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5728\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u8a2d\u8a08\u4e2d\u61c9\u7528\u5f97\u975e\u5e38\u5ee3\u6cdb\u3002

    • \u4e8c\u5206\u641c\u5c0b\uff1a\u4e8c\u5206\u641c\u5c0b\u662f\u5c07\u6709\u5e8f\u9663\u5217\u5f9e\u4e2d\u9ede\u7d22\u5f15\u8655\u5206\u70ba\u5169\u90e8\u5206\uff0c\u7136\u5f8c\u6839\u64da\u76ee\u6a19\u503c\u8207\u4e2d\u9593\u5143\u7d20\u503c\u6bd4\u8f03\u7d50\u679c\uff0c\u6c7a\u5b9a\u6392\u9664\u54ea\u4e00\u534a\u5340\u9593\uff0c\u4e26\u5728\u5269\u9918\u5340\u9593\u57f7\u884c\u76f8\u540c\u7684\u4e8c\u5206\u64cd\u4f5c\u3002
    • \u5408\u4f75\u6392\u5e8f\uff1a\u672c\u7bc0\u958b\u982d\u5df2\u4ecb\u7d39\uff0c\u4e0d\u518d\u8d05\u8ff0\u3002
    • \u5feb\u901f\u6392\u5e8f\uff1a\u5feb\u901f\u6392\u5e8f\u662f\u9078\u53d6\u4e00\u500b\u57fa\u6e96\u503c\uff0c\u7136\u5f8c\u628a\u9663\u5217\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\uff0c\u4e00\u500b\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5c0f\uff0c\u53e6\u4e00\u5b50\u9663\u5217\u7684\u5143\u7d20\u6bd4\u57fa\u6e96\u503c\u5927\uff0c\u518d\u5c0d\u9019\u5169\u90e8\u5206\u9032\u884c\u76f8\u540c\u7684\u5283\u5206\u64cd\u4f5c\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u53ea\u5269\u4e0b\u4e00\u500b\u5143\u7d20\u3002
    • \u6876\u6392\u5e8f\uff1a\u6876\u6392\u5e8f\u7684\u57fa\u672c\u601d\u60f3\u662f\u5c07\u8cc7\u6599\u5206\u6563\u5230\u591a\u500b\u6876\uff0c\u7136\u5f8c\u5c0d\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u5404\u500b\u6876\u7684\u5143\u7d20\u4f9d\u6b21\u53d6\u51fa\uff0c\u5f9e\u800c\u5f97\u5230\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002
    • \u6a39\uff1a\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\u3001AVL \u6a39\u3001\u7d05\u9ed1\u6a39\u3001B \u6a39\u3001B+ \u6a39\u7b49\uff0c\u5b83\u5011\u7684\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u7b49\u64cd\u4f5c\u90fd\u53ef\u4ee5\u8996\u70ba\u5206\u6cbb\u7b56\u7565\u7684\u61c9\u7528\u3002
    • \u5806\u7a4d\uff1a\u5806\u7a4d\u662f\u4e00\u7a2e\u7279\u6b8a\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u5176\u5404\u7a2e\u64cd\u4f5c\uff0c\u5982\u63d2\u5165\u3001\u522a\u9664\u548c\u5806\u7a4d\u5316\uff0c\u5be6\u969b\u4e0a\u90fd\u96b1\u542b\u4e86\u5206\u6cbb\u7684\u601d\u60f3\u3002
    • \u96dc\u6e4a\u8868\uff1a\u96d6\u7136\u96dc\u6e4a\u8868\u4e26\u4e0d\u76f4\u63a5\u61c9\u7528\u5206\u6cbb\uff0c\u4f46\u67d0\u4e9b\u96dc\u6e4a\u885d\u7a81\u89e3\u6c7a\u65b9\u6848\u9593\u63a5\u61c9\u7528\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u4f8b\u5982\uff0c\u93c8\u5f0f\u4f4d\u5740\u4e2d\u7684\u9577\u93c8\u7d50\u4e32\u5217\u6703\u88ab\u8f49\u5316\u70ba\u7d05\u9ed1\u6a39\uff0c\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002

    \u53ef\u4ee5\u770b\u51fa\uff0c\u5206\u6cbb\u662f\u4e00\u7a2e\u201c\u6f64\u7269\u7d30\u7121\u8072\u201d\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\uff0c\u96b1\u542b\u5728\u5404\u7a2e\u6f14\u7b97\u6cd5\u8207\u8cc7\u6599\u7d50\u69cb\u4e4b\u4e2d\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/","title":"12.4 \u00a0 \u6cb3\u5167\u5854\u554f\u984c","text":"

    \u5728\u5408\u4f75\u6392\u5e8f\u548c\u69cb\u5efa\u4e8c\u5143\u6a39\u4e2d\uff0c\u6211\u5011\u90fd\u662f\u5c07\u539f\u554f\u984c\u5206\u89e3\u70ba\u5169\u500b\u898f\u6a21\u70ba\u539f\u554f\u984c\u4e00\u534a\u7684\u5b50\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u6cb3\u5167\u5854\u554f\u984c\uff0c\u6211\u5011\u63a1\u7528\u4e0d\u540c\u7684\u5206\u89e3\u7b56\u7565\u3002

    Question

    \u7d66\u5b9a\u4e09\u6839\u67f1\u5b50\uff0c\u8a18\u70ba A\u3001B \u548c C \u3002\u8d77\u59cb\u72c0\u614b\u4e0b\uff0c\u67f1\u5b50 A \u4e0a\u5957\u8457 \\(n\\) \u500b\u5713\u76e4\uff0c\u5b83\u5011\u5f9e\u4e0a\u5230\u4e0b\u6309\u7167\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u3002\u6211\u5011\u7684\u4efb\u52d9\u662f\u8981\u628a\u9019 \\(n\\) \u500b\u5713\u76e4\u79fb\u5230\u67f1\u5b50 C \u4e0a\uff0c\u4e26\u4fdd\u6301\u5b83\u5011\u7684\u539f\u6709\u9806\u5e8f\u4e0d\u8b8a\uff08\u5982\u5716 12-10 \u6240\u793a\uff09\u3002\u5728\u79fb\u52d5\u5713\u76e4\u7684\u904e\u7a0b\u4e2d\uff0c\u9700\u8981\u9075\u5b88\u4ee5\u4e0b\u898f\u5247\u3002

    1. \u5713\u76e4\u53ea\u80fd\u5f9e\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u62ff\u51fa\uff0c\u5f9e\u53e6\u4e00\u6839\u67f1\u5b50\u9802\u90e8\u653e\u5165\u3002
    2. \u6bcf\u6b21\u53ea\u80fd\u79fb\u52d5\u4e00\u500b\u5713\u76e4\u3002
    3. \u5c0f\u5713\u76e4\u5fc5\u9808\u6642\u523b\u4f4d\u65bc\u5927\u5713\u76e4\u4e4b\u4e0a\u3002

    \u5716 12-10 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u793a\u4f8b

    \u6211\u5011\u5c07\u898f\u6a21\u70ba \\(i\\) \u7684\u6cb3\u5167\u5854\u554f\u984c\u8a18\u4f5c \\(f(i)\\) \u3002\u4f8b\u5982 \\(f(3)\\) \u4ee3\u8868\u5c07 \\(3\\) \u500b\u5713\u76e4\u5f9e A \u79fb\u52d5\u81f3 C \u7684\u6cb3\u5167\u5854\u554f\u984c\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#1","title":"1. \u00a0 \u8003\u616e\u57fa\u672c\u60c5\u6cc1","text":"

    \u5982\u5716 12-11 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(1)\\) \uff0c\u5373\u7576\u53ea\u6709\u4e00\u500b\u5713\u76e4\u6642\uff0c\u6211\u5011\u5c07\u5b83\u76f4\u63a5\u5f9e A \u79fb\u52d5\u81f3 C \u5373\u53ef\u3002

    <1><2>

    \u5716 12-11 \u00a0 \u898f\u6a21\u70ba 1 \u7684\u554f\u984c\u7684\u89e3

    \u5982\u5716 12-12 \u6240\u793a\uff0c\u5c0d\u65bc\u554f\u984c \\(f(2)\\) \uff0c\u5373\u7576\u6709\u5169\u500b\u5713\u76e4\u6642\uff0c\u7531\u65bc\u8981\u6642\u523b\u6eff\u8db3\u5c0f\u5713\u76e4\u5728\u5927\u5713\u76e4\u4e4b\u4e0a\uff0c\u56e0\u6b64\u9700\u8981\u85c9\u52a9 B \u4f86\u5b8c\u6210\u79fb\u52d5\u3002

    1. \u5148\u5c07\u4e0a\u9762\u7684\u5c0f\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
    2. \u518d\u5c07\u5927\u5713\u76e4\u5f9e A \u79fb\u81f3 C \u3002
    3. \u6700\u5f8c\u5c07\u5c0f\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u5716 12-12 \u00a0 \u898f\u6a21\u70ba 2 \u7684\u554f\u984c\u7684\u89e3

    \u89e3\u6c7a\u554f\u984c \\(f(2)\\) \u7684\u904e\u7a0b\u53ef\u7e3d\u7d50\u70ba\uff1a\u5c07\u5169\u500b\u5713\u76e4\u85c9\u52a9 B \u5f9e A \u79fb\u81f3 C \u3002\u5176\u4e2d\uff0cC \u7a31\u70ba\u76ee\u6a19\u67f1\u3001B \u7a31\u70ba\u7de9\u885d\u67f1\u3002

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#2","title":"2. \u00a0 \u5b50\u554f\u984c\u5206\u89e3","text":"

    \u5c0d\u65bc\u554f\u984c \\(f(3)\\) \uff0c\u5373\u7576\u6709\u4e09\u500b\u5713\u76e4\u6642\uff0c\u60c5\u6cc1\u8b8a\u5f97\u7a0d\u5fae\u8907\u96dc\u4e86\u4e00\u4e9b\u3002

    \u56e0\u70ba\u5df2\u77e5 \\(f(1)\\) \u548c \\(f(2)\\) \u7684\u89e3\uff0c\u6240\u4ee5\u6211\u5011\u53ef\u5f9e\u5206\u6cbb\u89d2\u5ea6\u601d\u8003\uff0c\u5c07 A \u9802\u90e8\u7684\u5169\u500b\u5713\u76e4\u770b\u4f5c\u4e00\u500b\u6574\u9ad4\uff0c\u57f7\u884c\u5716 12-13 \u6240\u793a\u7684\u6b65\u9a5f\u3002\u9019\u6a23\u4e09\u500b\u5713\u76e4\u5c31\u88ab\u9806\u5229\u5730\u5f9e A \u79fb\u81f3 C \u4e86\u3002

    1. \u4ee4 B \u70ba\u76ee\u6a19\u67f1\u3001C \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e A \u79fb\u81f3 B \u3002
    2. \u5c07 A \u4e2d\u5269\u9918\u7684\u4e00\u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u52d5\u81f3 C \u3002
    3. \u4ee4 C \u70ba\u76ee\u6a19\u67f1\u3001A \u70ba\u7de9\u885d\u67f1\uff0c\u5c07\u5169\u500b\u5713\u76e4\u5f9e B \u79fb\u81f3 C \u3002
    <1><2><3><4>

    \u5716 12-13 \u00a0 \u898f\u6a21\u70ba 3 \u7684\u554f\u984c\u7684\u89e3

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u6211\u5011\u5c07\u554f\u984c \\(f(3)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(2)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u4e4b\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002\u9019\u8aaa\u660e\u5b50\u554f\u984c\u662f\u7368\u7acb\u7684\uff0c\u800c\u4e14\u89e3\u53ef\u4ee5\u5408\u4f75\u3002

    \u81f3\u6b64\uff0c\u6211\u5011\u53ef\u7e3d\u7d50\u51fa\u5716 12-14 \u6240\u793a\u7684\u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565\uff1a\u5c07\u539f\u554f\u984c \\(f(n)\\) \u5283\u5206\u70ba\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \u548c\u4e00\u500b\u5b50\u554f\u984c \\(f(1)\\) \uff0c\u4e26\u6309\u7167\u4ee5\u4e0b\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u3002

    1. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 C \u5f9e A \u79fb\u81f3 B \u3002
    2. \u5c07\u5269\u9918 \\(1\\) \u500b\u5713\u76e4\u5f9e A \u76f4\u63a5\u79fb\u81f3 C \u3002
    3. \u5c07 \\(n-1\\) \u500b\u5713\u76e4\u85c9\u52a9 A \u5f9e B \u79fb\u81f3 C \u3002

    \u5c0d\u65bc\u9019\u5169\u500b\u5b50\u554f\u984c \\(f(n-1)\\) \uff0c\u53ef\u4ee5\u900f\u904e\u76f8\u540c\u7684\u65b9\u5f0f\u9032\u884c\u905e\u8ff4\u5283\u5206\uff0c\u76f4\u81f3\u9054\u5230\u6700\u5c0f\u5b50\u554f\u984c \\(f(1)\\) \u3002\u800c \\(f(1)\\) \u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u53ea\u9700\u4e00\u6b21\u79fb\u52d5\u64cd\u4f5c\u5373\u53ef\u3002

    \u5716 12-14 \u00a0 \u89e3\u6c7a\u6cb3\u5167\u5854\u554f\u984c\u7684\u5206\u6cbb\u7b56\u7565

    "},{"location":"chapter_divide_and_conquer/hanota_problem/#3","title":"3. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u905e\u8ff4\u51fd\u5f0f dfs(i, src, buf, tar) \uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5c07\u67f1 src \u9802\u90e8\u7684 \\(i\\) \u500b\u5713\u76e4\u85c9\u52a9\u7de9\u885d\u67f1 buf \u79fb\u52d5\u81f3\u76ee\u6a19\u67f1 tar \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hanota.py
    def move(src: list[int], tar: list[int]):\n    \"\"\"\u79fb\u52d5\u4e00\u500b\u5713\u76e4\"\"\"\n    # \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan = src.pop()\n    # \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n\ndef dfs(i: int, src: list[int], buf: list[int], tar: list[int]):\n    \"\"\"\u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i)\"\"\"\n    # \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1:\n        move(src, tar)\n        return\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    # \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    # \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\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\u6cb3\u5167\u5854\u554f\u984c\"\"\"\n    n = len(A)\n    # \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n
    hanota.cpp
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(vector<int> &src, vector<int> &tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src.back();\n    src.pop_back();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push_back(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, vector<int> &src, vector<int> &buf, vector<int> &tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(vector<int> &A, vector<int> &B, vector<int> &C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.java
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<Integer> src, List<Integer> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    Integer pan = src.remove(src.size() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<Integer> src, List<Integer> buf, List<Integer> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<Integer> A, List<Integer> B, List<Integer> C) {\n    int n = A.size();\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.cs
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid Move(List<int> src, List<int> tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[^1];\n    src.RemoveAt(src.Count - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.Add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid DFS(int i, List<int> src, List<int> buf, List<int> tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        Move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    DFS(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    Move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    DFS(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid SolveHanota(List<int> A, List<int> B, List<int> C) {\n    int n = A.Count;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    DFS(n, A, B, C);\n}\n
    hanota.go
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src, tar *list.List) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    pan := src.Back()\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.PushBack(pan.Value)\n    // \u79fb\u9664 src \u9802\u90e8\u5713\u76e4\n    src.Remove(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfsHanota(i int, src, buf, tar *list.List) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfsHanota(i-1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfsHanota(i-1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A, B, C *list.List) {\n    n := A.Len()\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfsHanota(n, A, B, C)\n}\n
    hanota.swift
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunc move(src: inout [Int], tar: inout [Int]) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.popLast()!\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.append(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunc dfs(i: Int, src: inout [Int], buf: inout [Int], tar: inout [Int]) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move(src: &src, tar: &tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i: i - 1, src: &src, buf: &tar, tar: &buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src: &src, tar: &tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i: i - 1, src: &buf, buf: &src, tar: &tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunc solveHanota(A: inout [Int], B: inout [Int], C: inout [Int]) {\n    let n = A.count\n    // \u4e32\u5217\u5c3e\u90e8\u662f\u67f1\u5b50\u9802\u90e8\n    // \u5c07 src \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(i: n, src: &A, buf: &B, tar: &C)\n}\n
    hanota.js
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src, tar) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i, src, buf, tar) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A, B, C) {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.ts
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfunction move(src: number[], tar: number[]): void {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    const pan = src.pop();\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfunction dfs(i: number, src: number[], buf: number[], tar: number[]): void {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i === 1) {\n        move(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfunction solveHanota(A: number[], B: number[], C: number[]): void {\n    const n = A.length;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.dart
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(List<int> src, List<int> tar) {\n  // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n  int pan = src.removeLast();\n  // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n  tar.add(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nvoid dfs(int i, List<int> src, List<int> buf, List<int> tar) {\n  // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n  if (i == 1) {\n    move(src, tar);\n    return;\n  }\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n  dfs(i - 1, src, tar, buf);\n  // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n  move(src, tar);\n  // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n  dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(List<int> A, List<int> B, List<int> C) {\n  int n = A.length;\n  // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n  dfs(n, A, B, C);\n}\n
    hanota.rs
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfn move_pan(src: &mut Vec<i32>, tar: &mut Vec<i32>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    let pan = src.remove(src.len() - 1);\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.push(pan);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c 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\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if i == 1 {\n        move_pan(src, tar);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move_pan(src, tar);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfn solve_hanota(A: &mut Vec<i32>, B: &mut Vec<i32>, C: &mut Vec<i32>) {\n    let n = A.len() as i32;\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C);\n}\n
    hanota.c
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nvoid move(int *src, int *srcSize, int *tar, int *tarSize) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    int pan = src[*srcSize - 1];\n    src[*srcSize - 1] = 0;\n    (*srcSize)--;\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar[*tarSize] = pan;\n    (*tarSize)++;\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c 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\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, srcSize, tar, tarSize);\n        return;\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, srcSize, tar, tarSize, buf, bufSize);\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, srcSize, tar, tarSize);\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, bufSize, src, srcSize, tar, tarSize);\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nvoid solveHanota(int *A, int *ASize, int *B, int *BSize, int *C, int *CSize) {\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(*ASize, A, ASize, B, BSize, C, CSize);\n}\n
    hanota.kt
    /* \u79fb\u52d5\u4e00\u500b\u5713\u76e4 */\nfun move(src: MutableList<Int>, tar: MutableList<Int>) {\n    // \u5f9e src \u9802\u90e8\u62ff\u51fa\u4e00\u500b\u5713\u76e4\n    val pan = src.removeAt(src.size - 1)\n    // \u5c07\u5713\u76e4\u653e\u5165 tar \u9802\u90e8\n    tar.add(pan)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c f(i) */\nfun dfs(i: Int, src: MutableList<Int>, buf: MutableList<Int>, tar: MutableList<Int>) {\n    // \u82e5 src \u53ea\u5269\u4e0b\u4e00\u500b\u5713\u76e4\uff0c\u5247\u76f4\u63a5\u5c07\u5176\u79fb\u5230 tar\n    if (i == 1) {\n        move(src, tar)\n        return\n    }\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 src \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 tar \u79fb\u5230 buf\n    dfs(i - 1, src, tar, buf)\n    // \u5b50\u554f\u984c f(1) \uff1a\u5c07 src \u5269\u9918\u4e00\u500b\u5713\u76e4\u79fb\u5230 tar\n    move(src, tar)\n    // \u5b50\u554f\u984c f(i-1) \uff1a\u5c07 buf \u9802\u90e8 i-1 \u500b\u5713\u76e4\u85c9\u52a9 src \u79fb\u5230 tar\n    dfs(i - 1, buf, src, tar)\n}\n\n/* \u6c42\u89e3\u6cb3\u5167\u5854\u554f\u984c */\nfun solveHanota(A: MutableList<Int>, B: MutableList<Int>, C: MutableList<Int>) {\n    val n = A.size\n    // \u5c07 A \u9802\u90e8 n \u500b\u5713\u76e4\u85c9\u52a9 B \u79fb\u5230 C\n    dfs(n, A, B, C)\n}\n
    hanota.rb
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solve_hanota}\n
    hanota.zig
    [class]{}-[func]{move}\n\n[class]{}-[func]{dfs}\n\n[class]{}-[func]{solveHanota}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 12-15 \u6240\u793a\uff0c\u6cb3\u5167\u5854\u554f\u984c\u5f62\u6210\u4e00\u68f5\u9ad8\u5ea6\u70ba \\(n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u5b50\u554f\u984c\uff0c\u5c0d\u61c9\u4e00\u500b\u958b\u555f\u7684 dfs() \u51fd\u5f0f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u5716 12-15 \u00a0 \u6cb3\u5167\u5854\u554f\u984c\u7684\u905e\u8ff4\u6a39

    Quote

    \u6cb3\u5167\u5854\u554f\u984c\u6e90\u81ea\u4e00\u500b\u53e4\u8001\u7684\u50b3\u8aaa\u3002\u5728\u53e4\u5370\u5ea6\u7684\u4e00\u500b\u5bfa\u5edf\u88e1\uff0c\u50e7\u4fb6\u5011\u6709\u4e09\u6839\u9ad8\u5927\u7684\u947d\u77f3\u67f1\u5b50\uff0c\u4ee5\u53ca \\(64\\) \u500b\u5927\u5c0f\u4e0d\u4e00\u7684\u91d1\u5713\u76e4\u3002\u50e7\u4fb6\u5011\u4e0d\u65b7\u5730\u79fb\u52d5\u5713\u76e4\uff0c\u4ed6\u5011\u76f8\u4fe1\u5728\u6700\u5f8c\u4e00\u500b\u5713\u76e4\u88ab\u6b63\u78ba\u653e\u7f6e\u7684\u90a3\u4e00\u523b\uff0c\u9019\u500b\u4e16\u754c\u5c31\u6703\u7d50\u675f\u3002

    \u7136\u800c\uff0c\u5373\u4f7f\u50e7\u4fb6\u5011\u6bcf\u79d2\u9418\u79fb\u52d5\u4e00\u6b21\uff0c\u7e3d\u5171\u9700\u8981\u5927\u7d04 \\(2^{64} \\approx 1.84\u00d710^{19}\\) \u79d2\uff0c\u5408\u7d04 \\(5850\\) \u5104\u5e74\uff0c\u9060\u9060\u8d85\u904e\u4e86\u73fe\u5728\u5c0d\u5b87\u5b99\u5e74\u9f61\u7684\u4f30\u8a08\u3002\u6240\u4ee5\uff0c\u5018\u82e5\u9019\u500b\u50b3\u8aaa\u662f\u771f\u7684\uff0c\u6211\u5011\u61c9\u8a72\u4e0d\u9700\u8981\u64d4\u5fc3\u4e16\u754c\u672b\u65e5\u7684\u5230\u4f86\u3002

    "},{"location":"chapter_divide_and_conquer/summary/","title":"12.5 \u00a0 \u5c0f\u7d50","text":"
    • \u5206\u6cbb\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u6f14\u7b97\u6cd5\u8a2d\u8a08\u7b56\u7565\uff0c\u5305\u62ec\u5206\uff08\u5283\u5206\uff09\u548c\u6cbb\uff08\u5408\u4f75\uff09\u5169\u500b\u968e\u6bb5\uff0c\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\u3002
    • \u5224\u65b7\u662f\u5426\u662f\u5206\u6cbb\u6f14\u7b97\u6cd5\u554f\u984c\u7684\u4f9d\u64da\u5305\u62ec\uff1a\u554f\u984c\u80fd\u5426\u5206\u89e3\u3001\u5b50\u554f\u984c\u662f\u5426\u7368\u7acb\u3001\u5b50\u554f\u984c\u80fd\u5426\u5408\u4f75\u3002
    • \u5408\u4f75\u6392\u5e8f\u662f\u5206\u6cbb\u7b56\u7565\u7684\u5178\u578b\u61c9\u7528\uff0c\u5176\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5283\u5206\u70ba\u7b49\u9577\u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u76f4\u5230\u53ea\u5269\u4e00\u500b\u5143\u7d20\u6642\u958b\u59cb\u9010\u5c64\u5408\u4f75\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002
    • \u5f15\u5165\u5206\u6cbb\u7b56\u7565\u5f80\u5f80\u53ef\u4ee5\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\u3002\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u7b56\u7565\u6e1b\u5c11\u4e86\u64cd\u4f5c\u6578\u91cf\uff1b\u53e6\u4e00\u65b9\u9762\uff0c\u5206\u6cbb\u5f8c\u6709\u5229\u65bc\u7cfb\u7d71\u7684\u4e26\u884c\u6700\u4f73\u5316\u3002
    • \u5206\u6cbb\u65e2\u53ef\u4ee5\u89e3\u6c7a\u8a31\u591a\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u4e5f\u5ee3\u6cdb\u61c9\u7528\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u8a2d\u8a08\u4e2d\uff0c\u8655\u8655\u53ef\u898b\u5176\u8eab\u5f71\u3002
    • \u76f8\u8f03\u65bc\u66b4\u529b\u641c\u5c0b\uff0c\u81ea\u9069\u61c9\u641c\u5c0b\u6548\u7387\u66f4\u9ad8\u3002\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\u901a\u5e38\u662f\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u5be6\u73fe\u7684\u3002
    • \u4e8c\u5206\u641c\u5c0b\u662f\u5206\u6cbb\u7b56\u7565\u7684\u53e6\u4e00\u500b\u5178\u578b\u61c9\u7528\uff0c\u5b83\u4e0d\u5305\u542b\u5c07\u5b50\u554f\u984c\u7684\u89e3\u9032\u884c\u5408\u4f75\u7684\u6b65\u9a5f\u3002\u6211\u5011\u53ef\u4ee5\u900f\u904e\u905e\u8ff4\u5206\u6cbb\u5be6\u73fe\u4e8c\u5206\u641c\u5c0b\u3002
    • \u5728\u69cb\u5efa\u4e8c\u5143\u6a39\u7684\u554f\u984c\u4e2d\uff0c\u69cb\u5efa\u6a39\uff08\u539f\u554f\u984c\uff09\u53ef\u4ee5\u5283\u5206\u70ba\u69cb\u5efa\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\uff08\u5b50\u554f\u984c\uff09\uff0c\u9019\u53ef\u4ee5\u900f\u904e\u5283\u5206\u524d\u5e8f\u8d70\u8a2a\u548c\u4e2d\u5e8f\u8d70\u8a2a\u7684\u7d22\u5f15\u5340\u9593\u4f86\u5be6\u73fe\u3002
    • \u5728\u6cb3\u5167\u5854\u554f\u984c\u4e2d\uff0c\u4e00\u500b\u898f\u6a21\u70ba \\(n\\) \u7684\u554f\u984c\u53ef\u4ee5\u5283\u5206\u70ba\u5169\u500b\u898f\u6a21\u70ba \\(n-1\\) \u7684\u5b50\u554f\u984c\u548c\u4e00\u500b\u898f\u6a21\u70ba \\(1\\) \u7684\u5b50\u554f\u984c\u3002\u6309\u9806\u5e8f\u89e3\u6c7a\u9019\u4e09\u500b\u5b50\u554f\u984c\u5f8c\uff0c\u539f\u554f\u984c\u96a8\u4e4b\u5f97\u5230\u89e3\u6c7a\u3002
    "},{"location":"chapter_dynamic_programming/","title":"\u7b2c 14 \u7ae0 \u00a0 \u52d5\u614b\u898f\u5283","text":"

    Abstract

    \u5c0f\u6eaa\u532f\u5165\u6cb3\u6d41\uff0c\u6c5f\u6cb3\u532f\u5165\u5927\u6d77\u3002

    \u52d5\u614b\u898f\u5283\u5c07\u5c0f\u554f\u984c\u7684\u89e3\u5f59\u96c6\u6210\u5927\u554f\u984c\u7684\u7b54\u6848\uff0c\u4e00\u6b65\u6b65\u5f15\u9818\u6211\u5011\u8d70\u5411\u89e3\u6c7a\u554f\u984c\u7684\u5f7c\u5cb8\u3002

    "},{"location":"chapter_dynamic_programming/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283
    • 14.2 \u00a0 DP \u554f\u984c\u7279\u6027
    • 14.3 \u00a0 DP \u89e3\u984c\u601d\u8def
    • 14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c
    • 14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c
    • 14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c
    • 14.7 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_dynamic_programming/dp_problem_features/","title":"14.2 \u00a0 \u52d5\u614b\u898f\u5283\u554f\u984c\u7279\u6027","text":"

    \u5728\u4e0a\u4e00\u7bc0\u4e2d\uff0c\u6211\u5011\u5b78\u7fd2\u4e86\u52d5\u614b\u898f\u5283\u662f\u5982\u4f55\u900f\u904e\u5b50\u554f\u984c\u5206\u89e3\u4f86\u6c42\u89e3\u539f\u554f\u984c\u7684\u3002\u5be6\u969b\u4e0a\uff0c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u7684\u5074\u91cd\u9ede\u4e0d\u540c\u3002

    • \u5206\u6cbb\u6f14\u7b97\u6cd5\u905e\u8ff4\u5730\u5c07\u539f\u554f\u984c\u5283\u5206\u70ba\u591a\u500b\u76f8\u4e92\u7368\u7acb\u7684\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u6700\u5c0f\u5b50\u554f\u984c\uff0c\u4e26\u5728\u56de\u6eaf\u4e2d\u5408\u4f75\u5b50\u554f\u984c\u7684\u89e3\uff0c\u6700\u7d42\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002
    • \u52d5\u614b\u898f\u5283\u4e5f\u5c0d\u554f\u984c\u9032\u884c\u905e\u8ff4\u5206\u89e3\uff0c\u4f46\u8207\u5206\u6cbb\u6f14\u7b97\u6cd5\u7684\u4e3b\u8981\u5340\u5225\u662f\uff0c\u52d5\u614b\u898f\u5283\u4e2d\u7684\u5b50\u554f\u984c\u662f\u76f8\u4e92\u4f9d\u8cf4\u7684\uff0c\u5728\u5206\u89e3\u904e\u7a0b\u4e2d\u6703\u51fa\u73fe\u8a31\u591a\u91cd\u758a\u5b50\u554f\u984c\u3002
    • \u56de\u6eaf\u6f14\u7b97\u6cd5\u5728\u5617\u8a66\u548c\u56de\u9000\u4e2d\u7aae\u8209\u6240\u6709\u53ef\u80fd\u7684\u89e3\uff0c\u4e26\u900f\u904e\u526a\u679d\u907f\u514d\u4e0d\u5fc5\u8981\u7684\u641c\u5c0b\u5206\u652f\u3002\u539f\u554f\u984c\u7684\u89e3\u7531\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\u69cb\u6210\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6bcf\u500b\u6c7a\u7b56\u6b65\u9a5f\u4e4b\u524d\u7684\u5b50\u5e8f\u5217\u770b\u4f5c\u4e00\u500b\u5b50\u554f\u984c\u3002

    \u5be6\u969b\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u5e38\u7528\u4f86\u6c42\u89e3\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5b83\u5011\u4e0d\u50c5\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u9084\u5177\u6709\u53e6\u5916\u5169\u5927\u7279\u6027\uff1a\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1421","title":"14.2.1 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb","text":"

    \u6211\u5011\u5c0d\u722c\u6a13\u68af\u554f\u984c\u7a0d\u4f5c\u6539\u52d5\uff0c\u4f7f\u4e4b\u66f4\u52a0\u9069\u5408\u5c55\u793a\u6700\u512a\u5b50\u7d50\u69cb\u6982\u5ff5\u3002

    \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9

    \u7d66\u5b9a\u4e00\u500b\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u6bcf\u4e00\u968e\u6a13\u68af\u4e0a\u90fd\u8cbc\u6709\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u4f60\u5728\u8a72\u81fa\u968e\u6240\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\u3002\u7d66\u5b9a\u4e00\u500b\u975e\u8ca0\u6574\u6578\u9663\u5217 \\(cost\\) \uff0c\u5176\u4e2d \\(cost[i]\\) \u8868\u793a\u5728\u7b2c \\(i\\) \u500b\u81fa\u968e\u9700\u8981\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\\(cost[0]\\) \u70ba\u5730\u9762\uff08\u8d77\u59cb\u9ede\uff09\u3002\u8acb\u8a08\u7b97\u6700\u5c11\u9700\u8981\u4ed8\u51fa\u591a\u5c11\u4ee3\u50f9\u624d\u80fd\u5230\u9054\u9802\u90e8\uff1f

    \u5982\u5716 14-6 \u6240\u793a\uff0c\u82e5\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u968e\u7684\u4ee3\u50f9\u5206\u5225\u70ba \\(1\\)\u3001\\(10\\)\u3001\\(1\\) \uff0c\u5247\u5f9e\u5730\u9762\u722c\u5230\u7b2c \\(3\\) \u968e\u7684\u6700\u5c0f\u4ee3\u50f9\u70ba \\(2\\) \u3002

    \u5716 14-6 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u6700\u5c0f\u4ee3\u50f9

    \u8a2d \\(dp[i]\\) \u70ba\u722c\u5230\u7b2c \\(i\\) \u968e\u7d2f\u8a08\u4ed8\u51fa\u7684\u4ee3\u50f9\uff0c\u7531\u65bc\u7b2c \\(i\\) \u968e\u53ea\u53ef\u80fd\u5f9e \\(i - 1\\) \u968e\u6216 \\(i - 2\\) \u968e\u8d70\u4f86\uff0c\u56e0\u6b64 \\(dp[i]\\) \u53ea\u53ef\u80fd\u7b49\u65bc \\(dp[i - 1] + cost[i]\\) \u6216 \\(dp[i - 2] + cost[i]\\) \u3002\u70ba\u4e86\u5118\u53ef\u80fd\u6e1b\u5c11\u4ee3\u50f9\uff0c\u6211\u5011\u61c9\u8a72\u9078\u64c7\u5169\u8005\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\uff1a

    \\[ dp[i] = \\min(dp[i-1], dp[i-2]) + cost[i] \\]

    \u9019\u4fbf\u53ef\u4ee5\u5f15\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u7684\u542b\u7fa9\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u662f\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\u7684\u3002

    \u672c\u984c\u986f\u7136\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6211\u5011\u5f9e\u5169\u500b\u5b50\u554f\u984c\u6700\u512a\u89e3 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u4e2d\u6311\u9078\u51fa\u8f03\u512a\u7684\u90a3\u4e00\u500b\uff0c\u4e26\u7528\u5b83\u69cb\u5efa\u51fa\u539f\u554f\u984c \\(dp[i]\\) \u7684\u6700\u512a\u89e3\u3002

    \u90a3\u9ebc\uff0c\u4e0a\u4e00\u7bc0\u7684\u722c\u6a13\u68af\u984c\u76ee\u6709\u6c92\u6709\u6700\u512a\u5b50\u7d50\u69cb\u5462\uff1f\u5b83\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u770b\u4f3c\u662f\u4e00\u500b\u8a08\u6578\u554f\u984c\uff0c\u4f46\u5982\u679c\u63db\u4e00\u7a2e\u554f\u6cd5\uff1a\u201c\u6c42\u89e3\u6700\u5927\u65b9\u6848\u6578\u91cf\u201d\u3002\u6211\u5011\u610f\u5916\u5730\u767c\u73fe\uff0c\u96d6\u7136\u984c\u76ee\u4fee\u6539\u524d\u5f8c\u662f\u7b49\u50f9\u7684\uff0c\u4f46\u6700\u512a\u5b50\u7d50\u69cb\u6d6e\u73fe\u51fa\u4f86\u4e86\uff1a\u7b2c \\(n\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u7b49\u65bc\u7b2c \\(n-1\\) \u968e\u548c\u7b2c \\(n-2\\) \u968e\u6700\u5927\u65b9\u6848\u6578\u91cf\u4e4b\u548c\u3002\u6240\u4ee5\u8aaa\uff0c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u89e3\u91cb\u65b9\u5f0f\u6bd4\u8f03\u9748\u6d3b\uff0c\u5728\u4e0d\u540c\u554f\u984c\u4e2d\u6703\u6709\u4e0d\u540c\u7684\u542b\u7fa9\u3002

    \u6839\u64da\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u4ee5\u53ca\u521d\u59cb\u72c0\u614b \\(dp[1] = cost[1]\\) \u548c \\(dp[2] = cost[2]\\) \uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5f97\u5230\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig min_cost_climbing_stairs_dp.py
    def min_cost_climbing_stairs_dp(cost: list[int]) -> int:\n    \"\"\"\u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(cost) - 1\n    if n == 1 or n == 2:\n        return cost[n]\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = cost[1], cost[2]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = cost[1];\n  dp[2] = cost[2];\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = calloc(n + 1, sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    min_cost_climbing_stairs_dp.kt
    /* \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1]\n    dp[2] = cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{min_cost_climbing_stairs_dp}\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = cost[1];\n    dp[2] = cost[2];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-7 \u5c55\u793a\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\u3002

    \u5716 14-7 \u00a0 \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u672c\u984c\u4e5f\u53ef\u4ee5\u9032\u884c\u7a7a\u9593\u6700\u4f73\u5316\uff0c\u5c07\u4e00\u7dad\u58d3\u7e2e\u81f3\u96f6\u7dad\uff0c\u4f7f\u5f97\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    a, b := cost[1], cost[2]\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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
    [class]{}-[func]{min_cost_climbing_stairs_dp_comp}\n
    min_cost_climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\u6700\u5c0f\u4ee3\u50f9\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/dp_problem_features/#1422","title":"14.2.2 \u00a0 \u7121\u5f8c\u6548\u6027","text":"

    \u7121\u5f8c\u6548\u6027\u662f\u52d5\u614b\u898f\u5283\u80fd\u5920\u6709\u6548\u89e3\u6c7a\u554f\u984c\u7684\u91cd\u8981\u7279\u6027\u4e4b\u4e00\uff0c\u5176\u5b9a\u7fa9\u70ba\uff1a\u7d66\u5b9a\u4e00\u500b\u78ba\u5b9a\u7684\u72c0\u614b\uff0c\u5b83\u7684\u672a\u4f86\u767c\u5c55\u53ea\u8207\u7576\u524d\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002

    \u4ee5\u722c\u6a13\u68af\u554f\u984c\u70ba\u4f8b\uff0c\u7d66\u5b9a\u72c0\u614b \\(i\\) \uff0c\u5b83\u6703\u767c\u5c55\u51fa\u72c0\u614b \\(i+1\\) \u548c\u72c0\u614b \\(i+2\\) \uff0c\u5206\u5225\u5c0d\u61c9\u8df3 \\(1\\) \u6b65\u548c\u8df3 \\(2\\) \u6b65\u3002\u5728\u505a\u51fa\u9019\u5169\u7a2e\u9078\u64c7\u6642\uff0c\u6211\u5011\u7121\u9808\u8003\u616e\u72c0\u614b \\(i\\) \u4e4b\u524d\u7684\u72c0\u614b\uff0c\u5b83\u5011\u5c0d\u72c0\u614b \\(i\\) \u7684\u672a\u4f86\u6c92\u6709\u5f71\u97ff\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u7d66\u722c\u6a13\u68af\u554f\u984c\u65b0\u589e\u4e00\u500b\u7d04\u675f\uff0c\u60c5\u6cc1\u5c31\u4e0d\u4e00\u6a23\u4e86\u3002

    \u5e36\u7d04\u675f\u722c\u6a13\u68af

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u4f46\u4e0d\u80fd\u9023\u7e8c\u5169\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5982\u5716 14-8 \u6240\u793a\uff0c\u722c\u4e0a\u7b2c \\(3\\) \u968e\u50c5\u5269 \\(2\\) \u7a2e\u53ef\u884c\u65b9\u6848\uff0c\u5176\u4e2d\u9023\u7e8c\u4e09\u6b21\u8df3 \\(1\\) \u968e\u7684\u65b9\u6848\u4e0d\u6eff\u8db3\u7d04\u675f\u689d\u4ef6\uff0c\u56e0\u6b64\u88ab\u6368\u68c4\u3002

    \u5716 14-8 \u00a0 \u5e36\u7d04\u675f\u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

    \u5728\u8a72\u554f\u984c\u4e2d\uff0c\u5982\u679c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\uff0c\u90a3\u9ebc\u4e0b\u4e00\u8f2a\u5c31\u5fc5\u9808\u8df3 \\(2\\) \u968e\u3002\u9019\u610f\u5473\u8457\uff0c\u4e0b\u4e00\u6b65\u9078\u64c7\u4e0d\u80fd\u7531\u7576\u524d\u72c0\u614b\uff08\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u7368\u7acb\u6c7a\u5b9a\uff0c\u9084\u548c\u524d\u4e00\u500b\u72c0\u614b\uff08\u4e0a\u4e00\u8f2a\u6240\u5728\u6a13\u68af\u968e\u6578\uff09\u6709\u95dc\u3002

    \u4e0d\u96e3\u767c\u73fe\uff0c\u6b64\u554f\u984c\u5df2\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b \\(dp[i] = dp[i-1] + dp[i-2]\\) \u4e5f\u5931\u6548\u4e86\uff0c\u56e0\u70ba \\(dp[i-1]\\) \u4ee3\u8868\u672c\u8f2a\u8df3 \\(1\\) \u968e\uff0c\u4f46\u5176\u4e2d\u5305\u542b\u4e86\u8a31\u591a\u201c\u4e0a\u4e00\u8f2a\u662f\u8df3 \\(1\\) \u968e\u4e0a\u4f86\u7684\u201d\u65b9\u6848\uff0c\u800c\u70ba\u4e86\u6eff\u8db3\u7d04\u675f\uff0c\u6211\u5011\u5c31\u4e0d\u80fd\u5c07 \\(dp[i-1]\\) \u76f4\u63a5\u8a08\u5165 \\(dp[i]\\) \u4e2d\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u9700\u8981\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff1a\u72c0\u614b \\([i, j]\\) \u8868\u793a\u8655\u5728\u7b2c \\(i\\) \u968e\u4e26\u4e14\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(j\\) \u968e\uff0c\u5176\u4e2d \\(j \\in \\{1, 2\\}\\) \u3002\u6b64\u72c0\u614b\u5b9a\u7fa9\u6709\u6548\u5730\u5340\u5206\u4e86\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u9084\u662f \\(2\\) \u968e\uff0c\u6211\u5011\u53ef\u4ee5\u64da\u6b64\u5224\u65b7\u7576\u524d\u72c0\u614b\u662f\u5f9e\u4f55\u800c\u4f86\u7684\u3002

    • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(1\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ea\u80fd\u9078\u64c7\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 1]\\) \u53ea\u80fd\u5f9e \\(dp[i-1, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002
    • \u7576\u4e0a\u4e00\u8f2a\u8df3\u4e86 \\(2\\) \u968e\u6642\uff0c\u4e0a\u4e0a\u4e00\u8f2a\u53ef\u9078\u64c7\u8df3 \\(1\\) \u968e\u6216\u8df3 \\(2\\) \u968e\uff0c\u5373 \\(dp[i, 2]\\) \u53ef\u4ee5\u5f9e \\(dp[i-2, 1]\\) \u6216 \\(dp[i-2, 2]\\) \u8f49\u79fb\u904e\u4f86\u3002

    \u5982\u5716 14-9 \u6240\u793a\uff0c\u5728\u8a72\u5b9a\u7fa9\u4e0b\uff0c\\(dp[i, j]\\) \u8868\u793a\u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u65b9\u6848\u6578\u3002\u6b64\u6642\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ \\begin{cases} dp[i, 1] = dp[i-1, 2] \\\\ dp[i, 2] = dp[i-2, 1] + dp[i-2, 2] \\end{cases} \\]

    \u5716 14-9 \u00a0 \u8003\u616e\u7d04\u675f\u4e0b\u7684\u905e\u63a8\u95dc\u4fc2

    \u6700\u7d42\uff0c\u8fd4\u56de \\(dp[n, 1] + dp[n, 2]\\) \u5373\u53ef\uff0c\u5169\u8005\u4e4b\u548c\u4ee3\u8868\u722c\u5230\u7b2c \\(n\\) \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_constraint_dp.py
    def climbing_stairs_constraint_dp(n: int) -> int:\n    \"\"\"\u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return 1\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [[0] * 3 for _ in range(n + 1)]\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1], dp[1][2] = 1, 0\n    dp[2][1], dp[2][2] = 0, 1\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<vector<int>> dp(n + 1, vector<int>(3, 0));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[][] dp = new int[n + 1][3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[,] dp = new int[n + 1, 3];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1, 1] = 1;\n    dp[1, 2] = 0;\n    dp[2, 1] = 0;\n    dp[2, 2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n int) int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([][3]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsConstraintDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: Array(repeating: 0, count: 3), count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n) {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from(new Array(n + 1), () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsConstraintDP(n: number): number {\n    if (n === 1 || n === 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = Array.from({ length: n + 1 }, () => new Array(3));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n  if (n == 1 || n == 2) {\n    return 1;\n  }\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<List<int>> dp = List.generate(n + 1, (index) => List.filled(3, 0));\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1][1] = 1;\n  dp[1][2] = 0;\n  dp[2][1] = 0;\n  dp[2][2] = 1;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![vec![-1; 3]; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsConstraintDP(int n) {\n    if (n == 1 || n == 2) {\n        return 1;\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\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\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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
    /* \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsConstraintDP(n: Int): Int {\n    if (n == 1 || n == 2) {\n        return 1\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = Array(n + 1) { IntArray(3) }\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1\n    dp[1][2] = 0\n    dp[2][1] = 0\n    dp[2][2] = 1\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{climbing_stairs_constraint_dp}\n
    climbing_stairs_constraint_dp.zig
    // \u5e36\u7d04\u675f\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_][3]i32{ [_]i32{ -1, -1, -1 } } ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1][1] = 1;\n    dp[1][2] = 0;\n    dp[2][1] = 0;\n    dp[2][2] = 1;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u4e0a\u9762\u7684\u6848\u4f8b\u4e2d\uff0c\u7531\u65bc\u50c5\u9700\u591a\u8003\u616e\u524d\u9762\u4e00\u500b\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u900f\u904e\u64f4\u5c55\u72c0\u614b\u5b9a\u7fa9\uff0c\u4f7f\u5f97\u554f\u984c\u91cd\u65b0\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u554f\u984c\u5177\u6709\u975e\u5e38\u56b4\u91cd\u7684\u201c\u6709\u5f8c\u6548\u6027\u201d\u3002

    \u722c\u6a13\u68af\u8207\u969c\u7919\u751f\u6210

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\u3002\u898f\u5b9a\u7576\u722c\u5230\u7b2c \\(i\\) \u968e\u6642\uff0c\u7cfb\u7d71\u81ea\u52d5\u6703\u5728\u7b2c \\(2i\\) \u968e\u4e0a\u653e\u4e0a\u969c\u7919\u7269\uff0c\u4e4b\u5f8c\u6240\u6709\u8f2a\u90fd\u4e0d\u5141\u8a31\u8df3\u5230\u7b2c \\(2i\\) \u968e\u4e0a\u3002\u4f8b\u5982\uff0c\u524d\u5169\u8f2a\u5206\u5225\u8df3\u5230\u4e86\u7b2c \\(2\\)\u3001\\(3\\) \u968e\u4e0a\uff0c\u5247\u4e4b\u5f8c\u5c31\u4e0d\u80fd\u8df3\u5230\u7b2c \\(4\\)\u3001\\(6\\) \u968e\u4e0a\u3002\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5728\u9019\u500b\u554f\u984c\u4e2d\uff0c\u4e0b\u6b21\u8df3\u8e8d\u4f9d\u8cf4\u904e\u53bb\u6240\u6709\u7684\u72c0\u614b\uff0c\u56e0\u70ba\u6bcf\u4e00\u6b21\u8df3\u8e8d\u90fd\u6703\u5728\u66f4\u9ad8\u7684\u968e\u68af\u4e0a\u8a2d\u5b9a\u969c\u7919\uff0c\u4e26\u5f71\u97ff\u672a\u4f86\u7684\u8df3\u8e8d\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u52d5\u614b\u898f\u5283\u5f80\u5f80\u96e3\u4ee5\u89e3\u6c7a\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u8907\u96dc\u7684\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\uff08\u4f8b\u5982\u65c5\u884c\u5546\u554f\u984c\uff09\u4e0d\u6eff\u8db3\u7121\u5f8c\u6548\u6027\u3002\u5c0d\u65bc\u9019\u985e\u554f\u984c\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u4f7f\u7528\u5176\u4ed6\u65b9\u6cd5\uff0c\u4f8b\u5982\u555f\u767c\u5f0f\u641c\u5c0b\u3001\u907a\u50b3\u6f14\u7b97\u6cd5\u3001\u5f37\u5316\u5b78\u7fd2\u7b49\uff0c\u5f9e\u800c\u5728\u6709\u9650\u6642\u9593\u5167\u5f97\u5230\u53ef\u7528\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/","title":"14.3 \u00a0 \u52d5\u614b\u898f\u5283\u89e3\u984c\u601d\u8def","text":"

    \u4e0a\u5169\u7bc0\u4ecb\u7d39\u4e86\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4e3b\u8981\u7279\u5fb5\uff0c\u63a5\u4e0b\u4f86\u6211\u5011\u4e00\u8d77\u63a2\u7a76\u5169\u500b\u66f4\u52a0\u5be6\u7528\u7684\u554f\u984c\u3002

    1. \u5982\u4f55\u5224\u65b7\u4e00\u500b\u554f\u984c\u662f\u4e0d\u662f\u52d5\u614b\u898f\u5283\u554f\u984c\uff1f
    2. \u6c42\u89e3\u52d5\u614b\u898f\u5283\u554f\u984c\u8a72\u5f9e\u4f55\u8655\u5165\u624b\uff0c\u5b8c\u6574\u6b65\u9a5f\u662f\u4ec0\u9ebc\uff1f
    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1431","title":"14.3.1 \u00a0 \u554f\u984c\u5224\u65b7","text":"

    \u7e3d\u7684\u4f86\u8aaa\uff0c\u5982\u679c\u4e00\u500b\u554f\u984c\u5305\u542b\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u6eff\u8db3\u7121\u5f8c\u6548\u6027\uff0c\u90a3\u9ebc\u5b83\u901a\u5e38\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u6c42\u89e3\u3002\u7136\u800c\uff0c\u6211\u5011\u5f88\u96e3\u5f9e\u554f\u984c\u63cf\u8ff0\u4e2d\u76f4\u63a5\u63d0\u53d6\u51fa\u9019\u4e9b\u7279\u6027\u3002\u56e0\u6b64\u6211\u5011\u901a\u5e38\u6703\u653e\u5bec\u689d\u4ef6\uff0c\u5148\u89c0\u5bdf\u554f\u984c\u662f\u5426\u9069\u5408\u4f7f\u7528\u56de\u6eaf\uff08\u7aae\u8209\uff09\u89e3\u6c7a\u3002

    \u9069\u5408\u7528\u56de\u6eaf\u89e3\u6c7a\u7684\u554f\u984c\u901a\u5e38\u6eff\u8db3\u201c\u6c7a\u7b56\u6a39\u6a21\u578b\u201d\uff0c\u9019\u7a2e\u554f\u984c\u53ef\u4ee5\u4f7f\u7528\u6a39\u5f62\u7d50\u69cb\u4f86\u63cf\u8ff0\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u7bc0\u9ede\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\uff0c\u6bcf\u4e00\u689d\u8def\u5f91\u4ee3\u8868\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\u3002

    \u63db\u53e5\u8a71\u8aaa\uff0c\u5982\u679c\u554f\u984c\u5305\u542b\u660e\u78ba\u7684\u6c7a\u7b56\u6982\u5ff5\uff0c\u4e26\u4e14\u89e3\u662f\u900f\u904e\u4e00\u7cfb\u5217\u6c7a\u7b56\u7522\u751f\u7684\uff0c\u90a3\u9ebc\u5b83\u5c31\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u901a\u5e38\u53ef\u4ee5\u4f7f\u7528\u56de\u6eaf\u4f86\u89e3\u6c7a\u3002

    \u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u52d5\u614b\u898f\u5283\u554f\u984c\u9084\u6709\u4e00\u4e9b\u5224\u65b7\u7684\u201c\u52a0\u5206\u9805\u201d\u3002

    • \u554f\u984c\u5305\u542b\u6700\u5927\uff08\u5c0f\uff09\u6216\u6700\u591a\uff08\u5c11\uff09\u7b49\u6700\u6700\u4f73\u5316\u63cf\u8ff0\u3002
    • \u554f\u984c\u7684\u72c0\u614b\u80fd\u5920\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u3001\u591a\u7dad\u77e9\u9663\u6216\u6a39\u4f86\u8868\u793a\uff0c\u4e26\u4e14\u4e00\u500b\u72c0\u614b\u8207\u5176\u5468\u570d\u7684\u72c0\u614b\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\u3002

    \u76f8\u61c9\u5730\uff0c\u4e5f\u5b58\u5728\u4e00\u4e9b\u201c\u6e1b\u5206\u9805\u201d\u3002

    • \u554f\u984c\u7684\u76ee\u6a19\u662f\u627e\u51fa\u6240\u6709\u53ef\u80fd\u7684\u89e3\u6c7a\u65b9\u6848\uff0c\u800c\u4e0d\u662f\u627e\u51fa\u6700\u512a\u89e3\u3002
    • \u554f\u984c\u63cf\u8ff0\u4e2d\u6709\u660e\u986f\u7684\u6392\u5217\u7d44\u5408\u7684\u7279\u5fb5\uff0c\u9700\u8981\u8fd4\u56de\u5177\u9ad4\u7684\u591a\u500b\u65b9\u6848\u3002

    \u5982\u679c\u4e00\u500b\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\uff0c\u4e26\u5177\u6709\u8f03\u70ba\u660e\u986f\u7684\u201c\u52a0\u5206\u9805\u201d\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5047\u8a2d\u5b83\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\uff0c\u4e26\u5728\u6c42\u89e3\u904e\u7a0b\u4e2d\u9a57\u8b49\u5b83\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1432","title":"14.3.2 \u00a0 \u554f\u984c\u6c42\u89e3\u6b65\u9a5f","text":"

    \u52d5\u614b\u898f\u5283\u7684\u89e3\u984c\u6d41\u7a0b\u6703\u56e0\u554f\u984c\u7684\u6027\u8cea\u548c\u96e3\u5ea6\u800c\u6709\u6240\u4e0d\u540c\uff0c\u4f46\u901a\u5e38\u9075\u5faa\u4ee5\u4e0b\u6b65\u9a5f\uff1a\u63cf\u8ff0\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5efa\u7acb \\(dp\\) \u8868\uff0c\u63a8\u5c0e\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u7b49\u3002

    \u70ba\u4e86\u66f4\u5f62\u8c61\u5730\u5c55\u793a\u89e3\u984c\u6b65\u9a5f\uff0c\u6211\u5011\u4f7f\u7528\u4e00\u500b\u7d93\u5178\u554f\u984c\u201c\u6700\u5c0f\u8def\u5f91\u548c\u201d\u4f86\u8209\u4f8b\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b \\(n \\times m\\) \u7684\u4e8c\u7dad\u7db2\u683c grid \uff0c\u7db2\u683c\u4e2d\u7684\u6bcf\u500b\u55ae\u5143\u683c\u5305\u542b\u4e00\u500b\u975e\u8ca0\u6574\u6578\uff0c\u8868\u793a\u8a72\u55ae\u5143\u683c\u7684\u4ee3\u50f9\u3002\u6a5f\u5668\u4eba\u4ee5\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\u70ba\u8d77\u59cb\u9ede\uff0c\u6bcf\u6b21\u53ea\u80fd\u5411\u4e0b\u6216\u8005\u5411\u53f3\u79fb\u52d5\u4e00\u6b65\uff0c\u76f4\u81f3\u5230\u9054\u53f3\u4e0b\u89d2\u55ae\u5143\u683c\u3002\u8acb\u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230\u53f3\u4e0b\u89d2\u7684\u6700\u5c0f\u8def\u5f91\u548c\u3002

    \u5716 14-10 \u5c55\u793a\u4e86\u4e00\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u7db2\u683c\u7684\u6700\u5c0f\u8def\u5f91\u548c\u70ba \\(13\\) \u3002

    \u5716 14-10 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u793a\u4f8b\u8cc7\u6599

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u672c\u984c\u7684\u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u5c31\u662f\u5f9e\u7576\u524d\u683c\u5b50\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u3002\u8a2d\u7576\u524d\u683c\u5b50\u7684\u884c\u5217\u7d22\u5f15\u70ba \\([i, j]\\) \uff0c\u5247\u5411\u4e0b\u6216\u5411\u53f3\u8d70\u4e00\u6b65\u5f8c\uff0c\u7d22\u5f15\u8b8a\u70ba \\([i+1, j]\\) \u6216 \\([i, j+1]\\) \u3002\u56e0\u6b64\uff0c\u72c0\u614b\u61c9\u5305\u542b\u884c\u7d22\u5f15\u548c\u5217\u7d22\u5f15\u5169\u500b\u8b8a\u6578\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u5f9e\u8d77\u59cb\u9ede \\([0, 0]\\) \u8d70\u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\uff0c\u89e3\u8a18\u70ba \\(dp[i, j]\\) \u3002

    \u81f3\u6b64\uff0c\u6211\u5011\u5c31\u5f97\u5230\u4e86\u5716 14-11 \u6240\u793a\u7684\u4e8c\u7dad \\(dp\\) \u77e9\u9663\uff0c\u5176\u5c3a\u5bf8\u8207\u8f38\u5165\u7db2\u683c \\(grid\\) \u76f8\u540c\u3002

    \u5716 14-11 \u00a0 \u72c0\u614b\u5b9a\u7fa9\u8207 dp \u8868

    Note

    \u52d5\u614b\u898f\u5283\u548c\u56de\u6eaf\u904e\u7a0b\u53ef\u4ee5\u63cf\u8ff0\u70ba\u4e00\u500b\u6c7a\u7b56\u5e8f\u5217\uff0c\u800c\u72c0\u614b\u7531\u6240\u6709\u6c7a\u7b56\u8b8a\u6578\u69cb\u6210\u3002\u5b83\u61c9\u7576\u5305\u542b\u63cf\u8ff0\u89e3\u984c\u9032\u5ea6\u7684\u6240\u6709\u8b8a\u6578\uff0c\u5176\u5305\u542b\u4e86\u8db3\u5920\u7684\u8cc7\u8a0a\uff0c\u80fd\u5920\u7528\u4f86\u63a8\u5c0e\u51fa\u4e0b\u4e00\u500b\u72c0\u614b\u3002

    \u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\uff0c\u6211\u5011\u6703\u5b9a\u7fa9\u4e00\u500b \\(dp\\) \u8868\u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u72c0\u614b\u7684\u6bcf\u500b\u7368\u7acb\u8b8a\u6578\u90fd\u662f \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\u3002\u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\\(dp\\) \u8868\u662f\u72c0\u614b\u548c\u5b50\u554f\u984c\u7684\u89e3\u4e4b\u9593\u7684\u5c0d\u6620\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u5c0d\u65bc\u72c0\u614b \\([i, j]\\) \uff0c\u5b83\u53ea\u80fd\u5f9e\u4e0a\u908a\u683c\u5b50 \\([i-1, j]\\) \u548c\u5de6\u908a\u683c\u5b50 \\([i, j-1]\\) \u8f49\u79fb\u800c\u4f86\u3002\u56e0\u6b64\u6700\u512a\u5b50\u7d50\u69cb\u70ba\uff1a\u5230\u9054 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u7531 \\([i, j-1]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u8207 \\([i-1, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c\u4e2d\u8f03\u5c0f\u7684\u90a3\u4e00\u500b\u6c7a\u5b9a\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u63a8\u51fa\u5716 14-12 \u6240\u793a\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff1a

    \\[ dp[i, j] = \\min(dp[i-1, j], dp[i, j-1]) + grid[i, j] \\]

    \u5716 14-12 \u00a0 \u6700\u512a\u5b50\u7d50\u69cb\u8207\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    Note

    \u6839\u64da\u5b9a\u7fa9\u597d\u7684 \\(dp\\) \u8868\uff0c\u601d\u8003\u539f\u554f\u984c\u548c\u5b50\u554f\u984c\u7684\u95dc\u4fc2\uff0c\u627e\u51fa\u900f\u904e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u4f86\u69cb\u9020\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u7684\u65b9\u6cd5\uff0c\u5373\u6700\u512a\u5b50\u7d50\u69cb\u3002

    \u4e00\u65e6\u6211\u5011\u627e\u5230\u4e86\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u5728\u672c\u984c\u4e2d\uff0c\u8655\u5728\u9996\u884c\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u5de6\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u8655\u5728\u9996\u5217\u7684\u72c0\u614b\u53ea\u80fd\u5f9e\u5176\u4e0a\u908a\u7684\u72c0\u614b\u5f97\u4f86\uff0c\u56e0\u6b64\u9996\u884c \\(i = 0\\) \u548c\u9996\u5217 \\(j = 0\\) \u662f\u908a\u754c\u689d\u4ef6\u3002

    \u5982\u5716 14-13 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u683c\u5b50\u662f\u7531\u5176\u5de6\u65b9\u683c\u5b50\u548c\u4e0a\u65b9\u683c\u5b50\u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u6211\u5011\u4f7f\u7528\u8ff4\u5708\u4f86\u8d70\u8a2a\u77e9\u9663\uff0c\u5916\u8ff4\u5708\u8d70\u8a2a\u5404\u884c\uff0c\u5167\u8ff4\u5708\u8d70\u8a2a\u5404\u5217\u3002

    \u5716 14-13 \u00a0 \u908a\u754c\u689d\u4ef6\u8207\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    Note

    \u908a\u754c\u689d\u4ef6\u5728\u52d5\u614b\u898f\u5283\u4e2d\u7528\u65bc\u521d\u59cb\u5316 \\(dp\\) \u8868\uff0c\u5728\u641c\u5c0b\u4e2d\u7528\u65bc\u526a\u679d\u3002

    \u72c0\u614b\u8f49\u79fb\u9806\u5e8f\u7684\u6838\u5fc3\u662f\u8981\u4fdd\u8b49\u5728\u8a08\u7b97\u7576\u524d\u554f\u984c\u7684\u89e3\u6642\uff0c\u6240\u6709\u5b83\u4f9d\u8cf4\u7684\u66f4\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u90fd\u5df2\u7d93\u88ab\u6b63\u78ba\u5730\u8a08\u7b97\u51fa\u4f86\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u5df2\u7d93\u53ef\u4ee5\u76f4\u63a5\u5beb\u51fa\u52d5\u614b\u898f\u5283\u7a0b\u5f0f\u78bc\u3002\u7136\u800c\u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u601d\u60f3\uff0c\u56e0\u6b64\u6309\u7167\u201c\u66b4\u529b\u641c\u5c0b \\(\\rightarrow\\) \u8a18\u61b6\u5316\u641c\u5c0b \\(\\rightarrow\\) \u52d5\u614b\u898f\u5283\u201d\u7684\u9806\u5e8f\u5be6\u73fe\u66f4\u52a0\u7b26\u5408\u601d\u7dad\u7fd2\u6163\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u5f9e\u72c0\u614b \\([i, j]\\) \u958b\u59cb\u641c\u5c0b\uff0c\u4e0d\u65b7\u5206\u89e3\u70ba\u66f4\u5c0f\u7684\u72c0\u614b \\([i-1, j]\\) \u548c \\([i, j-1]\\) \uff0c\u905e\u8ff4\u51fd\u5f0f\u5305\u62ec\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, j]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5f9e \\([0, 0]\\) \u5230 \\([i, j]\\) \u7684\u6700\u5c0f\u8def\u5f91\u548c \\(dp[i, j]\\) \u3002
    • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576 \\(i = 0\\) \u4e14 \\(j = 0\\) \u6642\uff0c\u8fd4\u56de\u4ee3\u50f9 \\(grid[0, 0]\\) \u3002
    • \u526a\u679d\uff1a\u7576 \\(i < 0\\) \u6642\u6216 \\(j < 0\\) \u6642\u7d22\u5f15\u8d8a\u754c\uff0c\u6b64\u6642\u8fd4\u56de\u4ee3\u50f9 \\(+\\infty\\) \uff0c\u4ee3\u8868\u4e0d\u53ef\u884c\u3002

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\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\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up = min_path_sum_dfs(grid, i - 1, j)\n    left = min_path_sum_dfs(grid, i, j - 1)\n    # \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(vector<vector<int>> &grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) != INT_MAX ? min(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.java
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.cs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint MinPathSumDFS(int[][] grid, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFS(grid, i - 1, j);\n    int left = MinPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.Min(left, up) + grid[i][j];\n}\n
    min_path_sum.go
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFS(grid, i-1, j)\n    left := minPathSumDFS(grid, i, j-1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return int(math.Min(float64(left), float64(up))) + grid[i][j]\n}\n
    min_path_sum.swift
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc minPathSumDFS(grid: [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(grid, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.ts
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction minPathSumDFS(\n    grid: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFS(grid, i - 1, j);\n    const left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return Math.min(left, up) + grid[i][j];\n}\n
    min_path_sum.dart
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(List<List<int>> grid, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFS(grid, i - 1, j);\n  int left = minPathSumDFS(grid, i, j - 1);\n  // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  return min(left, up) + grid[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfn min_path_sum_dfs(grid: &Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    std::cmp::min(left, up) + grid[i as usize][j as usize]\n}\n
    min_path_sum.c
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nint minPathSumDFS(int grid[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFS(grid, i - 1, j);\n    int left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return myMin(left, up) != INT_MAX ? myMin(left, up) + grid[i][j] : INT_MAX;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b */\nfun minPathSumDFS(grid: Array<IntArray>, i: Int, j: Int): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFS(grid, i - 1, j)\n    val left = minPathSumDFS(grid, i, j - 1)\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return min(left, up) + grid[i][j]\n}\n
    min_path_sum.rb
    [class]{}-[func]{min_path_sum_dfs}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u66b4\u529b\u641c\u5c0b\nfn minPathSumDFS(grid: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFS(grid, i - 1, j);\n    var left = minPathSumDFS(grid, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    return @min(left, up) + grid[@as(usize, @intCast(i))][@as(usize, @intCast(j))];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-14 \u7d66\u51fa\u4e86\u4ee5 \\(dp[2, 1]\\) \u70ba\u6839\u7bc0\u9ede\u7684\u905e\u8ff4\u6a39\uff0c\u5176\u4e2d\u5305\u542b\u4e00\u4e9b\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5176\u6578\u91cf\u6703\u96a8\u8457\u7db2\u683c grid \u7684\u5c3a\u5bf8\u8b8a\u5927\u800c\u6025\u5287\u589e\u591a\u3002

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u9020\u6210\u91cd\u758a\u5b50\u554f\u984c\u7684\u539f\u56e0\u70ba\uff1a\u5b58\u5728\u591a\u689d\u8def\u5f91\u53ef\u4ee5\u5f9e\u5de6\u4e0a\u89d2\u5230\u9054\u67d0\u4e00\u55ae\u5143\u683c\u3002

    \u5716 14-14 \u00a0 \u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

    \u6bcf\u500b\u72c0\u614b\u90fd\u6709\u5411\u4e0b\u548c\u5411\u53f3\u5169\u7a2e\u9078\u64c7\uff0c\u5f9e\u5de6\u4e0a\u89d2\u8d70\u5230\u53f3\u4e0b\u89d2\u7e3d\u5171\u9700\u8981 \\(m + n - 2\\) \u6b65\uff0c\u6240\u4ee5\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^{m + n})\\) \u3002\u8acb\u6ce8\u610f\uff0c\u9019\u7a2e\u8a08\u7b97\u65b9\u5f0f\u672a\u8003\u616e\u81e8\u8fd1\u7db2\u683c\u908a\u754c\u7684\u60c5\u6cc1\uff0c\u7576\u5230\u9054\u7db2\u8def\u908a\u754c\u6642\u53ea\u5269\u4e0b\u4e00\u7a2e\u9078\u64c7\uff0c\u56e0\u6b64\u5be6\u969b\u7684\u8def\u5f91\u6578\u91cf\u6703\u5c11\u4e00\u4e9b\u3002

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u6211\u5011\u5f15\u5165\u4e00\u500b\u548c\u7db2\u683c grid \u76f8\u540c\u5c3a\u5bf8\u7684\u8a18\u61b6\u4e32\u5217 mem \uff0c\u7528\u65bc\u8a18\u9304\u5404\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5c07\u91cd\u758a\u5b50\u554f\u984c\u9032\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 and j == 0:\n        return grid[0][0]\n    # \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 or j < 0:\n        return inf\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1:\n        return mem[i][j]\n    # \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    # \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n
    min_path_sum.cpp
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(vector<vector<int>> &grid, vector<vector<int>> &mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Integer.MAX_VALUE;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint MinPathSumDFSMem(int[][] grid, int[][] mem, int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return int.MaxValue;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = MinPathSumDFSMem(grid, mem, i - 1, j);\n    int left = MinPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid, mem [][]int, i, j int) int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return math.MaxInt\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    up := minPathSumDFSMem(grid, mem, i-1, j)\n    left := minPathSumDFSMem(grid, mem, i, j-1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc minPathSumDFSMem(grid: [[Int]], mem: inout [[Int]], i: Int, j: Int) -> Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0, j == 0 {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return .max\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][j] != -1 {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.js
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(grid, mem, i, j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] !== -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction minPathSumDFSMem(\n    grid: Array<Array<number>>,\n    mem: Array<Array<number>>,\n    i: number,\n    j: number\n): number {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i === 0 && j === 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Infinity;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    const up = minPathSumDFSMem(grid, mem, i - 1, j);\n    const left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(List<List<int>> grid, List<List<int>> mem, int i, int j) {\n  // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n  if (i == 0 && j == 0) {\n    return grid[0][0];\n  }\n  // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n  if (i < 0 || j < 0) {\n    // \u5728 Dart \u4e2d\uff0cint \u578b\u5225\u662f\u56fa\u5b9a\u7bc4\u570d\u7684\u6574\u6578\uff0c\u4e0d\u5b58\u5728\u8868\u793a\u201c\u7121\u7aae\u5927\u201d\u7684\u503c\n    return BigInt.from(2).pow(31).toInt();\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][j] != -1) {\n    return mem[i][j];\n  }\n  // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  int up = minPathSumDFSMem(grid, mem, i - 1, j);\n  int left = minPathSumDFSMem(grid, mem, i, j - 1);\n  // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n  mem[i][j] = min(left, up) + grid[i][j];\n  return mem[i][j];\n}\n
    min_path_sum.rs
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn min_path_sum_dfs_mem(grid: &Vec<Vec<i32>>, mem: &mut Vec<Vec<i32>>, i: i32, j: i32) -> i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if i == 0 && j == 0 {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if i < 0 || j < 0 {\n        return i32::MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\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\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint minPathSumDFSMem(int grid[MAX_SIZE][MAX_SIZE], int mem[MAX_SIZE][MAX_SIZE], int i, int j) {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return INT_MAX;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j];\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    int up = minPathSumDFSMem(grid, mem, i - 1, j);\n    int left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun minPathSumDFSMem(\n    grid: Array<IntArray>,\n    mem: Array<IntArray>,\n    i: Int,\n    j: Int\n): Int {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 && j == 0) {\n        return grid[0][0]\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 || j < 0) {\n        return Int.MAX_VALUE\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][j] != -1) {\n        return mem[i][j]\n    }\n    // \u5de6\u908a\u548c\u4e0a\u908a\u55ae\u5143\u683c\u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    val up = minPathSumDFSMem(grid, mem, i - 1, j)\n    val left = minPathSumDFSMem(grid, mem, i, j - 1)\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    mem[i][j] = min(left, up) + grid[i][j]\n    return mem[i][j]\n}\n
    min_path_sum.rb
    [class]{}-[func]{min_path_sum_dfs_mem}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn minPathSumDFSMem(grid: anytype, mem: anytype, i: i32, j: i32) i32 {\n    // \u82e5\u70ba\u5de6\u4e0a\u89d2\u55ae\u5143\u683c\uff0c\u5247\u7d42\u6b62\u641c\u5c0b\n    if (i == 0 and j == 0) {\n        return grid[0][0];\n    }\n    // \u82e5\u884c\u5217\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de +\u221e \u4ee3\u50f9\n    if (i < 0 or j < 0) {\n        return std.math.maxInt(i32);\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\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    // \u8a08\u7b97\u5f9e\u5de6\u4e0a\u89d2\u5230 (i-1, j) \u548c (i, j-1) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    var up = minPathSumDFSMem(grid, mem, i - 1, j);\n    var left = minPathSumDFSMem(grid, mem, i, j - 1);\n    // \u8fd4\u56de\u5f9e\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\n    // \u8a18\u9304\u4e26\u8fd4\u56de\u5de6\u4e0a\u89d2\u5230 (i, j) \u7684\u6700\u5c0f\u8def\u5f91\u4ee3\u50f9\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-15 \u6240\u793a\uff0c\u5728\u5f15\u5165\u8a18\u61b6\u5316\u5f8c\uff0c\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u72c0\u614b\u7e3d\u6578\uff0c\u5373\u7db2\u683c\u5c3a\u5bf8 \\(O(nm)\\) \u3002

    \u5716 14-15 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\u52d5\u614b\u898f\u5283\u89e3\u6cd5\uff0c\u7a0b\u5f0f\u78bc\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m):\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in range(1, n):\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j < m; j++ {\n        dp[0][j] = dp[0][j-1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i := 1; i < n; i++ {\n        dp[i][0] = dp[i-1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ..< m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1 ..< n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for i in 1..n {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..<m) {\n        dp[0][j] = dp[0][j - 1] + grid[0][j]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (i in 1..<n) {\n        dp[i][0] = dp[i - 1][0] + grid[i][0]\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    [class]{}-[func]{min_path_sum_dp}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m) |j| {\n        dp[0][j] = dp[0][j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    for (1..n) |i| {\n        dp[i][0] = dp[i - 1][0] + grid[i][0];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-16 \u5c55\u793a\u4e86\u6700\u5c0f\u8def\u5f91\u548c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\uff0c\u5176\u8d70\u8a2a\u4e86\u6574\u500b\u7db2\u683c\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

    \u9663\u5217 dp \u5927\u5c0f\u70ba \\(n \\times m\\) \uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nm)\\) \u3002

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

    \u5716 14-16 \u00a0 \u6700\u5c0f\u8def\u5f91\u548c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/dp_solution_pipeline/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u6bcf\u500b\u683c\u5b50\u53ea\u8207\u5176\u5de6\u908a\u548c\u4e0a\u908a\u7684\u683c\u5b50\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u53ea\u7528\u4e00\u500b\u55ae\u884c\u9663\u5217\u4f86\u5be6\u73fe \\(dp\\) \u8868\u3002

    \u8acb\u6ce8\u610f\uff0c\u56e0\u70ba\u9663\u5217 dp \u53ea\u80fd\u8868\u793a\u4e00\u884c\u7684\u72c0\u614b\uff0c\u6240\u4ee5\u6211\u5011\u7121\u6cd5\u63d0\u524d\u521d\u59cb\u5316\u9996\u5217\u72c0\u614b\uff0c\u800c\u662f\u5728\u8d70\u8a2a\u6bcf\u884c\u6642\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(grid), len(grid[0])\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * m\n    # \u72c0\u614b\u8f49\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j < m; j++) {\n        dp[j] = dp[j - 1] + grid[0][j];\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i := 1; i < n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ..< n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i < n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    dp[0] = dp[0] + grid[i][0];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i < n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0];\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    min_path_sum.kt
    /* \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..<n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        dp[0] = dp[0] + grid[i][0]\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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
    [class]{}-[func]{min_path_sum_dp_comp}\n
    min_path_sum.zig
    // \u6700\u5c0f\u8def\u5f91\u548c\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n) |i| {\n        // \u72c0\u614b\u8f49\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/","title":"14.6 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c","text":"

    \u7de8\u8f2f\u8ddd\u96e2\uff0c\u4e5f\u7a31 Levenshtein \u8ddd\u96e2\uff0c\u6307\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u4e92\u76f8\u8f49\u63db\u7684\u6700\u5c11\u4fee\u6539\u6b21\u6578\uff0c\u901a\u5e38\u7528\u65bc\u5728\u8cc7\u8a0a\u6aa2\u7d22\u548c\u81ea\u7136\u8a9e\u8a00\u8655\u7406\u4e2d\u5ea6\u91cf\u5169\u500b\u5e8f\u5217\u7684\u76f8\u4f3c\u5ea6\u3002

    Question

    \u8f38\u5165\u5169\u500b\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \uff0c\u8fd4\u56de\u5c07 \\(s\\) \u8f49\u63db\u70ba \\(t\\) \u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

    \u4f60\u53ef\u4ee5\u5728\u4e00\u500b\u5b57\u4e32\u4e2d\u9032\u884c\u4e09\u7a2e\u7de8\u8f2f\u64cd\u4f5c\uff1a\u63d2\u5165\u4e00\u500b\u5b57\u5143\u3001\u522a\u9664\u4e00\u500b\u5b57\u5143\u3001\u5c07\u5b57\u5143\u66ff\u63db\u70ba\u4efb\u610f\u4e00\u500b\u5b57\u5143\u3002

    \u5982\u5716 14-27 \u6240\u793a\uff0c\u5c07 kitten \u8f49\u63db\u70ba sitting \u9700\u8981\u7de8\u8f2f 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u8207 1 \u6b21\u65b0\u589e\u64cd\u4f5c\uff1b\u5c07 hello \u8f49\u63db\u70ba algo \u9700\u8981 3 \u6b65\uff0c\u5305\u62ec 2 \u6b21\u66ff\u63db\u64cd\u4f5c\u548c 1 \u6b21\u522a\u9664\u64cd\u4f5c\u3002

    \u5716 14-27 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u793a\u4f8b\u8cc7\u6599

    \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u53ef\u4ee5\u5f88\u81ea\u7136\u5730\u7528\u6c7a\u7b56\u6a39\u6a21\u578b\u4f86\u89e3\u91cb\u3002\u5b57\u4e32\u5c0d\u61c9\u6a39\u7bc0\u9ede\uff0c\u4e00\u8f2a\u6c7a\u7b56\uff08\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\uff09\u5c0d\u61c9\u6a39\u7684\u4e00\u689d\u908a\u3002

    \u5982\u5716 14-28 \u6240\u793a\uff0c\u5728\u4e0d\u9650\u5236\u64cd\u4f5c\u7684\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u500b\u7bc0\u9ede\u90fd\u53ef\u4ee5\u6d3e\u751f\u51fa\u8a31\u591a\u689d\u908a\uff0c\u6bcf\u689d\u908a\u5c0d\u61c9\u4e00\u7a2e\u64cd\u4f5c\uff0c\u9019\u610f\u5473\u8457\u5f9e hello \u8f49\u63db\u5230 algo \u6709\u8a31\u591a\u7a2e\u53ef\u80fd\u7684\u8def\u5f91\u3002

    \u5f9e\u6c7a\u7b56\u6a39\u7684\u89d2\u5ea6\u770b\uff0c\u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u7bc0\u9ede hello \u548c\u7bc0\u9ede algo \u4e4b\u9593\u7684\u6700\u77ed\u8def\u5f91\u3002

    \u5716 14-28 \u00a0 \u57fa\u65bc\u6c7a\u7b56\u6a39\u6a21\u578b\u8868\u793a\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u6bcf\u4e00\u8f2a\u7684\u6c7a\u7b56\u662f\u5c0d\u5b57\u4e32 \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\u64cd\u4f5c\u3002

    \u6211\u5011\u5e0c\u671b\u5728\u7de8\u8f2f\u64cd\u4f5c\u7684\u904e\u7a0b\u4e2d\uff0c\u554f\u984c\u7684\u898f\u6a21\u9010\u6f38\u7e2e\u5c0f\uff0c\u9019\u6a23\u624d\u80fd\u69cb\u5efa\u5b50\u554f\u984c\u3002\u8a2d\u5b57\u4e32 \\(s\\) \u548c \\(t\\) \u7684\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \uff0c\u6211\u5011\u5148\u8003\u616e\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u3002

    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u76f8\u540c\uff0c\u6211\u5011\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u76f4\u63a5\u8003\u616e \\(s[n-2]\\) \u548c \\(t[m-2]\\) \u3002
    • \u82e5 \\(s[n-1]\\) \u548c \\(t[m-1]\\) \u4e0d\u540c\uff0c\u6211\u5011\u9700\u8981\u5c0d \\(s\\) \u9032\u884c\u4e00\u6b21\u7de8\u8f2f\uff08\u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\uff09\uff0c\u4f7f\u5f97\u5169\u5b57\u4e32\u5c3e\u90e8\u7684\u5b57\u5143\u76f8\u540c\uff0c\u5f9e\u800c\u53ef\u4ee5\u8df3\u904e\u5b83\u5011\uff0c\u8003\u616e\u898f\u6a21\u66f4\u5c0f\u7684\u554f\u984c\u3002

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u6211\u5011\u5728\u5b57\u4e32 \\(s\\) \u4e2d\u9032\u884c\u7684\u6bcf\u4e00\u8f2a\u6c7a\u7b56\uff08\u7de8\u8f2f\u64cd\u4f5c\uff09\uff0c\u90fd\u6703\u4f7f\u5f97 \\(s\\) \u548c \\(t\\) \u4e2d\u5269\u9918\u7684\u5f85\u5339\u914d\u5b57\u5143\u767c\u751f\u8b8a\u5316\u3002\u56e0\u6b64\uff0c\u72c0\u614b\u70ba\u7576\u524d\u5728 \\(s\\) \u548c \\(t\\) \u4e2d\u8003\u616e\u7684\u7b2c \\(i\\) \u548c\u7b2c \\(j\\) \u500b\u5b57\u5143\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u72c0\u614b \\([i, j]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\uff1a\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002

    \u81f3\u6b64\uff0c\u5f97\u5230\u4e00\u500b\u5c3a\u5bf8\u70ba \\((i+1) \\times (j+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u8003\u616e\u5b50\u554f\u984c \\(dp[i, j]\\) \uff0c\u5176\u5c0d\u61c9\u7684\u5169\u500b\u5b57\u4e32\u7684\u5c3e\u90e8\u5b57\u5143\u70ba \\(s[i-1]\\) \u548c \\(t[j-1]\\) \uff0c\u53ef\u6839\u64da\u4e0d\u540c\u7de8\u8f2f\u64cd\u4f5c\u5206\u70ba\u5716 14-29 \u6240\u793a\u7684\u4e09\u7a2e\u60c5\u6cc1\u3002

    1. \u5728 \\(s[i-1]\\) \u4e4b\u5f8c\u65b0\u589e \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i, j-1]\\) \u3002
    2. \u522a\u9664 \\(s[i-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j]\\) \u3002
    3. \u5c07 \\(s[i-1]\\) \u66ff\u63db\u70ba \\(t[j-1]\\) \uff0c\u5247\u5269\u9918\u5b50\u554f\u984c \\(dp[i-1, j-1]\\) \u3002

    \u5716 14-29 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u72c0\u614b\u8f49\u79fb

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u53ef\u5f97\u6700\u512a\u5b50\u7d50\u69cb\uff1a\\(dp[i, j]\\) \u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(dp[i, j-1]\\)\u3001\\(dp[i-1, j]\\)\u3001\\(dp[i-1, j-1]\\) \u4e09\u8005\u4e2d\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u518d\u52a0\u4e0a\u672c\u6b21\u7684\u7de8\u8f2f\u6b65\u6578 \\(1\\) \u3002\u5c0d\u61c9\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, j] = \\min(dp[i, j-1], dp[i-1, j], dp[i-1, j-1]) + 1 \\]

    \u8acb\u6ce8\u610f\uff0c\u7576 \\(s[i-1]\\) \u548c \\(t[j-1]\\) \u76f8\u540c\u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\uff0c\u9019\u7a2e\u60c5\u6cc1\u4e0b\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, j] = dp[i-1, j-1] \\]

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u5169\u5b57\u4e32\u90fd\u70ba\u7a7a\u6642\uff0c\u7de8\u8f2f\u6b65\u6578\u70ba \\(0\\) \uff0c\u5373 \\(dp[0, 0] = 0\\) \u3002\u7576 \\(s\\) \u70ba\u7a7a\u4f46 \\(t\\) \u4e0d\u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(t\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u884c \\(dp[0, j] = j\\) \u3002\u7576 \\(s\\) \u4e0d\u70ba\u7a7a\u4f46 \\(t\\) \u70ba\u7a7a\u6642\uff0c\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u7b49\u65bc \\(s\\) \u7684\u9577\u5ea6\uff0c\u5373\u9996\u5217 \\(dp[i, 0] = i\\) \u3002

    \u89c0\u5bdf\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\uff0c\u89e3 \\(dp[i, j]\\) \u4f9d\u8cf4\u5de6\u65b9\u3001\u4e0a\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u89e3\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [[0] * (m + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint editDistanceDP(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[][] dp = new int[n + 1][m + 1];\n    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\nint EditDistanceDP(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[,] dp = new int[n + 1, m + 1];\n    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i, j] = dp[i - 1, j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i-1][j-1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[i][j] = dp[i - 1][j - 1];\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    for (int i = 0; i <= n; i++) {\n        free(dp[i]);\n    }\n    return res;\n}\n
    edit_distance.kt
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1]\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    [class]{}-[func]{edit_distance_dp}\n
    edit_distance.zig
    // \u7de8\u8f2f\u8ddd\u96e2\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[i][j] = dp[i - 1][j - 1];\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-30 \u6240\u793a\uff0c\u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u904e\u7a0b\u8207\u80cc\u5305\u554f\u984c\u975e\u5e38\u985e\u4f3c\uff0c\u90fd\u53ef\u4ee5\u770b\u4f5c\u586b\u5beb\u4e00\u500b\u4e8c\u7dad\u7db2\u683c\u7684\u904e\u7a0b\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u5716 14-30 \u00a0 \u7de8\u8f2f\u8ddd\u96e2\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/edit_distance_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc \\(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]\\) \u8f49\u79fb\u800c\u4f86\u7684\uff0c\u800c\u6b63\u5e8f\u8d70\u8a2a\u6703\u4e1f\u5931\u5de6\u4e0a\u65b9 \\(dp[i-1, j-1]\\) \uff0c\u5012\u5e8f\u8d70\u8a2a\u7121\u6cd5\u63d0\u524d\u69cb\u5efa \\(dp[i, j-1]\\) \uff0c\u56e0\u6b64\u5169\u7a2e\u8d70\u8a2a\u9806\u5e8f\u90fd\u4e0d\u53ef\u53d6\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 leftup \u4f86\u66ab\u5b58\u5de6\u4e0a\u65b9\u7684\u89e3 \\(dp[i-1, j-1]\\) \uff0c\u5f9e\u800c\u53ea\u9700\u8003\u616e\u5de6\u65b9\u548c\u4e0a\u65b9\u7684\u89e3\u3002\u6b64\u6642\u7684\u60c5\u6cc1\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u53ef\u4f7f\u7528\u6b63\u5e8f\u8d70\u8a2a\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig edit_distance.py
    def edit_distance_dp_comp(s: str, t: str) -> int:\n    \"\"\"\u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n, m = len(s), len(t)\n    dp = [0] * (m + 1)\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in range(1, m + 1):\n        dp[j] = j\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in range(1, n + 1):\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftup = dp[0]  # \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] += 1\n        # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in range(1, m + 1):\n            temp = dp[j]\n            if s[i - 1] == t[j - 1]:\n                # \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            else:\n                # \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(dp[j - 1], dp[j], leftup) + 1\n            leftup = temp  # \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    return dp[m]\n
    edit_distance.cpp
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(string s, string t) {\n    int n = s.length(), m = t.length();\n    vector<int> dp(m + 1, 0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.java
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n    int n = s.length(), m = t.length();\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(Math.min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.cs
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint EditDistanceDPComp(string s, string t) {\n    int n = s.Length, m = t.Length;\n    int[] dp = new int[m + 1];\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.Min(Math.Min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.go
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc editDistanceDPComp(s string, t string) int {\n    n := len(s)\n    m := len(t)\n    dp := make([]int, m+1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j := 1; j <= m; j++ {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i := 1; i <= n; i++ {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        leftUp := dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j := 1; j <= m; j++ {\n            temp := dp[j]\n            if s[i-1] == t[j-1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftUp\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = MinInt(MinInt(dp[j-1], dp[j]), leftUp) + 1\n            }\n            leftUp = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.swift
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1 ... m {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1 ... n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for j in 1 ... m {\n            let temp = dp[j]\n            if s.utf8CString[i - 1] == t.utf8CString[j - 1] {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.js
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunction editDistanceDPComp(s, t) {\n    const n = s.length,\n        m = t.length;\n    const dp = new Array(m + 1).fill(0);\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.ts
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (let j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (let i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = Math.min(dp[j - 1], dp[j], leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    edit_distance.dart
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(String s, String t) {\n  int n = s.length, m = t.length;\n  List<int> dp = List.filled(m + 1, 0);\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n  for (int j = 1; j <= m; j++) {\n    dp[j] = j;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n  for (int i = 1; i <= n; i++) {\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n    int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n    dp[0] = i;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n    for (int j = 1; j <= m; j++) {\n      int temp = dp[j];\n      if (s[i - 1] == t[j - 1]) {\n        // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n        dp[j] = leftup;\n      } else {\n        // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n        dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1;\n      }\n      leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n    }\n  }\n  return dp[m];\n}\n
    edit_distance.rs
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for j in 1..m {\n        dp[j] = j as i32;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for i in 1..=n {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        let mut leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i as i32;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = std::cmp::min(std::cmp::min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    dp[m]\n}\n
    edit_distance.c
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nint editDistanceDPComp(char *s, char *t, int n, int m) {\n    int *dp = calloc(m + 1, sizeof(int));\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (int j = 1; j <= m; j++) {\n        dp[j] = j;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (int i = 1; i <= n; i++) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        int leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i;\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (int j = 1; j <= m; j++) {\n            int temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = myMin(myMin(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    int res = dp[m];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    edit_distance.kt
    /* \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfun editDistanceDPComp(s: String, t: String): Int {\n    val n = s.length\n    val m = t.length\n    val dp = IntArray(m + 1)\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (j in 1..m) {\n        dp[j] = j\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (i in 1..n) {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0] // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = i\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (j in 1..m) {\n            val temp = dp[j]\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = min(min(dp[j - 1], dp[j]), leftup) + 1\n            }\n            leftup = temp // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m]\n}\n
    edit_distance.rb
    [class]{}-[func]{edit_distance_dp_comp}\n
    edit_distance.zig
    // \u7de8\u8f2f\u8ddd\u96e2\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\n    for (1..m + 1) |j| {\n        dp[j] = @intCast(j);\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\n    for (1..n + 1) |i| {\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u5217\n        var leftup = dp[0]; // \u66ab\u5b58 dp[i-1, j-1]\n        dp[0] = @intCast(i);\n        // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u5217\n        for (1..m + 1) |j| {\n            var temp = dp[j];\n            if (s[i - 1] == t[j - 1]) {\n                // \u82e5\u5169\u5b57\u5143\u76f8\u7b49\uff0c\u5247\u76f4\u63a5\u8df3\u904e\u6b64\u5169\u5b57\u5143\n                dp[j] = leftup;\n            } else {\n                // \u6700\u5c11\u7de8\u8f2f\u6b65\u6578 = \u63d2\u5165\u3001\u522a\u9664\u3001\u66ff\u63db\u9019\u4e09\u7a2e\u64cd\u4f5c\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578 + 1\n                dp[j] = @min(@min(dp[j - 1], dp[j]), leftup) + 1;\n            }\n            leftup = temp; // \u66f4\u65b0\u70ba\u4e0b\u4e00\u8f2a\u7684 dp[i-1, j-1]\n        }\n    }\n    return dp[m];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/","title":"14.1 \u00a0 \u521d\u63a2\u52d5\u614b\u898f\u5283","text":"

    \u52d5\u614b\u898f\u5283\uff08dynamic programming\uff09\u662f\u4e00\u500b\u91cd\u8981\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\uff0c\u5b83\u5c07\u4e00\u500b\u554f\u984c\u5206\u89e3\u70ba\u4e00\u7cfb\u5217\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u907f\u514d\u91cd\u8907\u8a08\u7b97\uff0c\u5f9e\u800c\u5927\u5e45\u63d0\u5347\u6642\u9593\u6548\u7387\u3002

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5f9e\u4e00\u500b\u7d93\u5178\u4f8b\u984c\u5165\u624b\uff0c\u5148\u7d66\u51fa\u5b83\u7684\u66b4\u529b\u56de\u6eaf\u89e3\u6cd5\uff0c\u89c0\u5bdf\u5176\u4e2d\u5305\u542b\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u518d\u9010\u6b65\u5c0e\u51fa\u66f4\u9ad8\u6548\u7684\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

    \u722c\u6a13\u68af

    \u7d66\u5b9a\u4e00\u500b\u5171\u6709 \\(n\\) \u968e\u7684\u6a13\u68af\uff0c\u4f60\u6bcf\u6b65\u53ef\u4ee5\u4e0a \\(1\\) \u968e\u6216\u8005 \\(2\\) \u968e\uff0c\u8acb\u554f\u6709\u591a\u5c11\u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\uff1f

    \u5982\u5716 14-1 \u6240\u793a\uff0c\u5c0d\u65bc\u4e00\u500b \\(3\\) \u968e\u6a13\u68af\uff0c\u5171\u6709 \\(3\\) \u7a2e\u65b9\u6848\u53ef\u4ee5\u722c\u5230\u6a13\u9802\u3002

    \u5716 14-1 \u00a0 \u722c\u5230\u7b2c 3 \u968e\u7684\u65b9\u6848\u6578\u91cf

    \u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u65b9\u6848\u6578\u91cf\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u900f\u904e\u56de\u6eaf\u4f86\u7aae\u8209\u6240\u6709\u53ef\u80fd\u6027\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u5c07\u722c\u6a13\u68af\u60f3\u8c61\u70ba\u4e00\u500b\u591a\u8f2a\u9078\u64c7\u7684\u904e\u7a0b\uff1a\u5f9e\u5730\u9762\u51fa\u767c\uff0c\u6bcf\u8f2a\u9078\u64c7\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u6bcf\u7576\u5230\u9054\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u65b9\u6848\u6578\u91cf\u52a0 \\(1\\) \uff0c\u7576\u8d8a\u904e\u6a13\u68af\u9802\u90e8\u6642\u5c31\u5c07\u5176\u526a\u679d\u3002\u7a0b\u5f0f\u78bc\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    # \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n:\n        res[0] += 1\n    # \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices:\n        # \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n:\n            continue\n        # \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        # \u56de\u9000\n\ndef climbing_stairs_backtrack(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u56de\u6eaf\"\"\"\n    choices = [1, 2]  # \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    state = 0  # \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    res = [0]  # \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (auto &choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    vector<int> choices = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;                // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    vector<int> res = {0};        // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (Integer choice : choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    List<Integer> choices = Arrays.asList(1, 2); // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<Integer> res = new ArrayList<>();\n    res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    foreach (int choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        Backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint ClimbingStairsBacktrack(int n) {\n    List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    List<int> res = [0]; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for _, choice := range choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state+choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state+choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n int) int {\n    // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    choices := []int{1, 2}\n    // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    state := 0\n    res := make([]int, 1)\n    // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] += 1\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices: choices, state: state + choice, n: n, res: &res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunc climbingStairsBacktrack(n: Int) -> Int {\n    let choices = [1, 2] // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    var res: [Int] = []\n    res.append(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n) {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state === n) res.set(0, res.get(0) + 1);\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (const choice of choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfunction climbingStairsBacktrack(n: number): number {\n    const choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    const state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    const res = new Map();\n    res.set(0, 0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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  // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n  if (state == n) {\n    res[0]++;\n  }\n  // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n  for (int choice in choices) {\n    // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n    if (state + choice > n) continue;\n    // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n    backtrack(choices, state + choice, n, res);\n    // \u56de\u9000\n  }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n  List<int> choices = [1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n  int state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n  List<int> res = [];\n  res.add(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if state == n {\n        res[0] = res[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for &choice in choices {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if state + choice > n {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfn climbing_stairs_backtrack(n: usize) -> i32 {\n    let choices = vec![1, 2]; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    let state = 0; // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    let mut res = Vec::new();\n    res.push(0); // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0]++;\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (int i = 0; i < len; i++) {\n        int choice = choices[i];\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n)\n            continue;\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res, len);\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nint climbingStairsBacktrack(int n) {\n    int choices[2] = {1, 2}; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    int state = 0;           // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    int *res = (int *)malloc(sizeof(int));\n    *res = 0; // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\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    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n)\n        res[0] = res[0] + 1\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choice in choices) {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) continue\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res)\n        // \u56de\u9000\n    }\n}\n\n/* \u722c\u6a13\u68af\uff1a\u56de\u6eaf */\nfun climbingStairsBacktrack(n: Int): Int {\n    val choices = mutableListOf(1, 2) // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    val state = 0 // \u5f9e\u7b2c 0 \u968e\u958b\u59cb\u722c\n    val res = mutableListOf<Int>()\n    res.add(0) // \u4f7f\u7528 res[0] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(choices, state, n, res)\n    return res[0]\n}\n
    climbing_stairs_backtrack.rb
    [class]{}-[func]{backtrack}\n\n[class]{}-[func]{climbing_stairs_backtrack}\n
    climbing_stairs_backtrack.zig
    // \u56de\u6eaf\nfn backtrack(choices: []i32, state: i32, n: i32, res: std.ArrayList(i32)) void {\n    // \u7576\u722c\u5230\u7b2c n \u968e\u6642\uff0c\u65b9\u6848\u6578\u91cf\u52a0 1\n    if (state == n) {\n        res.items[0] = res.items[0] + 1;\n    }\n    // \u8d70\u8a2a\u6240\u6709\u9078\u64c7\n    for (choices) |choice| {\n        // \u526a\u679d\uff1a\u4e0d\u5141\u8a31\u8d8a\u904e\u7b2c n \u968e\n        if (state + choice > n) {\n            continue;\n        }\n        // \u5617\u8a66\uff1a\u505a\u51fa\u9078\u64c7\uff0c\u66f4\u65b0\u72c0\u614b\n        backtrack(choices, state + choice, n, res);\n        // \u56de\u9000\n    }\n}\n\n// \u722c\u6a13\u68af\uff1a\u56de\u6eaf\nfn climbingStairsBacktrack(n: usize) !i32 {\n    var choices = [_]i32{ 1, 2 }; // \u53ef\u9078\u64c7\u5411\u4e0a\u722c 1 \u968e\u6216 2 \u968e\n    var state: i32 = 0; // \u5f9e\u7b2c 0 \u968e\u958b\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] \u8a18\u9304\u65b9\u6848\u6578\u91cf\n    backtrack(&choices, state, @intCast(n), res);\n    return res.items[0];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1411","title":"14.1.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u56de\u6eaf\u6f14\u7b97\u6cd5\u901a\u5e38\u4e26\u4e0d\u986f\u5f0f\u5730\u5c0d\u554f\u984c\u9032\u884c\u62c6\u89e3\uff0c\u800c\u662f\u5c07\u6c42\u89e3\u554f\u984c\u770b\u4f5c\u4e00\u7cfb\u5217\u6c7a\u7b56\u6b65\u9a5f\uff0c\u900f\u904e\u8a66\u63a2\u548c\u526a\u679d\uff0c\u641c\u5c0b\u6240\u6709\u53ef\u80fd\u7684\u89e3\u3002

    \u6211\u5011\u53ef\u4ee5\u5617\u8a66\u5f9e\u554f\u984c\u5206\u89e3\u7684\u89d2\u5ea6\u5206\u6790\u9019\u9053\u984c\u3002\u8a2d\u722c\u5230\u7b2c \\(i\\) \u968e\u5171\u6709 \\(dp[i]\\) \u7a2e\u65b9\u6848\uff0c\u90a3\u9ebc \\(dp[i]\\) \u5c31\u662f\u539f\u554f\u984c\uff0c\u5176\u5b50\u554f\u984c\u5305\u62ec\uff1a

    \\[ dp[i-1], dp[i-2], \\dots, dp[2], dp[1] \\]

    \u7531\u65bc\u6bcf\u8f2a\u53ea\u80fd\u4e0a \\(1\\) \u968e\u6216 \\(2\\) \u968e\uff0c\u56e0\u6b64\u7576\u6211\u5011\u7ad9\u5728\u7b2c \\(i\\) \u968e\u6a13\u68af\u4e0a\u6642\uff0c\u4e0a\u4e00\u8f2a\u53ea\u53ef\u80fd\u7ad9\u5728\u7b2c \\(i - 1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u4e0a\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ea\u80fd\u5f9e\u7b2c \\(i -1\\) \u968e\u6216\u7b2c \\(i - 2\\) \u968e\u9081\u5411\u7b2c \\(i\\) \u968e\u3002

    \u7531\u6b64\u4fbf\u53ef\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u63a8\u8ad6\uff1a\u722c\u5230\u7b2c \\(i - 1\\) \u968e\u7684\u65b9\u6848\u6578\u52a0\u4e0a\u722c\u5230\u7b2c \\(i - 2\\) \u968e\u7684\u65b9\u6848\u6578\u5c31\u7b49\u65bc\u722c\u5230\u7b2c \\(i\\) \u968e\u7684\u65b9\u6848\u6578\u3002\u516c\u5f0f\u5982\u4e0b\uff1a

    \\[ dp[i] = dp[i-1] + dp[i-2] \\]

    \u9019\u610f\u5473\u8457\u5728\u722c\u6a13\u68af\u554f\u984c\u4e2d\uff0c\u5404\u500b\u5b50\u554f\u984c\u4e4b\u9593\u5b58\u5728\u905e\u63a8\u95dc\u4fc2\uff0c\u539f\u554f\u984c\u7684\u89e3\u53ef\u4ee5\u7531\u5b50\u554f\u984c\u7684\u89e3\u69cb\u5efa\u5f97\u4f86\u3002\u5716 14-2 \u5c55\u793a\u4e86\u8a72\u905e\u63a8\u95dc\u4fc2\u3002

    \u5716 14-2 \u00a0 \u65b9\u6848\u6578\u91cf\u905e\u63a8\u95dc\u4fc2

    \u6211\u5011\u53ef\u4ee5\u6839\u64da\u905e\u63a8\u516c\u5f0f\u5f97\u5230\u66b4\u529b\u641c\u5c0b\u89e3\u6cd5\u3002\u4ee5 \\(dp[n]\\) \u70ba\u8d77\u59cb\u9ede\uff0c\u905e\u8ff4\u5730\u5c07\u4e00\u500b\u8f03\u5927\u554f\u984c\u62c6\u89e3\u70ba\u5169\u500b\u8f03\u5c0f\u554f\u984c\u7684\u548c\uff0c\u76f4\u81f3\u5230\u9054\u6700\u5c0f\u5b50\u554f\u984c \\(dp[1]\\) \u548c \\(dp[2]\\) \u6642\u8fd4\u56de\u3002\u5176\u4e2d\uff0c\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u662f\u5df2\u77e5\u7684\uff0c\u5373 \\(dp[1] = 1\\)\u3001\\(dp[2] = 2\\) \uff0c\u8868\u793a\u722c\u5230\u7b2c \\(1\\)\u3001\\(2\\) \u968e\u5206\u5225\u6709 \\(1\\)\u3001\\(2\\) \u7a2e\u65b9\u6848\u3002

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5b83\u548c\u6a19\u6e96\u56de\u6eaf\u7a0b\u5f0f\u78bc\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u4f46\u66f4\u52a0\u7c21\u6f54\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs.py
    def dfs(i: int) -> int:\n    \"\"\"\u641c\u5c0b\"\"\"\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\u6a13\u68af\uff1a\u641c\u5c0b\"\"\"\n    return dfs(n)\n
    climbing_stairs_dfs.cpp
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.java
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.cs
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint ClimbingStairsDFS(int n) {\n    return DFS(n);\n}\n
    climbing_stairs_dfs.go
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n int) int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.swift
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunc climbingStairsDFS(n: Int) -> Int {\n    dfs(i: n)\n}\n
    climbing_stairs_dfs.js
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.ts
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfunction climbingStairsDFS(n: number): number {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.dart
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n  return dfs(n);\n}\n
    climbing_stairs_dfs.rs
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfn climbing_stairs_dfs(n: usize) -> i32 {\n    dfs(n)\n}\n
    climbing_stairs_dfs.c
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nint climbingStairsDFS(int n) {\n    return dfs(n);\n}\n
    climbing_stairs_dfs.kt
    /* \u641c\u5c0b */\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\u6a13\u68af\uff1a\u641c\u5c0b */\nfun climbingStairsDFS(n: Int): Int {\n    return dfs(n)\n}\n
    climbing_stairs_dfs.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs}\n
    climbing_stairs_dfs.zig
    // \u641c\u5c0b\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\u6a13\u68af\uff1a\u641c\u5c0b\nfn climbingStairsDFS(comptime n: usize) i32 {\n    return dfs(n);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-3 \u5c55\u793a\u4e86\u66b4\u529b\u641c\u5c0b\u5f62\u6210\u7684\u905e\u8ff4\u6a39\u3002\u5c0d\u65bc\u554f\u984c \\(dp[n]\\) \uff0c\u5176\u905e\u8ff4\u6a39\u7684\u6df1\u5ea6\u70ba \\(n\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002\u6307\u6578\u968e\u5c6c\u65bc\u7206\u70b8\u5f0f\u589e\u9577\uff0c\u5982\u679c\u6211\u5011\u8f38\u5165\u4e00\u500b\u6bd4\u8f03\u5927\u7684 \\(n\\) \uff0c\u5247\u6703\u9677\u5165\u6f2b\u9577\u7684\u7b49\u5f85\u4e4b\u4e2d\u3002

    \u5716 14-3 \u00a0 \u722c\u6a13\u68af\u5c0d\u61c9\u905e\u8ff4\u6a39

    \u89c0\u5bdf\u5716 14-3 \uff0c\u6307\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f\u201c\u91cd\u758a\u5b50\u554f\u984c\u201d\u5c0e\u81f4\u7684\u3002\u4f8b\u5982 \\(dp[9]\\) \u88ab\u5206\u89e3\u70ba \\(dp[8]\\) \u548c \\(dp[7]\\) \uff0c\\(dp[8]\\) \u88ab\u5206\u89e3\u70ba \\(dp[7]\\) \u548c \\(dp[6]\\) \uff0c\u5169\u8005\u90fd\u5305\u542b\u5b50\u554f\u984c \\(dp[7]\\) \u3002

    \u4ee5\u6b64\u985e\u63a8\uff0c\u5b50\u554f\u984c\u4e2d\u5305\u542b\u66f4\u5c0f\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u5b50\u5b50\u5b6b\u5b6b\u7121\u7aae\u76e1\u4e5f\u3002\u7d55\u5927\u90e8\u5206\u8a08\u7b97\u8cc7\u6e90\u90fd\u6d6a\u8cbb\u5728\u9019\u4e9b\u91cd\u758a\u7684\u5b50\u554f\u984c\u4e0a\u3002

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1412","title":"14.1.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u70ba\u4e86\u63d0\u5347\u6f14\u7b97\u6cd5\u6548\u7387\uff0c\u6211\u5011\u5e0c\u671b\u6240\u6709\u7684\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u9663\u5217 mem \u4f86\u8a18\u9304\u6bcf\u500b\u5b50\u554f\u984c\u7684\u89e3\uff0c\u4e26\u5728\u641c\u5c0b\u904e\u7a0b\u4e2d\u5c07\u91cd\u758a\u5b50\u554f\u984c\u526a\u679d\u3002

    1. \u7576\u9996\u6b21\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u5c07\u5176\u8a18\u9304\u81f3 mem[i] \uff0c\u4ee5\u4fbf\u4e4b\u5f8c\u4f7f\u7528\u3002
    2. \u7576\u518d\u6b21\u9700\u8981\u8a08\u7b97 \\(dp[i]\\) \u6642\uff0c\u6211\u5011\u4fbf\u53ef\u76f4\u63a5\u5f9e mem[i] \u4e2d\u7372\u53d6\u7d50\u679c\uff0c\u5f9e\u800c\u907f\u514d\u91cd\u8907\u8a08\u7b97\u8a72\u5b50\u554f\u984c\u3002

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dfs_mem.py
    def dfs(i: int, mem: list[int]) -> int:\n    \"\"\"\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\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\u8a18\u9304 dp[i] \uff0c\u5247\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    # \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n\ndef climbing_stairs_dfs_mem(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    mem = [-1] * (n + 1)\n    return dfs(n, mem)\n
    climbing_stairs_dfs_mem.cpp
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    vector<int> mem(n + 1, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.java
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Arrays.fill(mem, -1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.cs
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint ClimbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    int[] mem = new int[n + 1];\n    Array.Fill(mem, -1);\n    return DFS(n, mem);\n}\n
    climbing_stairs_dfs_mem.go
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n int) int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\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
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc climbingStairsDFSMem(n: Int) -> Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = Array(repeating: -1, count: n + 1)\n    return dfs(i: n, mem: &mem)\n}\n
    climbing_stairs_dfs_mem.js
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.ts
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction climbingStairsDFSMem(n: number): number {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    const mem = new Array(n + 1).fill(-1);\n    return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.dart
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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  // \u8a18\u9304 dp[i]\n  mem[i] = count;\n  return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n  // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n  List<int> mem = List.filled(n + 1, -1);\n  return dfs(n, mem);\n}\n
    climbing_stairs_dfs_mem.rs
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn climbing_stairs_dfs_mem(n: usize) -> i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    let mut mem = vec![-1; n + 1];\n    dfs(n, &mut mem)\n}\n
    climbing_stairs_dfs_mem.c
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint climbingStairsDFSMem(int n) {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\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
    /* \u8a18\u61b6\u5316\u641c\u5c0b */\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count\n    return count\n}\n\n/* \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun climbingStairsDFSMem(n: Int): Int {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    val mem = IntArray(n + 1)\n    mem.fill(-1)\n    return dfs(n, mem)\n}\n
    climbing_stairs_dfs_mem.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{climbing_stairs_dfs_mem}\n
    climbing_stairs_dfs_mem.zig
    // \u8a18\u61b6\u5316\u641c\u5c0b\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\u8a18\u9304 dp[i] \uff0c\u5247\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    // \u8a18\u9304 dp[i]\n    mem[i] = count;\n    return count;\n}\n\n// \u722c\u6a13\u68af\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn climbingStairsDFSMem(comptime n: usize) i32 {\n    // mem[i] \u8a18\u9304\u722c\u5230\u7b2c i \u968e\u7684\u65b9\u6848\u7e3d\u6578\uff0c-1 \u4ee3\u8868\u7121\u8a18\u9304\n    var mem = [_]i32{ -1 } ** (n + 1);\n    return dfs(n, &mem);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u5716 14-4 \uff0c\u7d93\u904e\u8a18\u61b6\u5316\u8655\u7406\u5f8c\uff0c\u6240\u6709\u91cd\u758a\u5b50\u554f\u984c\u90fd\u53ea\u9700\u8a08\u7b97\u4e00\u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u9019\u662f\u4e00\u500b\u5de8\u5927\u7684\u98db\u8e8d\u3002

    \u5716 14-4 \u00a0 \u8a18\u61b6\u5316\u641c\u5c0b\u5c0d\u61c9\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1413","title":"14.1.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u201c\u5f9e\u9802\u81f3\u5e95\u201d\u7684\u65b9\u6cd5\uff1a\u6211\u5011\u5f9e\u539f\u554f\u984c\uff08\u6839\u7bc0\u9ede\uff09\u958b\u59cb\uff0c\u905e\u8ff4\u5730\u5c07\u8f03\u5927\u5b50\u554f\u984c\u5206\u89e3\u70ba\u8f03\u5c0f\u5b50\u554f\u984c\uff0c\u76f4\u81f3\u89e3\u5df2\u77e5\u7684\u6700\u5c0f\u5b50\u554f\u984c\uff08\u8449\u7bc0\u9ede\uff09\u3002\u4e4b\u5f8c\uff0c\u900f\u904e\u56de\u6eaf\u9010\u5c64\u6536\u96c6\u5b50\u554f\u984c\u7684\u89e3\uff0c\u69cb\u5efa\u51fa\u539f\u554f\u984c\u7684\u89e3\u3002

    \u8207\u4e4b\u76f8\u53cd\uff0c\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u7684\u65b9\u6cd5\uff1a\u5f9e\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\u958b\u59cb\uff0c\u8fed\u4ee3\u5730\u69cb\u5efa\u66f4\u5927\u5b50\u554f\u984c\u7684\u89e3\uff0c\u76f4\u81f3\u5f97\u5230\u539f\u554f\u984c\u7684\u89e3\u3002

    \u7531\u65bc\u52d5\u614b\u898f\u5283\u4e0d\u5305\u542b\u56de\u6eaf\u904e\u7a0b\uff0c\u56e0\u6b64\u53ea\u9700\u4f7f\u7528\u8ff4\u5708\u8fed\u4ee3\u5be6\u73fe\uff0c\u7121\u9808\u4f7f\u7528\u905e\u8ff4\u3002\u5728\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u521d\u59cb\u5316\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5b83\u8d77\u5230\u4e86\u8207\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u9663\u5217 mem \u76f8\u540c\u7684\u8a18\u9304\u4f5c\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\"\"\"\n    if n == 1 or n == 2:\n        return n\n    # \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp = [0] * (n + 1)\n    # \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1], dp[2] = 1, 2\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    vector<int> dp(n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint ClimbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int[] dp = new int[n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    dp := make([]int, n+1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDP(n: Int) -> Int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = Array(repeating: 0, count: n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n) {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfunction climbingStairsDP(n: number): number {\n    if (n === 1 || n === 2) return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    const dp = new Array(n + 1).fill(-1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n  if (n == 1 || n == 2) return n;\n  // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n  List<int> dp = List.filled(n + 1, 0);\n  // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n  dp[1] = 1;\n  dp[2] = 2;\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    let mut dp = vec![-1; n + 1];\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nint climbingStairsDP(int n) {\n    if (n == 1 || n == 2)\n        return n;\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    int *dp = (int *)malloc((n + 1) * sizeof(int));\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283 */\nfun climbingStairsDP(n: Int): Int {\n    if (n == 1 || n == 2) return n\n    // \u521d\u59cb\u5316 dp \u8868\uff0c\u7528\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    val dp = IntArray(n + 1)\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1\n    dp[2] = 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\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
    [class]{}-[func]{climbing_stairs_dp}\n
    climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\uff1a\u52d5\u614b\u898f\u5283\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\u65bc\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\n    var dp = [_]i32{-1} ** (n + 1);\n    // \u521d\u59cb\u72c0\u614b\uff1a\u9810\u8a2d\u6700\u5c0f\u5b50\u554f\u984c\u7684\u89e3\n    dp[1] = 1;\n    dp[2] = 2;\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for (3..n + 1) |i| {\n        dp[i] = dp[i - 1] + dp[i - 2];\n    }\n    return dp[n];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-5 \u6a21\u64ec\u4e86\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\u3002

    \u5716 14-5 \u00a0 \u722c\u6a13\u68af\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u8207\u56de\u6eaf\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u52d5\u614b\u898f\u5283\u4e5f\u4f7f\u7528\u201c\u72c0\u614b\u201d\u6982\u5ff5\u4f86\u8868\u793a\u554f\u984c\u6c42\u89e3\u7684\u7279\u5b9a\u968e\u6bb5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u5c0d\u61c9\u4e00\u500b\u5b50\u554f\u984c\u4ee5\u53ca\u76f8\u61c9\u7684\u5340\u57df\u6027\u6700\u512a\u89e3\u3002\u4f8b\u5982\uff0c\u722c\u6a13\u68af\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u7576\u524d\u6240\u5728\u6a13\u68af\u968e\u6578 \\(i\\) \u3002

    \u6839\u64da\u4ee5\u4e0a\u5167\u5bb9\uff0c\u6211\u5011\u53ef\u4ee5\u7e3d\u7d50\u51fa\u52d5\u614b\u898f\u5283\u7684\u5e38\u7528\u8853\u8a9e\u3002

    • \u5c07\u9663\u5217 dp \u7a31\u70ba dp \u8868\uff0c\\(dp[i]\\) \u8868\u793a\u72c0\u614b \\(i\\) \u5c0d\u61c9\u5b50\u554f\u984c\u7684\u89e3\u3002
    • \u5c07\u6700\u5c0f\u5b50\u554f\u984c\u5c0d\u61c9\u7684\u72c0\u614b\uff08\u7b2c \\(1\\) \u968e\u548c\u7b2c \\(2\\) \u968e\u6a13\u68af\uff09\u7a31\u70ba\u521d\u59cb\u72c0\u614b\u3002
    • \u5c07\u905e\u63a8\u516c\u5f0f \\(dp[i] = dp[i-1] + dp[i-2]\\) \u7a31\u70ba\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002
    "},{"location":"chapter_dynamic_programming/intro_to_dynamic_programming/#1414","title":"14.1.4 \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u7531\u65bc \\(dp[i]\\) \u53ea\u8207 \\(dp[i-1]\\) \u548c \\(dp[i-2]\\) \u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u7121\u9808\u4f7f\u7528\u4e00\u500b\u9663\u5217 dp \u4f86\u5132\u5b58\u6240\u6709\u5b50\u554f\u984c\u7684\u89e3\uff0c\u800c\u53ea\u9700\u5169\u500b\u8b8a\u6578\u6efe\u52d5\u524d\u9032\u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig climbing_stairs_dp.py
    def climbing_stairs_dp_comp(n: int) -> int:\n    \"\"\"\u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\nfunc climbingStairsDPComp(n int) int {\n    if n == 1 || n == 2 {\n        return n\n    }\n    a, b := 1, 2\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5f9e\u8f03\u5c0f\u5b50\u554f\u984c\u9010\u6b65\u6c42\u89e3\u8f03\u5927\u5b50\u554f\u984c\n    for i := 3; i <= n; i++ {\n        a, b = b, a+b\n    }\n    return b\n}\n
    climbing_stairs_dp.swift
    /* \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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
    [class]{}-[func]{climbing_stairs_dp_comp}\n
    climbing_stairs_dp.zig
    // \u722c\u6a13\u68af\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\uff0c\u7531\u65bc\u7701\u53bb\u4e86\u9663\u5217 dp \u4f54\u7528\u7684\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002

    \u5728\u52d5\u614b\u898f\u5283\u554f\u984c\u4e2d\uff0c\u7576\u524d\u72c0\u614b\u5f80\u5f80\u50c5\u8207\u524d\u9762\u6709\u9650\u500b\u72c0\u614b\u6709\u95dc\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u53ea\u4fdd\u7559\u5fc5\u8981\u7684\u72c0\u614b\uff0c\u900f\u904e\u201c\u964d\u7dad\u201d\u4f86\u7bc0\u7701\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002\u9019\u7a2e\u7a7a\u9593\u6700\u4f73\u5316\u6280\u5de7\u88ab\u7a31\u70ba\u201c\u6efe\u52d5\u8b8a\u6578\u201d\u6216\u201c\u6efe\u52d5\u9663\u5217\u201d\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/","title":"14.4 \u00a0 0-1 \u80cc\u5305\u554f\u984c","text":"

    \u80cc\u5305\u554f\u984c\u662f\u4e00\u500b\u975e\u5e38\u597d\u7684\u52d5\u614b\u898f\u5283\u5165\u9580\u984c\u76ee\uff0c\u662f\u52d5\u614b\u898f\u5283\u4e2d\u6700\u5e38\u898b\u7684\u554f\u984c\u5f62\u5f0f\u3002\u5176\u5177\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982 0-1 \u80cc\u5305\u554f\u984c\u3001\u5b8c\u5168\u80cc\u5305\u554f\u984c\u3001\u591a\u91cd\u80cc\u5305\u554f\u984c\u7b49\u3002

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u4f86\u6c42\u89e3\u6700\u5e38\u898b\u7684 0-1 \u80cc\u5305\u554f\u984c\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002

    \u89c0\u5bdf\u5716 14-17 \uff0c\u7531\u65bc\u7269\u54c1\u7de8\u865f \\(i\\) \u5f9e \\(1\\) \u958b\u59cb\u8a08\u6578\uff0c\u9663\u5217\u7d22\u5f15\u5f9e \\(0\\) \u958b\u59cb\u8a08\u6578\uff0c\u56e0\u6b64\u7269\u54c1 \\(i\\) \u5c0d\u61c9\u91cd\u91cf \\(wgt[i-1]\\) \u548c\u50f9\u503c \\(val[i-1]\\) \u3002

    \u5716 14-17 \u00a0 0-1 \u80cc\u5305\u7684\u793a\u4f8b\u8cc7\u6599

    \u6211\u5011\u53ef\u4ee5\u5c07 0-1 \u80cc\u5305\u554f\u984c\u770b\u4f5c\u4e00\u500b\u7531 \\(n\\) \u8f2a\u6c7a\u7b56\u7d44\u6210\u7684\u904e\u7a0b\uff0c\u5c0d\u65bc\u6bcf\u500b\u7269\u9ad4\u90fd\u6709\u4e0d\u653e\u5165\u548c\u653e\u5165\u5169\u7a2e\u6c7a\u7b56\uff0c\u56e0\u6b64\u8a72\u554f\u984c\u6eff\u8db3\u6c7a\u7b56\u6a39\u6a21\u578b\u3002

    \u8a72\u554f\u984c\u7684\u76ee\u6a19\u662f\u6c42\u89e3\u201c\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u201d\uff0c\u56e0\u6b64\u8f03\u5927\u6a5f\u7387\u662f\u4e00\u500b\u52d5\u614b\u898f\u5283\u554f\u984c\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u5c0d\u65bc\u6bcf\u500b\u7269\u54c1\u4f86\u8aaa\uff0c\u4e0d\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff1b\u653e\u5165\u80cc\u5305\uff0c\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c0f\u3002\u7531\u6b64\u53ef\u5f97\u72c0\u614b\u5b9a\u7fa9\uff1a\u7576\u524d\u7269\u54c1\u7de8\u865f \\(i\\) \u548c\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u8a18\u70ba \\([i, c]\\) \u3002

    \u72c0\u614b \\([i, c]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\uff0c\u8a18\u70ba \\(dp[i, c]\\) \u3002

    \u5f85\u6c42\u89e3\u7684\u662f \\(dp[n, cap]\\) \uff0c\u56e0\u6b64\u9700\u8981\u4e00\u500b\u5c3a\u5bf8\u70ba \\((n+1) \\times (cap+1)\\) \u7684\u4e8c\u7dad \\(dp\\) \u8868\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u7576\u6211\u5011\u505a\u51fa\u7269\u54c1 \\(i\\) \u7684\u6c7a\u7b56\u5f8c\uff0c\u5269\u9918\u7684\u662f\u524d \\(i-1\\) \u500b\u7269\u54c1\u6c7a\u7b56\u7684\u5b50\u554f\u984c\uff0c\u53ef\u5206\u70ba\u4ee5\u4e0b\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u4e0d\u8b8a\uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u80cc\u5305\u5bb9\u91cf\u6e1b\u5c11 \\(wgt[i-1]\\) \uff0c\u50f9\u503c\u589e\u52a0 \\(val[i-1]\\) \uff0c\u72c0\u614b\u8b8a\u5316\u70ba \\([i-1, c-wgt[i-1]]\\) \u3002

    \u4e0a\u8ff0\u5206\u6790\u5411\u6211\u5011\u63ed\u793a\u4e86\u672c\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\uff1a\u6700\u5927\u50f9\u503c \\(dp[i, c]\\) \u7b49\u65bc\u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \u548c\u653e\u5165\u7269\u54c1 \\(i\\) \u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\u3002\u7531\u6b64\u53ef\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\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\u7576\u524d\u7269\u54c1\u91cd\u91cf \\(wgt[i - 1]\\) \u8d85\u51fa\u5269\u9918\u80cc\u5305\u5bb9\u91cf \\(c\\) \uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\u3002

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u7121\u7269\u54c1\u6216\u80cc\u5305\u5bb9\u91cf\u70ba \\(0\\) \u6642\u6700\u5927\u50f9\u503c\u70ba \\(0\\) \uff0c\u5373\u9996\u5217 \\(dp[i, 0]\\) \u548c\u9996\u884c \\(dp[0, c]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    \u7576\u524d\u72c0\u614b \\([i, c]\\) \u5f9e\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c]\\) \u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b \\([i-1, c-wgt[i-1]]\\) \u8f49\u79fb\u800c\u4f86\uff0c\u56e0\u6b64\u900f\u904e\u5169\u5c64\u8ff4\u5708\u6b63\u5e8f\u8d70\u8a2a\u6574\u500b \\(dp\\) \u8868\u5373\u53ef\u3002

    \u6839\u64da\u4ee5\u4e0a\u5206\u6790\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u6309\u9806\u5e8f\u5be6\u73fe\u66b4\u529b\u641c\u5c0b\u3001\u8a18\u61b6\u5316\u641c\u5c0b\u3001\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u3002

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#1","title":"1. \u00a0 \u65b9\u6cd5\u4e00\uff1a\u66b4\u529b\u641c\u5c0b","text":"

    \u641c\u5c0b\u7a0b\u5f0f\u78bc\u5305\u542b\u4ee5\u4e0b\u8981\u7d20\u3002

    • \u905e\u8ff4\u53c3\u6578\uff1a\u72c0\u614b \\([i, c]\\) \u3002
    • \u8fd4\u56de\u503c\uff1a\u5b50\u554f\u984c\u7684\u89e3 \\(dp[i, c]\\) \u3002
    • \u7d42\u6b62\u689d\u4ef6\uff1a\u7576\u7269\u54c1\u7de8\u865f\u8d8a\u754c \\(i = 0\\) \u6216\u80cc\u5305\u5269\u9918\u5bb9\u91cf\u70ba \\(0\\) \u6642\uff0c\u7d42\u6b62\u905e\u8ff4\u4e26\u8fd4\u56de\u50f9\u503c \\(0\\) \u3002
    • \u526a\u679d\uff1a\u82e5\u7576\u524d\u7269\u54c1\u91cd\u91cf\u8d85\u51fa\u80cc\u5305\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs(wgt, val, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(vector<int> &wgt, vector<int> &val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes);\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int[] wgt, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint KnapsackDFS(int[] weight, int[] val, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFS(weight, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.Max(no, yes);\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt, val []int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFS(wgt, val, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return int(math.Max(float64(no), float64(yes)))\n}\n
    knapsack.swift
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunc knapsackDFS(wgt: [Int], val: [Int], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(wgt, val, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfunction knapsackDFS(\n    wgt: Array<number>,\n    val: Array<number>,\n    i: number,\n    c: number\n): number {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return Math.max(no, yes);\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(List<int> wgt, List<int> val, int i, int c) {\n  // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFS(wgt, val, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  return max(no, yes);\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfn knapsack_dfs(wgt: &[i32], val: &[i32], i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c as i32 {\n        return knapsack_dfs(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    std::cmp::max(no, yes)\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nint knapsackDFS(int wgt[], int val[], int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return myMax(no, yes);\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b */\nfun knapsackDFS(\n    wgt: IntArray,\n    _val: IntArray,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, _val, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return max(no, yes)\n}\n
    knapsack.rb
    [class]{}-[func]{knapsack_dfs}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u66b4\u529b\u641c\u5c0b\nfn knapsackDFS(wgt: []i32, val: []i32, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFS(wgt, val, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    return @max(no, yes);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-18 \u6240\u793a\uff0c\u7531\u65bc\u6bcf\u500b\u7269\u54c1\u90fd\u6703\u7522\u751f\u4e0d\u9078\u548c\u9078\u5169\u689d\u641c\u5c0b\u5206\u652f\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(2^n)\\) \u3002

    \u89c0\u5bdf\u905e\u8ff4\u6a39\uff0c\u5bb9\u6613\u767c\u73fe\u5176\u4e2d\u5b58\u5728\u91cd\u758a\u5b50\u554f\u984c\uff0c\u4f8b\u5982 \\(dp[1, 10]\\) \u7b49\u3002\u800c\u7576\u7269\u54c1\u8f03\u591a\u3001\u80cc\u5305\u5bb9\u91cf\u8f03\u5927\uff0c\u5c24\u5176\u662f\u76f8\u540c\u91cd\u91cf\u7684\u7269\u54c1\u8f03\u591a\u6642\uff0c\u91cd\u758a\u5b50\u554f\u984c\u7684\u6578\u91cf\u5c07\u6703\u5927\u5e45\u589e\u591a\u3002

    \u5716 14-18 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u66b4\u529b\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#2","title":"2. \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u8a18\u61b6\u5316\u641c\u5c0b","text":"

    \u70ba\u4e86\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\uff0c\u6211\u5011\u85c9\u52a9\u8a18\u61b6\u4e32\u5217 mem \u4f86\u8a18\u9304\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5176\u4e2d mem[i][c] \u5c0d\u61c9 \\(dp[i, c]\\) \u3002

    \u5f15\u5165\u8a18\u61b6\u5316\u4e4b\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u5b50\u554f\u984c\u6578\u91cf\uff0c\u4e5f\u5c31\u662f \\(O(n \\times cap)\\) \u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\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\u8a18\u61b6\u5316\u641c\u5c0b\"\"\"\n    # \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 or c == 0:\n        return 0\n    # \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1:\n        return mem[i][c]\n    # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i - 1] > c:\n        return knapsack_dfs_mem(wgt, val, mem, i - 1, c)\n    # \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    # \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n
    knapsack.cpp
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(vector<int> &wgt, vector<int> &val, vector<vector<int>> &mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.java
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int[] wgt, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.cs
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint KnapsackDFSMem(int[] weight, int[] val, int[][] mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (weight[i - 1] > c) {\n        return KnapsackDFSMem(weight, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.Max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.go
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt, val []int, mem [][]int, i, c int) int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if wgt[i-1] > c {\n        return knapsackDFSMem(wgt, val, mem, i-1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\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\u8a18\u61b6\u5316\u641c\u5c0b */\nfunc knapsackDFSMem(wgt: [Int], val: [Int], mem: inout [[Int]], i: Int, c: Int) -> Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.js
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfunction knapsackDFSMem(wgt, val, mem, i, c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.ts
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\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\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i === 0 || c === 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] !== -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = Math.max(no, yes);\n    return mem[i][c];\n}\n
    knapsack.dart
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\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\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n  if (i == 0 || c == 0) {\n    return 0;\n  }\n  // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n  if (mem[i][c] != -1) {\n    return mem[i][c];\n  }\n  // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n  if (wgt[i - 1] > c) {\n    return knapsackDFSMem(wgt, val, mem, i - 1, c);\n  }\n  // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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  // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n  mem[i][c] = max(no, yes);\n  return mem[i][c];\n}\n
    knapsack.rs
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfn knapsack_dfs_mem(wgt: &[i32], val: &[i32], mem: &mut Vec<Vec<i32>>, i: usize, c: usize) -> i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if i == 0 || c == 0 {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if mem[i][c] != -1 {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\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    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = std::cmp::max(no, yes);\n    mem[i][c]\n}\n
    knapsack.c
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nint knapsackDFSMem(int wgt[], int val[], int memCols, int **mem, int i, int c) {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, memCols, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = myMax(no, yes);\n    return mem[i][c];\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b */\nfun knapsackDFSMem(\n    wgt: IntArray,\n    _val: IntArray,\n    mem: Array<IntArray>,\n    i: Int,\n    c: Int\n): Int {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 || c == 0) {\n        return 0\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c]\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, _val, mem, i - 1, c)\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = max(no, yes)\n    return mem[i][c]\n}\n
    knapsack.rb
    [class]{}-[func]{knapsack_dfs_mem}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u8a18\u61b6\u5316\u641c\u5c0b\nfn knapsackDFSMem(wgt: []i32, val: []i32, mem: anytype, i: usize, c: usize) i32 {\n    // \u82e5\u5df2\u9078\u5b8c\u6240\u6709\u7269\u54c1\u6216\u80cc\u5305\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u5247\u8fd4\u56de\u50f9\u503c 0\n    if (i == 0 or c == 0) {\n        return 0;\n    }\n    // \u82e5\u5df2\u6709\u8a18\u9304\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (mem[i][c] != -1) {\n        return mem[i][c];\n    }\n    // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u53ea\u80fd\u9078\u64c7\u4e0d\u653e\u5165\u80cc\u5305\n    if (wgt[i - 1] > c) {\n        return knapsackDFSMem(wgt, val, mem, i - 1, c);\n    }\n    // \u8a08\u7b97\u4e0d\u653e\u5165\u548c\u653e\u5165\u7269\u54c1 i \u7684\u6700\u5927\u50f9\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    // \u8a18\u9304\u4e26\u8fd4\u56de\u5169\u7a2e\u65b9\u6848\u4e2d\u50f9\u503c\u66f4\u5927\u7684\u90a3\u4e00\u500b\n    mem[i][c] = @max(no, yes);\n    return mem[i][c];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-19 \u5c55\u793a\u4e86\u5728\u8a18\u61b6\u5316\u641c\u5c0b\u4e2d\u88ab\u526a\u6389\u7684\u641c\u5c0b\u5206\u652f\u3002

    \u5716 14-19 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u8a18\u61b6\u5316\u641c\u5c0b\u905e\u8ff4\u6a39

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#3","title":"3. \u00a0 \u65b9\u6cd5\u4e09\uff1a\u52d5\u614b\u898f\u5283","text":"

    \u52d5\u614b\u898f\u5283\u5be6\u8cea\u4e0a\u5c31\u662f\u5728\u72c0\u614b\u8f49\u79fb\u4e2d\u586b\u5145 \\(dp\\) \u8868\u7684\u904e\u7a0b\uff0c\u7a0b\u5f0f\u78bc\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\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{knapsack_dp}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 14-20 \u6240\u793a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u90fd\u7531\u9663\u5217 dp \u5927\u5c0f\u6c7a\u5b9a\uff0c\u5373 \\(O(n \\times cap)\\) \u3002

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

    \u5716 14-20 \u00a0 0-1 \u80cc\u5305\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/knapsack_problem/#4","title":"4. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u6bcf\u500b\u72c0\u614b\u90fd\u53ea\u8207\u5176\u4e0a\u4e00\u884c\u7684\u72c0\u614b\u6709\u95dc\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5169\u500b\u9663\u5217\u6efe\u52d5\u524d\u9032\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \u3002

    \u9032\u4e00\u6b65\u601d\u8003\uff0c\u6211\u5011\u80fd\u5426\u50c5\u7528\u4e00\u500b\u9663\u5217\u5be6\u73fe\u7a7a\u9593\u6700\u4f73\u5316\u5462\uff1f\u89c0\u5bdf\u53ef\u77e5\uff0c\u6bcf\u500b\u72c0\u614b\u90fd\u662f\u7531\u6b63\u4e0a\u65b9\u6216\u5de6\u4e0a\u65b9\u7684\u683c\u5b50\u8f49\u79fb\u904e\u4f86\u7684\u3002\u5047\u8a2d\u53ea\u6709\u4e00\u500b\u9663\u5217\uff0c\u7576\u958b\u59cb\u8d70\u8a2a\u7b2c \\(i\\) \u884c\u6642\uff0c\u8a72\u9663\u5217\u5132\u5b58\u7684\u4ecd\u7136\u662f\u7b2c \\(i-1\\) \u884c\u7684\u72c0\u614b\u3002

    • \u5982\u679c\u63a1\u53d6\u6b63\u5e8f\u8d70\u8a2a\uff0c\u90a3\u9ebc\u8d70\u8a2a\u5230 \\(dp[i, j]\\) \u6642\uff0c\u5de6\u4e0a\u65b9 \\(dp[i-1, 1]\\) ~ \\(dp[i-1, j-1]\\) \u503c\u53ef\u80fd\u5df2\u7d93\u88ab\u8986\u84cb\uff0c\u6b64\u6642\u5c31\u7121\u6cd5\u5f97\u5230\u6b63\u78ba\u7684\u72c0\u614b\u8f49\u79fb\u7d50\u679c\u3002
    • \u5982\u679c\u63a1\u53d6\u5012\u5e8f\u8d70\u8a2a\uff0c\u5247\u4e0d\u6703\u767c\u751f\u8986\u84cb\u554f\u984c\uff0c\u72c0\u614b\u8f49\u79fb\u53ef\u4ee5\u6b63\u78ba\u9032\u884c\u3002

    \u5716 14-21 \u5c55\u793a\u4e86\u5728\u55ae\u500b\u9663\u5217\u4e0b\u5f9e\u7b2c \\(i = 1\\) \u884c\u8f49\u63db\u81f3\u7b2c \\(i = 2\\) \u884c\u7684\u904e\u7a0b\u3002\u8acb\u601d\u8003\u6b63\u5e8f\u8d70\u8a2a\u548c\u5012\u5e8f\u8d70\u8a2a\u7684\u5340\u5225\u3002

    <1><2><3><4><5><6>

    \u5716 14-21 \u00a0 0-1 \u80cc\u5305\u7684\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad \\(i\\) \u76f4\u63a5\u522a\u9664\uff0c\u4e26\u4e14\u628a\u5167\u8ff4\u5708\u66f4\u6539\u70ba\u5012\u5e8f\u8d70\u8a2a\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u5012\u5e8f\u8d70\u8a2a\n        for c in range(cap, 0, -1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c > 0; c--) {\n            if (weight[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c := cap; c >= 1; c-- {\n            if wgt[i-1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1 ... cap).reversed() {\n            if wgt[i - 1] <= c {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (let i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (let c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\n  for (int i = 1; i <= n; i++) {\n    // \u5012\u5e8f\u8d70\u8a2a\n    for (int c = cap; c >= 1; c--) {\n      if (wgt[i - 1] <= c) {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for c in (1..=cap).rev() {\n            if wgt[i - 1] <= c as i32 {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (int i = 1; i <= n; i++) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (int c = cap; c >= 1; c--) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    knapsack.kt
    /* 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        // \u5012\u5e8f\u8d70\u8a2a\n        for (c in cap downTo 1) {\n            if (wgt[i - 1] <= c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{knapsack_dp_comp}\n
    knapsack.zig
    // 0-1 \u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        // \u5012\u5e8f\u8d70\u8a2a\n        var c = cap;\n        while (c > 0) : (c -= 1) {\n            if (wgt[i - 1] < c) {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/summary/","title":"14.7 \u00a0 \u5c0f\u7d50","text":"
    • \u52d5\u614b\u898f\u5283\u5c0d\u554f\u984c\u9032\u884c\u5206\u89e3\uff0c\u4e26\u900f\u904e\u5132\u5b58\u5b50\u554f\u984c\u7684\u89e3\u4f86\u898f\u907f\u91cd\u8907\u8a08\u7b97\uff0c\u63d0\u9ad8\u8a08\u7b97\u6548\u7387\u3002
    • \u4e0d\u8003\u616e\u6642\u9593\u7684\u524d\u63d0\u4e0b\uff0c\u6240\u6709\u52d5\u614b\u898f\u5283\u554f\u984c\u90fd\u53ef\u4ee5\u7528\u56de\u6eaf\uff08\u66b4\u529b\u641c\u5c0b\uff09\u9032\u884c\u6c42\u89e3\uff0c\u4f46\u905e\u8ff4\u6a39\u4e2d\u5b58\u5728\u5927\u91cf\u7684\u91cd\u758a\u5b50\u554f\u984c\uff0c\u6548\u7387\u6975\u4f4e\u3002\u900f\u904e\u5f15\u5165\u8a18\u61b6\u5316\u4e32\u5217\uff0c\u53ef\u4ee5\u5132\u5b58\u6240\u6709\u8a08\u7b97\u904e\u7684\u5b50\u554f\u984c\u7684\u89e3\uff0c\u5f9e\u800c\u4fdd\u8b49\u91cd\u758a\u5b50\u554f\u984c\u53ea\u88ab\u8a08\u7b97\u4e00\u6b21\u3002
    • \u8a18\u61b6\u5316\u641c\u5c0b\u662f\u4e00\u7a2e\u5f9e\u9802\u81f3\u5e95\u7684\u905e\u8ff4\u5f0f\u89e3\u6cd5\uff0c\u800c\u8207\u4e4b\u5c0d\u61c9\u7684\u52d5\u614b\u898f\u5283\u662f\u4e00\u7a2e\u5f9e\u5e95\u81f3\u9802\u7684\u905e\u63a8\u5f0f\u89e3\u6cd5\uff0c\u5176\u5982\u540c\u201c\u586b\u5beb\u8868\u683c\u201d\u4e00\u6a23\u3002\u7531\u65bc\u7576\u524d\u72c0\u614b\u50c5\u4f9d\u8cf4\u67d0\u4e9b\u5340\u57df\u6027\u72c0\u614b\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u6d88\u9664 \\(dp\\) \u8868\u7684\u4e00\u500b\u7dad\u5ea6\uff0c\u5f9e\u800c\u964d\u4f4e\u7a7a\u9593\u8907\u96dc\u5ea6\u3002
    • \u5b50\u554f\u984c\u5206\u89e3\u662f\u4e00\u7a2e\u901a\u7528\u7684\u6f14\u7b97\u6cd5\u601d\u8def\uff0c\u5728\u5206\u6cbb\u3001\u52d5\u614b\u898f\u5283\u3001\u56de\u6eaf\u4e2d\u5177\u6709\u4e0d\u540c\u7684\u6027\u8cea\u3002
    • \u52d5\u614b\u898f\u5283\u554f\u984c\u6709\u4e09\u5927\u7279\u6027\uff1a\u91cd\u758a\u5b50\u554f\u984c\u3001\u6700\u512a\u5b50\u7d50\u69cb\u3001\u7121\u5f8c\u6548\u6027\u3002
    • \u5982\u679c\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u53ef\u4ee5\u5f9e\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u69cb\u5efa\u5f97\u4f86\uff0c\u5247\u5b83\u5c31\u5177\u6709\u6700\u512a\u5b50\u7d50\u69cb\u3002
    • \u7121\u5f8c\u6548\u6027\u6307\u5c0d\u65bc\u4e00\u500b\u72c0\u614b\uff0c\u5176\u672a\u4f86\u767c\u5c55\u53ea\u8207\u8a72\u72c0\u614b\u6709\u95dc\uff0c\u800c\u8207\u904e\u53bb\u7d93\u6b77\u7684\u6240\u6709\u72c0\u614b\u7121\u95dc\u3002\u8a31\u591a\u7d44\u5408\u6700\u4f73\u5316\u554f\u984c\u4e0d\u5177\u6709\u7121\u5f8c\u6548\u6027\uff0c\u7121\u6cd5\u4f7f\u7528\u52d5\u614b\u898f\u5283\u5feb\u901f\u6c42\u89e3\u3002

    \u80cc\u5305\u554f\u984c

    • \u80cc\u5305\u554f\u984c\u662f\u6700\u5178\u578b\u7684\u52d5\u614b\u898f\u5283\u554f\u984c\u4e4b\u4e00\uff0c\u5177\u6709 0-1 \u80cc\u5305\u3001\u5b8c\u5168\u80cc\u5305\u3001\u591a\u91cd\u80cc\u5305\u7b49\u8b8a\u7a2e\u3002
    • 0-1 \u80cc\u5305\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u524d \\(i\\) \u500b\u7269\u54c1\u5728\u5bb9\u91cf\u70ba \\(c\\) \u7684\u80cc\u5305\u4e2d\u7684\u6700\u5927\u50f9\u503c\u3002\u6839\u64da\u4e0d\u653e\u5165\u80cc\u5305\u548c\u653e\u5165\u80cc\u5305\u5169\u7a2e\u6c7a\u7b56\uff0c\u53ef\u5f97\u5230\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u4e26\u69cb\u5efa\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\uff0c\u7531\u65bc\u6bcf\u500b\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u9700\u8981\u5012\u5e8f\u8d70\u8a2a\u4e32\u5217\uff0c\u907f\u514d\u5de6\u4e0a\u65b9\u72c0\u614b\u88ab\u8986\u84cb\u3002
    • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u6bcf\u7a2e\u7269\u54c1\u7684\u9078\u53d6\u6578\u91cf\u7121\u9650\u5236\uff0c\u56e0\u6b64\u9078\u64c7\u653e\u5165\u7269\u54c1\u7684\u72c0\u614b\u8f49\u79fb\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\u3002\u7531\u65bc\u72c0\u614b\u4f9d\u8cf4\u6b63\u4e0a\u65b9\u548c\u6b63\u5de6\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u5728\u7a7a\u9593\u6700\u4f73\u5316\u4e2d\u61c9\u7576\u6b63\u5e8f\u8d70\u8a2a\u3002
    • \u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u500b\u8b8a\u7a2e\u3002\u5b83\u5f9e\u6c42\u201c\u6700\u5927\u201d\u50f9\u503c\u8b8a\u70ba\u6c42\u201c\u6700\u5c0f\u201d\u786c\u5e63\u6578\u91cf\uff0c\u56e0\u6b64\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\max()\\) \u61c9\u6539\u70ba \\(\\min()\\) \u3002\u5f9e\u8ffd\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u5230\u8ffd\u6c42\u201c\u6070\u597d\u201d\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u4f7f\u7528 \\(amt + 1\\) \u4f86\u8868\u793a\u201c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u201d\u7684\u7121\u6548\u89e3\u3002
    • \u96f6\u9322\u514c\u63db\u554f\u984c II \u5f9e\u6c42\u201c\u6700\u5c11\u786c\u5e63\u6578\u91cf\u201d\u6539\u70ba\u6c42\u201c\u786c\u5e63\u7d44\u5408\u6578\u91cf\u201d\uff0c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u76f8\u61c9\u5730\u5f9e \\(\\min()\\) \u6539\u70ba\u6c42\u548c\u904b\u7b97\u5b50\u3002

    \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c

    • \u7de8\u8f2f\u8ddd\u96e2\uff08Levenshtein \u8ddd\u96e2\uff09\u7528\u65bc\u8861\u91cf\u5169\u500b\u5b57\u4e32\u4e4b\u9593\u7684\u76f8\u4f3c\u5ea6\uff0c\u5176\u5b9a\u7fa9\u70ba\u5f9e\u4e00\u500b\u5b57\u4e32\u5230\u53e6\u4e00\u500b\u5b57\u4e32\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\uff0c\u7de8\u8f2f\u64cd\u4f5c\u5305\u62ec\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\u3002
    • \u7de8\u8f2f\u8ddd\u96e2\u554f\u984c\u7684\u72c0\u614b\u5b9a\u7fa9\u70ba\u5c07 \\(s\\) \u7684\u524d \\(i\\) \u500b\u5b57\u5143\u66f4\u6539\u70ba \\(t\\) \u7684\u524d \\(j\\) \u500b\u5b57\u5143\u6240\u9700\u7684\u6700\u5c11\u7de8\u8f2f\u6b65\u6578\u3002\u7576 \\(s[i] \\ne t[j]\\) \u6642\uff0c\u5177\u6709\u4e09\u7a2e\u6c7a\u7b56\uff1a\u65b0\u589e\u3001\u522a\u9664\u3001\u66ff\u63db\uff0c\u5b83\u5011\u90fd\u6709\u76f8\u61c9\u7684\u5269\u9918\u5b50\u554f\u984c\u3002\u64da\u6b64\u4fbf\u53ef\u4ee5\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\u8207\u69cb\u5efa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u3002\u800c\u7576 \\(s[i] = t[j]\\) \u6642\uff0c\u7121\u9808\u7de8\u8f2f\u7576\u524d\u5b57\u5143\u3002
    • \u5728\u7de8\u8f2f\u8ddd\u96e2\u4e2d\uff0c\u72c0\u614b\u4f9d\u8cf4\u5176\u6b63\u4e0a\u65b9\u3001\u6b63\u5de6\u65b9\u3001\u5de6\u4e0a\u65b9\u7684\u72c0\u614b\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u6b63\u5e8f\u6216\u5012\u5e8f\u8d70\u8a2a\u90fd\u7121\u6cd5\u6b63\u78ba\u5730\u9032\u884c\u72c0\u614b\u8f49\u79fb\u3002\u70ba\u6b64\uff0c\u6211\u5011\u5229\u7528\u4e00\u500b\u8b8a\u6578\u66ab\u5b58\u5de6\u4e0a\u65b9\u72c0\u614b\uff0c\u5f9e\u800c\u8f49\u5316\u5230\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7b49\u50f9\u7684\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002
    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/","title":"14.5 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

    \u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5148\u6c42\u89e3\u53e6\u4e00\u500b\u5e38\u898b\u7684\u80cc\u5305\u554f\u984c\uff1a\u5b8c\u5168\u80cc\u5305\uff0c\u518d\u77ad\u89e3\u5b83\u7684\u4e00\u7a2e\u7279\u4f8b\uff1a\u96f6\u9322\u514c\u63db\u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1451","title":"14.5.1 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80fd\u653e\u5165\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 14-22 \u6240\u793a\u3002

    \u5716 14-22 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u5b8c\u5168\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\uff0c\u5340\u5225\u50c5\u5728\u65bc\u4e0d\u9650\u5236\u7269\u54c1\u7684\u9078\u64c7\u6b21\u6578\u3002

    • \u5728 0-1 \u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u53ea\u6709\u4e00\u500b\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u53ea\u80fd\u5f9e\u524d \\(i-1\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002
    • \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e2d\uff0c\u6bcf\u7a2e\u7269\u54c1\u7684\u6578\u91cf\u662f\u7121\u9650\u7684\uff0c\u56e0\u6b64\u5c07\u7269\u54c1 \\(i\\) \u653e\u5165\u80cc\u5305\u5f8c\uff0c\u4ecd\u53ef\u4ee5\u5f9e\u524d \\(i\\) \u500b\u7269\u54c1\u4e2d\u9078\u64c7\u3002

    \u5728\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u898f\u5b9a\u4e0b\uff0c\u72c0\u614b \\([i, c]\\) \u7684\u8b8a\u5316\u5206\u70ba\u5169\u7a2e\u60c5\u6cc1\u3002

    • \u4e0d\u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u76f8\u540c\uff0c\u8f49\u79fb\u81f3 \\([i-1, c]\\) \u3002
    • \u653e\u5165\u7269\u54c1 \\(i\\) \uff1a\u8207 0-1 \u80cc\u5305\u554f\u984c\u4e0d\u540c\uff0c\u8f49\u79fb\u81f3 \\([i, c-wgt[i-1]]\\) \u3002

    \u5f9e\u800c\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u8b8a\u70ba\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 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5c0d\u6bd4\u5169\u9053\u984c\u76ee\u7684\u7a0b\u5f0f\u78bc\uff0c\u72c0\u614b\u8f49\u79fb\u4e2d\u6709\u4e00\u8655\u5f9e \\(i-1\\) \u8b8a\u70ba \\(i\\) \uff0c\u5176\u9918\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\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [[0] * (cap + 1) for _ in range(n + 1)]\n    # \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i, c] = dp[i - 1, c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i-1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[i][c] = dp[i - 1][c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{unbounded_knapsack_dp}\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[i][c] = dp[i - 1][c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7531\u65bc\u7576\u524d\u72c0\u614b\u662f\u5f9e\u5de6\u908a\u548c\u4e0a\u908a\u7684\u72c0\u614b\u8f49\u79fb\u800c\u4f86\u7684\uff0c\u56e0\u6b64\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u61c9\u8a72\u5c0d \\(dp\\) \u8868\u4e2d\u7684\u6bcf\u4e00\u884c\u9032\u884c\u6b63\u5e8f\u8d70\u8a2a\u3002

    \u9019\u500b\u8d70\u8a2a\u9806\u5e8f\u8207 0-1 \u80cc\u5305\u6b63\u597d\u76f8\u53cd\u3002\u8acb\u85c9\u52a9\u5716 14-23 \u4f86\u7406\u89e3\u5169\u8005\u7684\u5340\u5225\u3002

    <1><2><3><4><5><6>

    \u5716 14-23 \u00a0 \u5b8c\u5168\u80cc\u5305\u554f\u984c\u5728\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    \u7a0b\u5f0f\u78bc\u5be6\u73fe\u6bd4\u8f03\u7c21\u55ae\uff0c\u50c5\u9700\u5c07\u9663\u5217 dp \u7684\u7b2c\u4e00\u7dad\u522a\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(wgt)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (cap + 1)\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for c in range(1, cap + 1):\n            if wgt[i - 1] > c:\n                # \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        for c := 1; c <= cap; c++ {\n            if wgt[i-1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for c in 1 ... cap {\n            if wgt[i - 1] > c {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n        dp[c] = dp[c];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for c in 1..=cap {\n            if wgt[i - 1] > c as i32 {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    unbounded_knapsack.kt
    /* \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (c in 1..cap) {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{unbounded_knapsack_dp_comp}\n
    unbounded_knapsack.zig
    // \u5b8c\u5168\u80cc\u5305\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\n    for (1..n + 1) |i| {\n        for (1..cap + 1) |c| {\n            if (wgt[i - 1] > c) {\n                // \u82e5\u8d85\u904e\u80cc\u5305\u5bb9\u91cf\uff0c\u5247\u4e0d\u9078\u7269\u54c1 i\n                dp[c] = dp[c];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u7269\u54c1 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1452","title":"14.5.2 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c","text":"

    \u80cc\u5305\u554f\u984c\u662f\u4e00\u5927\u985e\u52d5\u614b\u898f\u5283\u554f\u984c\u7684\u4ee3\u8868\uff0c\u5176\u64c1\u6709\u5f88\u591a\u8b8a\u7a2e\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 14-24 \u6240\u793a\u3002

    \u5716 14-24 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_1","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u96f6\u9322\u514c\u63db\u53ef\u4ee5\u770b\u4f5c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u4e00\u7a2e\u7279\u6b8a\u60c5\u6cc1\uff0c\u5169\u8005\u5177\u6709\u4ee5\u4e0b\u95dc\u806f\u8207\u4e0d\u540c\u9ede\u3002

    • \u5169\u9053\u984c\u53ef\u4ee5\u76f8\u4e92\u8f49\u63db\uff0c\u201c\u7269\u54c1\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u201d\u3001\u201c\u7269\u54c1\u91cd\u91cf\u201d\u5c0d\u61c9\u201c\u786c\u5e63\u9762\u503c\u201d\u3001\u201c\u80cc\u5305\u5bb9\u91cf\u201d\u5c0d\u61c9\u201c\u76ee\u6a19\u91d1\u984d\u201d\u3002
    • \u6700\u4f73\u5316\u76ee\u6a19\u76f8\u53cd\uff0c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u8981\u6700\u5927\u5316\u7269\u54c1\u50f9\u503c\uff0c\u96f6\u9322\u514c\u63db\u554f\u984c\u662f\u8981\u6700\u5c0f\u5316\u786c\u5e63\u6578\u91cf\u3002
    • \u5b8c\u5168\u80cc\u5305\u554f\u984c\u662f\u6c42\u201c\u4e0d\u8d85\u904e\u201d\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u89e3\uff0c\u96f6\u9322\u514c\u63db\u662f\u6c42\u201c\u6070\u597d\u201d\u6e4a\u5230\u76ee\u6a19\u91d1\u984d\u7684\u89e3\u3002

    \u7b2c\u4e00\u6b65\uff1a\u601d\u8003\u6bcf\u8f2a\u7684\u6c7a\u7b56\uff0c\u5b9a\u7fa9\u72c0\u614b\uff0c\u5f9e\u800c\u5f97\u5230 \\(dp\\) \u8868

    \u72c0\u614b \\([i, a]\\) \u5c0d\u61c9\u7684\u5b50\u554f\u984c\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\uff0c\u8a18\u70ba \\(dp[i, a]\\) \u3002

    \u4e8c\u7dad \\(dp\\) \u8868\u7684\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt+1)\\) \u3002

    \u7b2c\u4e8c\u6b65\uff1a\u627e\u51fa\u6700\u512a\u5b50\u7d50\u69cb\uff0c\u9032\u800c\u63a8\u5c0e\u51fa\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b

    \u672c\u984c\u8207\u5b8c\u5168\u80cc\u5305\u554f\u984c\u7684\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u5b58\u5728\u4ee5\u4e0b\u5169\u9ede\u5dee\u7570\u3002

    • \u672c\u984c\u8981\u6c42\u6700\u5c0f\u503c\uff0c\u56e0\u6b64\u9700\u5c07\u904b\u7b97\u5b50 \\(\\max()\\) \u66f4\u6539\u70ba \\(\\min()\\) \u3002
    • \u6700\u4f73\u5316\u4e3b\u9ad4\u662f\u786c\u5e63\u6578\u91cf\u800c\u975e\u5546\u54c1\u50f9\u503c\uff0c\u56e0\u6b64\u5728\u9078\u4e2d\u786c\u5e63\u6642\u57f7\u884c \\(+1\\) \u5373\u53ef\u3002
    \\[ dp[i, a] = \\min(dp[i-1, a], dp[i, a - coins[i-1]] + 1) \\]

    \u7b2c\u4e09\u6b65\uff1a\u78ba\u5b9a\u908a\u754c\u689d\u4ef6\u548c\u72c0\u614b\u8f49\u79fb\u9806\u5e8f

    \u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u6e4a\u51fa\u5b83\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u70ba \\(0\\) \uff0c\u5373\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    \u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u610f \\(> 0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u5373\u662f\u7121\u6548\u89e3\u3002\u70ba\u4f7f\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(\\min()\\) \u51fd\u5f0f\u80fd\u5920\u8b58\u5225\u4e26\u904e\u6ffe\u7121\u6548\u89e3\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528 \\(+ \\infty\\) \u4f86\u8868\u793a\u5b83\u5011\uff0c\u5373\u4ee4\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(+ \\infty\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_1","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5927\u591a\u6578\u7a0b\u5f0f\u8a9e\u8a00\u4e26\u672a\u63d0\u4f9b \\(+ \\infty\\) \u8b8a\u6578\uff0c\u53ea\u80fd\u4f7f\u7528\u6574\u578b int \u7684\u6700\u5927\u503c\u4f86\u4ee3\u66ff\u3002\u800c\u9019\u53c8\u6703\u5c0e\u81f4\u5927\u6578\u8d8a\u754c\uff1a\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u4e2d\u7684 \\(+ 1\\) \u64cd\u4f5c\u53ef\u80fd\u767c\u751f\u6ea2\u4f4d\u3002

    \u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u6578\u5b57 \\(amt + 1\\) \u4f86\u8868\u793a\u7121\u6548\u89e3\uff0c\u56e0\u70ba\u6e4a\u51fa \\(amt\\) \u7684\u786c\u5e63\u6578\u91cf\u6700\u591a\u70ba \\(amt\\) \u3002\u6700\u5f8c\u8fd4\u56de\u524d\uff0c\u5224\u65b7 \\(dp[n, amt]\\) \u662f\u5426\u7b49\u65bc \\(amt + 1\\) \uff0c\u82e5\u662f\u5247\u8fd4\u56de \\(-1\\) \uff0c\u4ee3\u8868\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in range(1, amt + 1):\n        dp[0][a] = MAX\n    # \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0, a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a := 1; a <= amt; a++ {\n        dp[0][a] = max\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1 ... amt {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (let a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n  for (int a = 1; a <= amt; a++) {\n    dp[0][a] = MAX;\n  }\n  // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for a in 1..=amt {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (int a = 1; a <= amt; a++) {\n        dp[0][a] = MAX;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (a in 1..amt) {\n        dp[0][a] = MAX\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\u884c\u548c\u5217\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{coin_change_dp}\n
    coin_change.zig
    // \u96f6\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u9996\u884c\u9996\u5217\n    for (1..amt + 1) |a| {\n        dp[0][a] = max;\n    }\n    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 14-25 \u5c55\u793a\u4e86\u96f6\u9322\u514c\u63db\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b\uff0c\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u975e\u5e38\u76f8\u4f3c\u3002

    <1><2><3><4><5><6><7><8><9><10><11><12><13><14><15>

    \u5716 14-25 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c\u7684\u52d5\u614b\u898f\u5283\u904e\u7a0b

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_1","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u96f6\u9322\u514c\u63db\u7684\u7a7a\u9593\u6700\u4f73\u5316\u7684\u8655\u7406\u65b9\u5f0f\u548c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u4e00\u81f4\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change.py
    def coin_change_dp_comp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    MAX = amt + 1\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [MAX] * (amt + 1)\n    dp[0] = 0\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    coin_change.kt
    /* \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    [class]{}-[func]{coin_change_dp_comp}\n
    coin_change.zig
    // \u96f6\u9322\u514c\u63db\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1453-ii","title":"14.5.3 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u786c\u5e63\u7d44\u5408\u6578\u91cf\u3002\u793a\u4f8b\u5982\u5716 14-26 \u6240\u793a\u3002

    \u5716 14-26 \u00a0 \u96f6\u9322\u514c\u63db\u554f\u984c II \u7684\u793a\u4f8b\u8cc7\u6599

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#1_2","title":"1. \u00a0 \u52d5\u614b\u898f\u5283\u601d\u8def","text":"

    \u76f8\u6bd4\u65bc\u4e0a\u4e00\u984c\uff0c\u672c\u984c\u76ee\u6a19\u662f\u6c42\u7d44\u5408\u6578\u91cf\uff0c\u56e0\u6b64\u5b50\u554f\u984c\u8b8a\u70ba\uff1a\u524d \\(i\\) \u7a2e\u786c\u5e63\u80fd\u5920\u6e4a\u51fa\u91d1\u984d \\(a\\) \u7684\u7d44\u5408\u6578\u91cf\u3002\u800c \\(dp\\) \u8868\u4ecd\u7136\u662f\u5c3a\u5bf8\u70ba \\((n+1) \\times (amt + 1)\\) \u7684\u4e8c\u7dad\u77e9\u9663\u3002

    \u7576\u524d\u72c0\u614b\u7684\u7d44\u5408\u6578\u91cf\u7b49\u65bc\u4e0d\u9078\u7576\u524d\u786c\u5e63\u8207\u9078\u7576\u524d\u786c\u5e63\u9019\u5169\u7a2e\u6c7a\u7b56\u7684\u7d44\u5408\u6578\u91cf\u4e4b\u548c\u3002\u72c0\u614b\u8f49\u79fb\u65b9\u7a0b\u70ba\uff1a

    \\[ dp[i, a] = dp[i-1, a] + dp[i, a - coins[i-1]] \\]

    \u7576\u76ee\u6a19\u91d1\u984d\u70ba \\(0\\) \u6642\uff0c\u7121\u9808\u9078\u64c7\u4efb\u4f55\u786c\u5e63\u5373\u53ef\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u61c9\u5c07\u9996\u5217\u6240\u6709 \\(dp[i, 0]\\) \u90fd\u521d\u59cb\u5316\u70ba \\(1\\) \u3002\u7576\u7121\u786c\u5e63\u6642\uff0c\u7121\u6cd5\u6e4a\u51fa\u4efb\u4f55 \\(>0\\) \u7684\u76ee\u6a19\u91d1\u984d\uff0c\u56e0\u6b64\u9996\u884c\u6240\u6709 \\(dp[0, a]\\) \u90fd\u7b49\u65bc \\(0\\) \u3002

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#2_2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_ii.py
    def coin_change_ii_dp(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\"\"\"\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    # \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i, a] = dp[i - 1, a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\uff1a\u5176\u9918\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i-1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[i][a] = dp[i - 1][a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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    // \u91cb\u653e\u8a18\u61b6\u9ad4\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\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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
    [class]{}-[func]{coin_change_ii_dp}\n
    coin_change_ii.zig
    // \u96f6\u9322\u514c\u63db II\uff1a\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[i][a] = dp[i - 1][a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_dynamic_programming/unbounded_knapsack_problem/#3_2","title":"3. \u00a0 \u7a7a\u9593\u6700\u4f73\u5316","text":"

    \u7a7a\u9593\u6700\u4f73\u5316\u8655\u7406\u65b9\u5f0f\u76f8\u540c\uff0c\u522a\u9664\u786c\u5e63\u7dad\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\"\"\"\n    n = len(coins)\n    # \u521d\u59cb\u5316 dp \u8868\n    dp = [0] * (amt + 1)\n    dp[0] = 1\n    # \u72c0\u614b\u8f49\u79fb\n    for i in range(1, n + 1):\n        # \u6b63\u5e8f\u8d70\u8a2a\n        for a in range(1, amt + 1):\n            if coins[i - 1] > a:\n                # \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            else:\n                # \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]]\n    return dp[amt]\n
    coin_change_ii.cpp
    /* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i := 1; i <= n; i++ {\n        // \u6b63\u5e8f\u8d70\u8a2a\n        for a := 1; a <= amt; a++ {\n            if coins[i-1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1 ... n {\n        for a in 1 ... amt {\n            if coins[i - 1] > a {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u72c0\u614b\u58d3\u7e2e\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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  // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n        dp[a] = dp[a];\n      } else {\n        // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for i in 1..=n {\n        for a in 1..=amt {\n            if coins[i - 1] > a as i32 {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u4e4b\u548c\n                dp[a] = dp[a] + dp[a - coins[i - 1]];\n            }\n        }\n    }\n    int res = dp[amt];\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(dp);\n    return res;\n}\n
    coin_change_ii.kt
    /* \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283 */\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    // \u72c0\u614b\u8f49\u79fb\n    for (i in 1..n) {\n        for (a in 1..amt) {\n            if (coins[i - 1] > a) {\n                // \u82e5\u8d85\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a]\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\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
    [class]{}-[func]{coin_change_ii_dp_comp}\n
    coin_change_ii.zig
    // \u96f6\u9322\u514c\u63db II\uff1a\u7a7a\u9593\u6700\u4f73\u5316\u5f8c\u7684\u52d5\u614b\u898f\u5283\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    // \u72c0\u614b\u8f49\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\u904e\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u4e0d\u9078\u786c\u5e63 i\n                dp[a] = dp[a];\n            } else {\n                // \u4e0d\u9078\u548c\u9078\u786c\u5e63 i \u9019\u5169\u7a2e\u65b9\u6848\u7684\u8f03\u5c0f\u503c\n                dp[a] = dp[a] + dp[a - @as(usize, @intCast(coins[i - 1]))];\n            }\n        }\n    }\n    return dp[amt];\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/","title":"\u7b2c 9 \u7ae0 \u00a0 \u5716","text":"

    Abstract

    \u5728\u751f\u547d\u65c5\u9014\u4e2d\uff0c\u6211\u5011\u5c31\u50cf\u662f\u4e00\u500b\u500b\u7bc0\u9ede\uff0c\u88ab\u7121\u6578\u770b\u4e0d\u898b\u7684\u908a\u76f8\u9023\u3002

    \u6bcf\u4e00\u6b21\u7684\u76f8\u8b58\u8207\u76f8\u96e2\uff0c\u90fd\u5728\u9019\u5f35\u5de8\u5927\u7684\u7db2\u8def\u5716\u4e2d\u7559\u4e0b\u7368\u7279\u7684\u5370\u8a18\u3002

    "},{"location":"chapter_graph/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 9.1 \u00a0 \u5716
    • 9.2 \u00a0 \u5716\u57fa\u790e\u64cd\u4f5c
    • 9.3 \u00a0 \u5716\u7684\u8d70\u8a2a
    • 9.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_graph/graph/","title":"9.1 \u00a0 \u5716","text":"

    \u5716\uff08graph\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u7531\u9802\u9ede\uff08vertex\uff09\u548c\u908a\uff08edge\uff09\u7d44\u6210\u3002\u6211\u5011\u53ef\u4ee5\u5c07\u5716 \\(G\\) \u62bd\u8c61\u5730\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede \\(V\\) \u548c\u4e00\u7d44\u908a \\(E\\) \u7684\u96c6\u5408\u3002\u4ee5\u4e0b\u793a\u4f8b\u5c55\u793a\u4e86\u4e00\u500b\u5305\u542b 5 \u500b\u9802\u9ede\u548c 7 \u689d\u908a\u7684\u5716\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\u5c07\u9802\u9ede\u770b\u4f5c\u7bc0\u9ede\uff0c\u5c07\u908a\u770b\u4f5c\u9023\u7dda\u5404\u500b\u7bc0\u9ede\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5c07\u5716\u770b\u4f5c\u4e00\u7a2e\u5f9e\u93c8\u7d50\u4e32\u5217\u62d3\u5c55\u800c\u4f86\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u5982\u5716 9-1 \u6240\u793a\uff0c\u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u7684\u81ea\u7531\u5ea6\u66f4\u9ad8\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002

    \u5716 9-1 \u00a0 \u93c8\u7d50\u4e32\u5217\u3001\u6a39\u3001\u5716\u4e4b\u9593\u7684\u95dc\u4fc2

    "},{"location":"chapter_graph/graph/#911","title":"9.1.1 \u00a0 \u5716\u7684\u5e38\u898b\u578b\u5225\u8207\u8853\u8a9e","text":"

    \u6839\u64da\u908a\u662f\u5426\u5177\u6709\u65b9\u5411\uff0c\u53ef\u5206\u70ba\u7121\u5411\u5716\uff08undirected graph\uff09\u548c\u6709\u5411\u5716\uff08directed graph\uff09\uff0c\u5982\u5716 9-2 \u6240\u793a\u3002

    • \u5728\u7121\u5411\u5716\u4e2d\uff0c\u908a\u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7684\u201c\u96d9\u5411\u201d\u9023\u7dda\u95dc\u4fc2\uff0c\u4f8b\u5982\u5fae\u4fe1\u6216 QQ \u4e2d\u7684\u201c\u597d\u53cb\u95dc\u4fc2\u201d\u3002
    • \u5728\u6709\u5411\u5716\u4e2d\uff0c\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u5373 \\(A \\rightarrow B\\) \u548c \\(A \\leftarrow B\\) \u5169\u500b\u65b9\u5411\u7684\u908a\u662f\u76f8\u4e92\u7368\u7acb\u7684\uff0c\u4f8b\u5982\u5fae\u535a\u6216\u6296\u97f3\u4e0a\u7684\u201c\u95dc\u6ce8\u201d\u8207\u201c\u88ab\u95dc\u6ce8\u201d\u95dc\u4fc2\u3002

    \u5716 9-2 \u00a0 \u6709\u5411\u5716\u8207\u7121\u5411\u5716

    \u6839\u64da\u6240\u6709\u9802\u9ede\u662f\u5426\u9023\u901a\uff0c\u53ef\u5206\u70ba\u9023\u901a\u5716\uff08connected graph\uff09\u548c\u975e\u9023\u901a\u5716\uff08disconnected graph\uff09\uff0c\u5982\u5716 9-3 \u6240\u793a\u3002

    • \u5c0d\u65bc\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u53ef\u4ee5\u5230\u9054\u5176\u9918\u4efb\u610f\u9802\u9ede\u3002
    • \u5c0d\u65bc\u975e\u9023\u901a\u5716\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002

    \u5716 9-3 \u00a0 \u9023\u901a\u5716\u8207\u975e\u9023\u901a\u5716

    \u6211\u5011\u9084\u53ef\u4ee5\u70ba\u908a\u65b0\u589e\u201c\u6b0a\u91cd\u201d\u8b8a\u6578\uff0c\u5f9e\u800c\u5f97\u5230\u5982\u5716 9-4 \u6240\u793a\u7684\u6709\u6b0a\u5716\uff08weighted graph\uff09\u3002\u4f8b\u5982\u5728\u300a\u738b\u8005\u69ae\u8000\u300b\u7b49\u624b\u904a\u4e2d\uff0c\u7cfb\u7d71\u6703\u6839\u64da\u5171\u540c\u904a\u6232\u6642\u9593\u4f86\u8a08\u7b97\u73a9\u5bb6\u4e4b\u9593\u7684\u201c\u89aa\u5bc6\u5ea6\u201d\uff0c\u9019\u7a2e\u89aa\u5bc6\u5ea6\u7db2\u8def\u5c31\u53ef\u4ee5\u7528\u6709\u6b0a\u5716\u4f86\u8868\u793a\u3002

    \u5716 9-4 \u00a0 \u6709\u6b0a\u5716\u8207\u7121\u6b0a\u5716

    \u5716\u8cc7\u6599\u7d50\u69cb\u5305\u542b\u4ee5\u4e0b\u5e38\u7528\u8853\u8a9e\u3002

    • \u9130\u63a5\uff08adjacency\uff09\uff1a\u7576\u5169\u9802\u9ede\u4e4b\u9593\u5b58\u5728\u908a\u76f8\u9023\u6642\uff0c\u7a31\u9019\u5169\u9802\u9ede\u201c\u9130\u63a5\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u9802\u9ede 1 \u7684\u9130\u63a5\u9802\u9ede\u70ba\u9802\u9ede 2\u30013\u30015\u3002
    • \u8def\u5f91\uff08path\uff09\uff1a\u5f9e\u9802\u9ede A \u5230\u9802\u9ede B \u7d93\u904e\u7684\u908a\u69cb\u6210\u7684\u5e8f\u5217\u88ab\u7a31\u70ba\u5f9e A \u5230 B \u7684\u201c\u8def\u5f91\u201d\u3002\u5728\u5716 9-4 \u4e2d\uff0c\u908a\u5e8f\u5217 1-5-2-4 \u662f\u9802\u9ede 1 \u5230\u9802\u9ede 4 \u7684\u4e00\u689d\u8def\u5f91\u3002
    • \u5ea6\uff08degree\uff09\uff1a\u4e00\u500b\u9802\u9ede\u64c1\u6709\u7684\u908a\u6578\u3002\u5c0d\u65bc\u6709\u5411\u5716\uff0c\u5165\u5ea6\uff08in-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u6307\u5411\u8a72\u9802\u9ede\uff0c\u51fa\u5ea6\uff08out-degree\uff09\u8868\u793a\u6709\u591a\u5c11\u689d\u908a\u5f9e\u8a72\u9802\u9ede\u6307\u51fa\u3002
    "},{"location":"chapter_graph/graph/#912","title":"9.1.2 \u00a0 \u5716\u7684\u8868\u793a","text":"

    \u5716\u7684\u5e38\u7528\u8868\u793a\u65b9\u5f0f\u5305\u62ec\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u3002\u4ee5\u4e0b\u4f7f\u7528\u7121\u5411\u5716\u9032\u884c\u8209\u4f8b\u3002

    "},{"location":"chapter_graph/graph/#1","title":"1. \u00a0 \u9130\u63a5\u77e9\u9663","text":"

    \u8a2d\u5716\u7684\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u9130\u63a5\u77e9\u9663\uff08adjacency matrix\uff09\u4f7f\u7528\u4e00\u500b \\(n \\times n\\) \u5927\u5c0f\u7684\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u662f\u5426\u5b58\u5728\u908a\u3002

    \u5982\u5716 9-5 \u6240\u793a\uff0c\u8a2d\u9130\u63a5\u77e9\u9663\u70ba \\(M\\)\u3001\u9802\u9ede\u4e32\u5217\u70ba \\(V\\) \uff0c\u90a3\u9ebc\u77e9\u9663\u5143\u7d20 \\(M[i, j] = 1\\) \u8868\u793a\u9802\u9ede \\(V[i]\\) \u5230\u9802\u9ede \\(V[j]\\) \u4e4b\u9593\u5b58\u5728\u908a\uff0c\u53cd\u4e4b \\(M[i, j] = 0\\) \u8868\u793a\u5169\u9802\u9ede\u4e4b\u9593\u7121\u908a\u3002

    \u5716 9-5 \u00a0 \u5716\u7684\u9130\u63a5\u77e9\u9663\u8868\u793a

    \u9130\u63a5\u77e9\u9663\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u9802\u9ede\u4e0d\u80fd\u8207\u81ea\u8eab\u76f8\u9023\uff0c\u56e0\u6b64\u9130\u63a5\u77e9\u9663\u4e3b\u5c0d\u89d2\u7dda\u5143\u7d20\u6c92\u6709\u610f\u7fa9\u3002
    • \u5c0d\u65bc\u7121\u5411\u5716\uff0c\u5169\u500b\u65b9\u5411\u7684\u908a\u7b49\u50f9\uff0c\u6b64\u6642\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\u3002
    • \u5c07\u9130\u63a5\u77e9\u9663\u7684\u5143\u7d20\u5f9e \\(1\\) \u548c \\(0\\) \u66ff\u63db\u70ba\u6b0a\u91cd\uff0c\u5247\u53ef\u8868\u793a\u6709\u6b0a\u5716\u3002

    \u4f7f\u7528\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u8a2a\u554f\u77e9\u9663\u5143\u7d20\u4ee5\u7372\u53d6\u908a\uff0c\u56e0\u6b64\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002\u7136\u800c\uff0c\u77e9\u9663\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u8a18\u61b6\u9ad4\u4f54\u7528\u8f03\u591a\u3002

    "},{"location":"chapter_graph/graph/#2","title":"2. \u00a0 \u9130\u63a5\u8868","text":"

    \u9130\u63a5\u8868\uff08adjacency list\uff09\u4f7f\u7528 \\(n\\) \u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u8868\u793a\u9802\u9ede\u3002\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff08\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u9802\u9ede\uff09\u3002\u5716 9-6 \u5c55\u793a\u4e86\u4e00\u500b\u4f7f\u7528\u9130\u63a5\u8868\u5132\u5b58\u7684\u5716\u7684\u793a\u4f8b\u3002

    \u5716 9-6 \u00a0 \u5716\u7684\u9130\u63a5\u8868\u8868\u793a

    \u9130\u63a5\u8868\u50c5\u5132\u5b58\u5be6\u969b\u5b58\u5728\u7684\u908a\uff0c\u800c\u908a\u7684\u7e3d\u6578\u901a\u5e38\u9060\u5c0f\u65bc \\(n^2\\) \uff0c\u56e0\u6b64\u5b83\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002\u7136\u800c\uff0c\u5728\u9130\u63a5\u8868\u4e2d\u9700\u8981\u900f\u904e\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u5176\u6642\u9593\u6548\u7387\u4e0d\u5982\u9130\u63a5\u77e9\u9663\u3002

    \u89c0\u5bdf\u5716 9-6 \uff0c\u9130\u63a5\u8868\u7d50\u69cb\u8207\u96dc\u6e4a\u8868\u4e2d\u7684\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u975e\u5e38\u76f8\u4f3c\uff0c\u56e0\u6b64\u6211\u5011\u4e5f\u53ef\u4ee5\u63a1\u7528\u985e\u4f3c\u7684\u65b9\u6cd5\u4f86\u6700\u4f73\u5316\u6548\u7387\u3002\u6bd4\u5982\u7576\u93c8\u7d50\u4e32\u5217\u8f03\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u6548\u7387\u5f9e \\(O(n)\\) \u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \uff1b\u9084\u53ef\u4ee5\u628a\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u964d\u81f3 \\(O(1)\\) \u3002

    "},{"location":"chapter_graph/graph/#913","title":"9.1.3 \u00a0 \u5716\u7684\u5e38\u898b\u61c9\u7528","text":"

    \u5982\u8868 9-1 \u6240\u793a\uff0c\u8a31\u591a\u73fe\u5be6\u7cfb\u7d71\u53ef\u4ee5\u7528\u5716\u4f86\u5efa\u6a21\uff0c\u76f8\u61c9\u7684\u554f\u984c\u4e5f\u53ef\u4ee5\u7d04\u5316\u70ba\u5716\u8a08\u7b97\u554f\u984c\u3002

    \u8868 9-1 \u00a0 \u73fe\u5be6\u751f\u6d3b\u4e2d\u5e38\u898b\u7684\u5716

    \u9802\u9ede \u908a \u5716\u8a08\u7b97\u554f\u984c \u793e\u4ea4\u7db2\u8def \u4f7f\u7528\u8005 \u597d\u53cb\u95dc\u4fc2 \u6f5b\u5728\u597d\u53cb\u63a8\u85a6 \u5730\u9435\u7dda\u8def \u7ad9\u9ede \u7ad9\u9ede\u9593\u7684\u9023\u901a\u6027 \u6700\u77ed\u8def\u7dda\u63a8\u85a6 \u592a\u967d\u7cfb \u661f\u9ad4 \u661f\u9ad4\u9593\u7684\u842c\u6709\u5f15\u529b\u4f5c\u7528 \u884c\u661f\u8ecc\u9053\u8a08\u7b97"},{"location":"chapter_graph/graph_operations/","title":"9.2 \u00a0 \u5716\u7684\u57fa\u790e\u64cd\u4f5c","text":"

    \u5716\u7684\u57fa\u790e\u64cd\u4f5c\u53ef\u5206\u70ba\u5c0d\u201c\u908a\u201d\u7684\u64cd\u4f5c\u548c\u5c0d\u201c\u9802\u9ede\u201d\u7684\u64cd\u4f5c\u3002\u5728\u201c\u9130\u63a5\u77e9\u9663\u201d\u548c\u201c\u9130\u63a5\u8868\u201d\u5169\u7a2e\u8868\u793a\u65b9\u6cd5\u4e0b\uff0c\u5be6\u73fe\u65b9\u5f0f\u6709\u6240\u4e0d\u540c\u3002

    "},{"location":"chapter_graph/graph_operations/#921","title":"9.2.1 \u00a0 \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u7684\u5be6\u73fe","text":"

    \u7d66\u5b9a\u4e00\u500b\u9802\u9ede\u6578\u91cf\u70ba \\(n\\) \u7684\u7121\u5411\u5716\uff0c\u5247\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u5f0f\u5982\u5716 9-7 \u6240\u793a\u3002

    • \u65b0\u589e\u6216\u522a\u9664\u908a\uff1a\u76f4\u63a5\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u4fee\u6539\u6307\u5b9a\u7684\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u800c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u9700\u8981\u540c\u6642\u66f4\u65b0\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u7684\u5c3e\u90e8\u65b0\u589e\u4e00\u884c\u4e00\u5217\uff0c\u4e26\u5168\u90e8\u586b \\(0\\) \u5373\u53ef\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u522a\u9664\u9802\u9ede\uff1a\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u4e00\u884c\u4e00\u5217\u3002\u7576\u522a\u9664\u9996\u884c\u9996\u5217\u6642\u9054\u5230\u6700\u5dee\u60c5\u6cc1\uff0c\u9700\u8981\u5c07 \\((n-1)^2\\) \u500b\u5143\u7d20\u201c\u5411\u5de6\u4e0a\u79fb\u52d5\u201d\uff0c\u5f9e\u800c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u521d\u59cb\u5316\uff1a\u50b3\u5165 \\(n\\) \u500b\u9802\u9ede\uff0c\u521d\u59cb\u5316\u9577\u5ea6\u70ba \\(n\\) \u7684\u9802\u9ede\u4e32\u5217 vertices \uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff1b\u521d\u59cb\u5316 \\(n \\times n\\) \u5927\u5c0f\u7684\u9130\u63a5\u77e9\u9663 adjMat \uff0c\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    \u521d\u59cb\u5316\u9130\u63a5\u77e9\u9663\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

    \u5716 9-7 \u00a0 \u9130\u63a5\u77e9\u9663\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

    \u4ee5\u4e0b\u662f\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u8868\u793a\u5716\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_matrix.py
    class GraphAdjMat:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, vertices: list[int], edges: list[list[int]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.vertices: list[int] = []\n        # \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n        self.adj_mat: list[list[int]] = []\n        # \u65b0\u589e\u9802\u9ede\n        for val in vertices:\n            self.add_vertex(val)\n        # \u65b0\u589e\u908a\n        # \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.vertices)\n\n    def add_vertex(self, val: int):\n        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        n = self.size()\n        # \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.append(val)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        new_row = [0] * n\n        self.adj_mat.append(new_row)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in self.adj_mat:\n            row.append(0)\n\n    def remove_vertex(self, index: int):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if index >= self.size():\n            raise IndexError()\n        # \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.pop(index)\n        # \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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        \"\"\"\u65b0\u589e\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 or j < 0 or i >= self.size() or j >= self.size() or i == j:\n            raise IndexError()\n        # \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\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        \"\"\"\u522a\u9664\u908a\"\"\"\n        # \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        # \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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        \"\"\"\u5217\u5370\u9130\u63a5\u77e9\u9663\"\"\"\n        print(\"\u9802\u9ede\u4e32\u5217 =\", self.vertices)\n        print(\"\u9130\u63a5\u77e9\u9663 =\")\n        print_matrix(self.adj_mat)\n
    graph_adjacency_matrix.cpp
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vector<int> vertices;       // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vector<vector<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    GraphAdjMat(const vector<int> &vertices, const vector<vector<int>> &edges) {\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const vector<int> &edge : edges) {\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() const {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.push_back(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        adjMat.emplace_back(vector<int>(n, 0));\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (vector<int> &row : adjMat) {\n            row.push_back(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(int index) {\n        if (index >= size()) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.erase(vertices.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.erase(adjMat.begin() + index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (vector<int> &row : adjMat) {\n            row.erase(row.begin() + index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n            throw out_of_range(\"\u9802\u9ede\u4e0d\u5b58\u5728\");\n        }\n        adjMat[i][j] = 0;\n        adjMat[j][i] = 0;\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    void print() {\n        cout << \"\u9802\u9ede\u4e32\u5217 = \";\n        printVector(vertices);\n        cout << \"\u9130\u63a5\u77e9\u9663 =\" << endl;\n        printVectorMatrix(adjMat);\n    }\n};\n
    graph_adjacency_matrix.java
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<Integer> vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<Integer>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = new ArrayList<>();\n        this.adjMat = new ArrayList<>();\n        // \u65b0\u589e\u9802\u9ede\n        for (int val : vertices) {\n            addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (int[] e : edges) {\n            addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return vertices.size();\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(int val) {\n        int n = size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (List<Integer> row : adjMat) {\n            row.add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(int index) {\n        if (index >= size())\n            throw new IndexOutOfBoundsException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (List<Integer> row : adjMat) {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void addEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw new IndexOutOfBoundsException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat.get(i).set(j, 1);\n        adjMat.get(j).set(i, 1);\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void removeEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void print() {\n        System.out.print(\"\u9802\u9ede\u4e32\u5217 = \");\n        System.out.println(vertices);\n        System.out.println(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.printMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.cs
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    List<int> vertices;     // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    List<List<int>> adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjMat(int[] vertices, int[][] edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        foreach (int val in vertices) {\n            AddVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        foreach (int[] e in edges) {\n            AddEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return vertices.Count;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(int val) {\n        int n = Size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.Add(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        foreach (List<int> row in adjMat) {\n            row.Add(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(int index) {\n        if (index >= Size())\n            throw new IndexOutOfRangeException();\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.RemoveAt(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        foreach (List<int> row in adjMat) {\n            row.RemoveAt(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void AddEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= Size() || j >= Size() || i == j)\n            throw new IndexOutOfRangeException();\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1;\n        adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    public void RemoveEdge(int i, int j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    public void Print() {\n        Console.Write(\"\u9802\u9ede\u4e32\u5217 = \");\n        PrintUtil.PrintList(vertices);\n        Console.WriteLine(\"\u9130\u63a5\u77e9\u9663 =\");\n        PrintUtil.PrintMatrix(adjMat);\n    }\n}\n
    graph_adjacency_matrix.go
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjMat struct {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    vertices []int\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat [][]int\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjMat(vertices []int, edges [][]int) *graphAdjMat {\n    // \u65b0\u589e\u9802\u9ede\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\u5716\n    g := &graphAdjMat{\n        vertices: vertices,\n        adjMat:   adjMat,\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjMat) size() int {\n    return len(g.vertices)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjMat) addVertex(val int) {\n    n := g.size()\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    g.vertices = append(g.vertices, val)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    newRow := make([]int, n)\n    g.adjMat = append(g.adjMat, newRow)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for i := range g.adjMat {\n        g.adjMat[i] = append(g.adjMat[i], 0)\n    }\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjMat) removeVertex(index int) {\n    if index >= g.size() {\n        return\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    g.vertices = append(g.vertices[:index], g.vertices[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    g.adjMat = append(g.adjMat[:index], g.adjMat[index+1:]...)\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) addEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    g.adjMat[i][j] = 1\n    g.adjMat[j][i] = 1\n}\n\n/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\nfunc (g *graphAdjMat) removeEdge(i, j int) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nfunc (g *graphAdjMat) print() {\n    fmt.Printf(\"\\t\u9802\u9ede\u4e32\u5217 = %v\\n\", g.vertices)\n    fmt.Printf(\"\\t\u9130\u63a5\u77e9\u9663 = \\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\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    private var vertices: [Int] // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    private var adjMat: [[Int]] // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init(vertices: [Int], edges: [[Int]]) {\n        self.vertices = []\n        adjMat = []\n        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            addVertex(val: val)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for e in edges {\n            addEdge(i: e[0], j: e[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    func size() -> Int {\n        vertices.count\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    func addVertex(val: Int) {\n        let n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.append(val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        let newRow = Array(repeating: 0, count: n)\n        adjMat.append(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for i in adjMat.indices {\n            adjMat[i].append(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    func removeVertex(index: Int) {\n        if index >= size() {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.remove(at: index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for i in adjMat.indices {\n            adjMat[i].remove(at: index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i < 0 || j < 0 || i >= size() || j >= size() || i == j {\n            fatalError(\"\u8d8a\u754c\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    func removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    func print() {\n        Swift.print(\"\u9802\u9ede\u4e32\u5217 = \", terminator: \"\")\n        Swift.print(vertices)\n        Swift.print(\"\u9130\u63a5\u77e9\u9663 =\")\n        PrintUtil.printMatrix(matrix: adjMat)\n    }\n}\n
    graph_adjacency_matrix.js
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices, edges) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val) {\n        const n = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index) {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i, j) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print() {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.ts
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n    vertices: number[]; // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    adjMat: number[][]; // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(vertices: number[], edges: number[][]) {\n        this.vertices = [];\n        this.adjMat = [];\n        // \u65b0\u589e\u9802\u9ede\n        for (const val of vertices) {\n            this.addVertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (const e of edges) {\n            this.addEdge(e[0], e[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.vertices.length;\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(val: number): void {\n        const n: number = this.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        this.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\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\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (const row of this.adjMat) {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(index: number): void {\n        if (index >= this.size()) {\n            throw new RangeError('Index Out Of Bounds Exception');\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        this.vertices.splice(index, 1);\n\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        this.adjMat.splice(index, 1);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (const row of this.adjMat) {\n            row.splice(index, 1);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    addEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) === (j, i)\n        this.adjMat[i][j] = 1;\n        this.adjMat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    removeEdge(i: number, j: number): void {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    print(): void {\n        console.log('\u9802\u9ede\u4e32\u5217 = ', this.vertices);\n        console.log('\u9130\u63a5\u77e9\u9663 =', this.adjMat);\n    }\n}\n
    graph_adjacency_matrix.dart
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat {\n  List<int> vertices = []; // \u9802\u9ede\u5143\u7d20\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n  List<List<int>> adjMat = []; //\u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n  /* \u5efa\u69cb\u5b50 */\n  GraphAdjMat(List<int> vertices, List<List<int>> edges) {\n    this.vertices = [];\n    this.adjMat = [];\n    // \u65b0\u589e\u9802\u9ede\n    for (int val in vertices) {\n      addVertex(val);\n    }\n    // \u65b0\u589e\u908a\n    // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    for (List<int> e in edges) {\n      addEdge(e[0], e[1]);\n    }\n  }\n\n  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return vertices.length;\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(int val) {\n    int n = size();\n    // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n    vertices.add(val);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n    List<int> newRow = List.filled(n, 0, growable: true);\n    adjMat.add(newRow);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n    for (List<int> row in adjMat) {\n      row.add(0);\n    }\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(int index) {\n    if (index >= size()) {\n      throw IndexError;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    vertices.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n    adjMat.removeAt(index);\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n    for (List<int> row in adjMat) {\n      row.removeAt(index);\n    }\n  }\n\n  /* \u65b0\u589e\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void addEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n    if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) {\n      throw IndexError;\n    }\n    // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n    adjMat[i][j] = 1;\n    adjMat[j][i] = 1;\n  }\n\n  /* \u522a\u9664\u908a */\n  // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n  void removeEdge(int i, int j) {\n    // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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  /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n  void printAdjMat() {\n    print(\"\u9802\u9ede\u4e32\u5217 = $vertices\");\n    print(\"\u9130\u63a5\u77e9\u9663 = \");\n    printMatrix(adjMat);\n  }\n}\n
    graph_adjacency_matrix.rs
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjMat {\n    // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub vertices: Vec<i32>,\n    // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    pub adj_mat: Vec<Vec<i32>>,\n}\n\nimpl GraphAdjMat {\n    /* \u5efa\u69cb\u5b50 */\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        // \u65b0\u589e\u9802\u9ede\n        for val in vertices {\n            graph.add_vertex(val);\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    pub fn size(&self) -> usize {\n        self.vertices.len()\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, val: i32) {\n        let n = self.size();\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        self.vertices.push(val);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        self.adj_mat.push(vec![0; n]);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for row in &mut self.adj_mat {\n            row.push(0);\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    pub fn remove_vertex(&mut self, index: usize) {\n        if index >= self.size() {\n            panic!(\"index error\")\n        }\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        self.vertices.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        self.adj_mat.remove(index);\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for row in &mut self.adj_mat {\n            row.remove(index);\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    pub fn add_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if i >= self.size() || j >= self.size() || i == j {\n            panic!(\"index error\")\n        }\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        self.adj_mat[i][j] = 1;\n        self.adj_mat[j][i] = 1;\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    pub fn remove_edge(&mut self, i: usize, j: usize) {\n        // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    pub fn print(&self) {\n        println!(\"\u9802\u9ede\u4e32\u5217 = {:?}\", self.vertices);\n        println!(\"\u9130\u63a5\u77e9\u9663 =\");\n        println!(\"[\");\n        for row in &self.adj_mat {\n            println!(\"  {:?},\", row);\n        }\n        println!(\"]\")\n    }\n}\n
    graph_adjacency_matrix.c
    /* \u57fa\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int vertices[MAX_SIZE];\n    int adjMat[MAX_SIZE][MAX_SIZE];\n    int size;\n} GraphAdjMat;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delGraphAdjMat(GraphAdjMat *graph) {\n    free(graph);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nvoid addVertex(GraphAdjMat *graph, int val) {\n    if (graph->size == MAX_SIZE) {\n        fprintf(stderr, \"\u5716\u7684\u9802\u9ede\u6578\u91cf\u5df2\u9054\u6700\u5927\u503c\\n\");\n        return;\n    }\n    // \u65b0\u589e\u7b2c n \u500b\u9802\u9ede\uff0c\u4e26\u5c07\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/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjMat *graph, int index) {\n    if (index < 0 || index >= graph->size) {\n        fprintf(stderr, \"\u9802\u9ede\u7d22\u5f15\u8d8a\u754c\\n\");\n        return;\n    }\n    // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n    for (int i = index; i < graph->size - 1; i++) {\n        graph->vertices[i] = graph->vertices[i + 1];\n    }\n    // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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\u9130\u63a5\u77e9\u9663\u4e2d\u522a\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/* \u65b0\u589e\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 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, \"\u908a\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/* \u522a\u9664\u908a */\n// \u53c3\u6578 i, j \u5c0d\u61c9 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, \"\u908a\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/* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\nvoid printGraphAdjMat(GraphAdjMat *graph) {\n    printf(\"\u9802\u9ede\u4e32\u5217 = \");\n    printArray(graph->vertices, graph->size);\n    printf(\"\u9130\u63a5\u77e9\u9663 =\\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\u65bc\u9130\u63a5\u77e9\u9663\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjMat(vertices: IntArray, edges: Array<IntArray>) {\n    val vertices = mutableListOf<Int>() // \u9802\u9ede\u4e32\u5217\uff0c\u5143\u7d20\u4ee3\u8868\u201c\u9802\u9ede\u503c\u201d\uff0c\u7d22\u5f15\u4ee3\u8868\u201c\u9802\u9ede\u7d22\u5f15\u201d\n    val adjMat = mutableListOf<MutableList<Int>>() // \u9130\u63a5\u77e9\u9663\uff0c\u884c\u5217\u7d22\u5f15\u5c0d\u61c9\u201c\u9802\u9ede\u7d22\u5f15\u201d\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u9802\u9ede\n        for (vertex in vertices) {\n            addVertex(vertex)\n        }\n        // \u65b0\u589e\u908a\n        // \u8acb\u6ce8\u610f\uff0cedges \u5143\u7d20\u4ee3\u8868\u9802\u9ede\u7d22\u5f15\uff0c\u5373\u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n        for (edge in edges) {\n            addEdge(edge[0], edge[1])\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return vertices.size\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(_val: Int) {\n        val n = size()\n        // \u5411\u9802\u9ede\u4e32\u5217\u4e2d\u65b0\u589e\u65b0\u9802\u9ede\u7684\u503c\n        vertices.add(_val)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u884c\n        val newRow = mutableListOf<Int>()\n        for (j in 0..<n) {\n            newRow.add(0)\n        }\n        adjMat.add(newRow)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u65b0\u589e\u4e00\u5217\n        for (row in adjMat) {\n            row.add(0)\n        }\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(index: Int) {\n        if (index >= size())\n            throw IndexOutOfBoundsException()\n        // \u5728\u9802\u9ede\u4e32\u5217\u4e2d\u79fb\u9664\u7d22\u5f15 index \u7684\u9802\u9ede\n        vertices.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u884c\n        adjMat.removeAt(index)\n        // \u5728\u9130\u63a5\u77e9\u9663\u4e2d\u522a\u9664\u7d22\u5f15 index \u7684\u5217\n        for (row in adjMat) {\n            row.removeAt(index)\n        }\n    }\n\n    /* \u65b0\u589e\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun addEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\u7406\n        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)\n            throw IndexOutOfBoundsException()\n        // \u5728\u7121\u5411\u5716\u4e2d\uff0c\u9130\u63a5\u77e9\u9663\u95dc\u65bc\u4e3b\u5c0d\u89d2\u7dda\u5c0d\u7a31\uff0c\u5373\u6eff\u8db3 (i, j) == (j, i)\n        adjMat[i][j] = 1\n        adjMat[j][i] = 1\n    }\n\n    /* \u522a\u9664\u908a */\n    // \u53c3\u6578 i, j \u5c0d\u61c9 vertices \u5143\u7d20\u7d22\u5f15\n    fun removeEdge(i: Int, j: Int) {\n        // \u7d22\u5f15\u8d8a\u754c\u8207\u76f8\u7b49\u8655\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    /* \u5217\u5370\u9130\u63a5\u77e9\u9663 */\n    fun print() {\n        print(\"\u9802\u9ede\u4e32\u5217 = \")\n        println(vertices)\n        println(\"\u9130\u63a5\u77e9\u9663 =\")\n        printMatrix(adjMat)\n    }\n}\n
    graph_adjacency_matrix.rb
    [class]{GraphAdjMat}-[func]{}\n
    graph_adjacency_matrix.zig
    [class]{GraphAdjMat}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/graph_operations/#922","title":"9.2.2 \u00a0 \u57fa\u65bc\u9130\u63a5\u8868\u7684\u5be6\u73fe","text":"

    \u8a2d\u7121\u5411\u5716\u7684\u9802\u9ede\u7e3d\u6578\u70ba \\(n\\)\u3001\u908a\u7e3d\u6578\u70ba \\(m\\) \uff0c\u5247\u53ef\u6839\u64da\u5716 9-8 \u6240\u793a\u7684\u65b9\u6cd5\u5be6\u73fe\u5404\u7a2e\u64cd\u4f5c\u3002

    • \u65b0\u589e\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u7684\u672b\u5c3e\u65b0\u589e\u908a\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002\u56e0\u70ba\u662f\u7121\u5411\u5716\uff0c\u6240\u4ee5\u9700\u8981\u540c\u6642\u65b0\u589e\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u522a\u9664\u908a\uff1a\u5728\u9802\u9ede\u5c0d\u61c9\u93c8\u7d50\u4e32\u5217\u4e2d\u67e5\u8a62\u4e26\u522a\u9664\u6307\u5b9a\u908a\uff0c\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\u3002\u5728\u7121\u5411\u5716\u4e2d\uff0c\u9700\u8981\u540c\u6642\u522a\u9664\u5169\u500b\u65b9\u5411\u7684\u908a\u3002
    • \u65b0\u589e\u9802\u9ede\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u93c8\u7d50\u4e32\u5217\uff0c\u4e26\u5c07\u65b0\u589e\u9802\u9ede\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
    • \u522a\u9664\u9802\u9ede\uff1a\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u522a\u9664\u5305\u542b\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
    • \u521d\u59cb\u5316\uff1a\u5728\u9130\u63a5\u8868\u4e2d\u5efa\u7acb \\(n\\) \u500b\u9802\u9ede\u548c \\(2m\\) \u689d\u908a\uff0c\u4f7f\u7528 \\(O(n + m)\\) \u6642\u9593\u3002
    \u521d\u59cb\u5316\u9130\u63a5\u8868\u65b0\u589e\u908a\u522a\u9664\u908a\u65b0\u589e\u9802\u9ede\u522a\u9664\u9802\u9ede

    \u5716 9-8 \u00a0 \u9130\u63a5\u8868\u7684\u521d\u59cb\u5316\u3001\u589e\u522a\u908a\u3001\u589e\u522a\u9802\u9ede

    \u4ee5\u4e0b\u662f\u9130\u63a5\u8868\u7684\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u6bd4\u5716 9-8 \uff0c\u5be6\u969b\u7a0b\u5f0f\u78bc\u6709\u4ee5\u4e0b\u4e0d\u540c\u3002

    • \u70ba\u4e86\u65b9\u4fbf\u65b0\u589e\u8207\u522a\u9664\u9802\u9ede\uff0c\u4ee5\u53ca\u7c21\u5316\u7a0b\u5f0f\u78bc\uff0c\u6211\u5011\u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f86\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\u3002
    • \u4f7f\u7528\u96dc\u6e4a\u8868\u4f86\u5132\u5b58\u9130\u63a5\u8868\uff0ckey \u70ba\u9802\u9ede\u4f8b\u9805\uff0cvalue \u70ba\u8a72\u9802\u9ede\u7684\u9130\u63a5\u9802\u9ede\u4e32\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u3002

    \u53e6\u5916\uff0c\u6211\u5011\u5728\u9130\u63a5\u8868\u4e2d\u4f7f\u7528 Vertex \u985e\u5225\u4f86\u8868\u793a\u9802\u9ede\uff0c\u9019\u6a23\u505a\u7684\u539f\u56e0\u662f\uff1a\u5982\u679c\u8207\u9130\u63a5\u77e9\u9663\u4e00\u6a23\uff0c\u7528\u4e32\u5217\u7d22\u5f15\u4f86\u5340\u5206\u4e0d\u540c\u9802\u9ede\uff0c\u90a3\u9ebc\u5047\u8a2d\u8981\u522a\u9664\u7d22\u5f15\u70ba \\(i\\) \u7684\u9802\u9ede\uff0c\u5247\u9700\u8d70\u8a2a\u6574\u500b\u9130\u63a5\u8868\uff0c\u5c07\u6240\u6709\u5927\u65bc \\(i\\) \u7684\u7d22\u5f15\u5168\u90e8\u6e1b \\(1\\) \uff0c\u6548\u7387\u5f88\u4f4e\u3002\u800c\u5982\u679c\u6bcf\u500b\u9802\u9ede\u90fd\u662f\u552f\u4e00\u7684 Vertex \u4f8b\u9805\uff0c\u522a\u9664\u67d0\u4e00\u9802\u9ede\u4e4b\u5f8c\u5c31\u7121\u9808\u6539\u52d5\u5176\u4ed6\u9802\u9ede\u4e86\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_adjacency_list.py
    class GraphAdjList:\n    \"\"\"\u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225\"\"\"\n\n    def __init__(self, edges: list[list[Vertex]]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        self.adj_list = dict[Vertex, list[Vertex]]()\n        # \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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        \"\"\"\u7372\u53d6\u9802\u9ede\u6578\u91cf\"\"\"\n        return len(self.adj_list)\n\n    def add_edge(self, vet1: Vertex, vet2: Vertex):\n        \"\"\"\u65b0\u589e\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u65b0\u589e\u908a 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        \"\"\"\u522a\u9664\u908a\"\"\"\n        if vet1 not in self.adj_list or vet2 not in self.adj_list or vet1 == vet2:\n            raise ValueError()\n        # \u522a\u9664\u908a 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        \"\"\"\u65b0\u589e\u9802\u9ede\"\"\"\n        if vet in self.adj_list:\n            return\n        # \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list[vet] = []\n\n    def remove_vertex(self, vet: Vertex):\n        \"\"\"\u522a\u9664\u9802\u9ede\"\"\"\n        if vet not in self.adj_list:\n            raise ValueError()\n        # \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.pop(vet)\n        # \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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        \"\"\"\u5217\u5370\u9130\u63a5\u8868\"\"\"\n        print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  public:\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    unordered_map<Vertex *, vector<Vertex *>> adjList;\n\n    /* \u5728 vector \u4e2d\u522a\u9664\u6307\u5b9a\u7bc0\u9ede */\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    /* \u5efa\u69cb\u5b50 */\n    GraphAdjList(const vector<vector<Vertex *>> &edges) {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    void addEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].push_back(vet2);\n        adjList[vet2].push_back(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    void removeEdge(Vertex *vet1, Vertex *vet2) {\n        if (!adjList.count(vet1) || !adjList.count(vet2) || vet1 == vet2)\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u522a\u9664\u908a vet1 - vet2\n        remove(adjList[vet1], vet2);\n        remove(adjList[vet2], vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    void addVertex(Vertex *vet) {\n        if (adjList.count(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = vector<Vertex *>();\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    void removeVertex(Vertex *vet) {\n        if (!adjList.count(vet))\n            throw invalid_argument(\"\u4e0d\u5b58\u5728\u9802\u9ede\");\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.erase(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (auto &adj : adjList) {\n            remove(adj.second, vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    void print() {\n        cout << \"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    Map<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        this.adjList = new HashMap<>();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (Vertex[] edge : edges) {\n            addVertex(edge[0]);\n            addVertex(edge[1]);\n            addEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public int size() {\n        return adjList.size();\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void addEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList.get(vet1).add(vet2);\n        adjList.get(vet2).add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void removeEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw new IllegalArgumentException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList.get(vet1).remove(vet2);\n        adjList.get(vet2).remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void addVertex(Vertex vet) {\n        if (adjList.containsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.put(vet, new ArrayList<>());\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void removeVertex(Vertex vet) {\n        if (!adjList.containsKey(vet))\n            throw new IllegalArgumentException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (List<Vertex> list : adjList.values()) {\n            list.remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void print() {\n        System.out.println(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public Dictionary<Vertex, List<Vertex>> adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    public GraphAdjList(Vertex[][] edges) {\n        adjList = [];\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        foreach (Vertex[] edge in edges) {\n            AddVertex(edge[0]);\n            AddVertex(edge[1]);\n            AddEdge(edge[0], edge[1]);\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    int Size() {\n        return adjList.Count;\n    }\n\n    /* \u65b0\u589e\u908a */\n    public void AddEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1].Add(vet2);\n        adjList[vet2].Add(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\n    public void RemoveEdge(Vertex vet1, Vertex vet2) {\n        if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2)\n            throw new InvalidOperationException();\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1].Remove(vet2);\n        adjList[vet2].Remove(vet1);\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public void AddVertex(Vertex vet) {\n        if (adjList.ContainsKey(vet))\n            return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList.Add(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public void RemoveVertex(Vertex vet) {\n        if (!adjList.ContainsKey(vet))\n            throw new InvalidOperationException();\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.Remove(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        foreach (List<Vertex> list in adjList.Values) {\n            list.Remove(vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public void Print() {\n        Console.WriteLine(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntype graphAdjList struct {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList map[Vertex][]Vertex\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newGraphAdjList(edges [][]Vertex) *graphAdjList {\n    g := &graphAdjList{\n        adjList: make(map[Vertex][]Vertex),\n    }\n    // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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/* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\nfunc (g *graphAdjList) size() int {\n    return len(g.adjList)\n}\n\n/* \u65b0\u589e\u908a */\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    // \u65b0\u589e\u908a vet1 - vet2, \u65b0\u589e\u533f\u540d struct{},\n    g.adjList[vet1] = append(g.adjList[vet1], vet2)\n    g.adjList[vet2] = append(g.adjList[vet2], vet1)\n}\n\n/* \u522a\u9664\u908a */\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    // \u522a\u9664\u908a vet1 - vet2\n    g.adjList[vet1] = DeleteSliceElms(g.adjList[vet1], vet2)\n    g.adjList[vet2] = DeleteSliceElms(g.adjList[vet2], vet1)\n}\n\n/* \u65b0\u589e\u9802\u9ede */\nfunc (g *graphAdjList) addVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if ok {\n        return\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    g.adjList[vet] = make([]Vertex, 0)\n}\n\n/* \u522a\u9664\u9802\u9ede */\nfunc (g *graphAdjList) removeVertex(vet Vertex) {\n    _, ok := g.adjList[vet]\n    if !ok {\n        panic(\"error\")\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    delete(g.adjList, vet)\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    for v, list := range g.adjList {\n        g.adjList[v] = DeleteSliceElms(list, vet)\n    }\n}\n\n/* \u5217\u5370\u9130\u63a5\u8868 */\nfunc (g *graphAdjList) print() {\n    var builder strings.Builder\n    fmt.Printf(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    public private(set) var adjList: [Vertex: [Vertex]]\n\n    /* \u5efa\u69cb\u5b50 */\n    public init(edges: [[Vertex]]) {\n        adjList = [:]\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    public func size() -> Int {\n        adjList.count\n    }\n\n    /* \u65b0\u589e\u908a */\n    public func addEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.append(vet2)\n        adjList[vet2]?.append(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    public func removeEdge(vet1: Vertex, vet2: Vertex) {\n        if adjList[vet1] == nil || adjList[vet2] == nil || vet1 == vet2 {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.removeAll { $0 == vet2 }\n        adjList[vet2]?.removeAll { $0 == vet1 }\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    public func addVertex(vet: Vertex) {\n        if adjList[vet] != nil {\n            return\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = []\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    public func removeVertex(vet: Vertex) {\n        if adjList[vet] == nil {\n            fatalError(\"\u53c3\u6578\u932f\u8aa4\")\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.removeValue(forKey: vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for key in adjList.keys {\n            adjList[key]?.removeAll { $0 == vet }\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    public func print() {\n        Swift.print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size() {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet) {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet) {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print() {\n        console.log('\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    adjList: Map<Vertex, Vertex[]>;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(edges: Vertex[][]) {\n        this.adjList = new Map();\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    size(): number {\n        return this.adjList.size;\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a vet1 - vet2\n        this.adjList.get(vet1).push(vet2);\n        this.adjList.get(vet2).push(vet1);\n    }\n\n    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    addVertex(vet: Vertex): void {\n        if (this.adjList.has(vet)) return;\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        this.adjList.set(vet, []);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    removeVertex(vet: Vertex): void {\n        if (!this.adjList.has(vet)) {\n            throw new Error('Illegal Argument Exception');\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        this.adjList.delete(vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    /* \u5217\u5370\u9130\u63a5\u8868 */\n    print(): void {\n        console.log('\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList {\n  // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  Map<Vertex, List<Vertex>> adjList = {};\n\n  /* \u5efa\u69cb\u5b50 */\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  /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n  int size() {\n    return adjList.length;\n  }\n\n  /* \u65b0\u589e\u908a */\n  void addEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u65b0\u589e\u908a vet1 - vet2\n    adjList[vet1]!.add(vet2);\n    adjList[vet2]!.add(vet1);\n  }\n\n  /* \u522a\u9664\u908a */\n  void removeEdge(Vertex vet1, Vertex vet2) {\n    if (!adjList.containsKey(vet1) ||\n        !adjList.containsKey(vet2) ||\n        vet1 == vet2) {\n      throw ArgumentError;\n    }\n    // \u522a\u9664\u908a vet1 - vet2\n    adjList[vet1]!.remove(vet2);\n    adjList[vet2]!.remove(vet1);\n  }\n\n  /* \u65b0\u589e\u9802\u9ede */\n  void addVertex(Vertex vet) {\n    if (adjList.containsKey(vet)) return;\n    // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    adjList[vet] = [];\n  }\n\n  /* \u522a\u9664\u9802\u9ede */\n  void removeVertex(Vertex vet) {\n    if (!adjList.containsKey(vet)) {\n      throw ArgumentError;\n    }\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    adjList.remove(vet);\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n    adjList.forEach((key, value) {\n      value.remove(vet);\n    });\n  }\n\n  /* \u5217\u5370\u9130\u63a5\u8868 */\n  void printAdjList() {\n    print(\"\u9130\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u578b\u5225 */\npub struct GraphAdjList {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    pub adj_list: HashMap<Vertex, Vec<Vertex>>,\n}\n\nimpl GraphAdjList {\n    /* \u5efa\u69cb\u5b50 */\n    pub fn new(edges: Vec<[Vertex; 2]>) -> Self {\n        let mut graph = GraphAdjList {\n            adj_list: HashMap::new(),\n        };\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\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    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    #[allow(unused)]\n    pub fn size(&self) -> usize {\n        self.adj_list.len()\n    }\n\n    /* \u65b0\u589e\u908a */\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        // \u65b0\u589e\u908a 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    /* \u522a\u9664\u908a */\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        // \u522a\u9664\u908a 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    /* \u65b0\u589e\u9802\u9ede */\n    pub fn add_vertex(&mut self, vet: Vertex) {\n        if self.adj_list.contains_key(&vet) {\n            return;\n        }\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        self.adj_list.insert(vet, vec![]);\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\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\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        self.adj_list.remove(&vet);\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for list in self.adj_list.values_mut() {\n            list.retain(|&v| v != vet);\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    pub fn print(&self) {\n        println!(\"\u9130\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
    /* \u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct AdjListNode {\n    Vertex *vertex;           // \u9802\u9ede\n    struct AdjListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n} AdjListNode;\n\n/* \u67e5\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\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/* \u65b0\u589e\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid addEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *node = (AdjListNode *)malloc(sizeof(AdjListNode));\n    node->vertex = vet;\n    // \u982d\u63d2\u6cd5\n    node->next = head->next;\n    head->next = node;\n}\n\n/* \u522a\u9664\u908a\u8f14\u52a9\u51fd\u5f0f */\nvoid removeEdgeHelper(AdjListNode *head, Vertex *vet) {\n    AdjListNode *pre = head;\n    AdjListNode *cur = head->next;\n    // \u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u641c\u7d22 vet \u5c0d\u61c9\u7bc0\u9ede\n    while (cur != NULL && cur->vertex != vet) {\n        pre = cur;\n        cur = cur->next;\n    }\n    if (cur == NULL)\n        return;\n    // \u5c07 vet \u5c0d\u61c9\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\n    pre->next = cur->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(cur);\n}\n\n/* \u57fa\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\ntypedef struct {\n    AdjListNode *heads[MAX_SIZE]; // \u7bc0\u9ede\u9663\u5217\n    int size;                     // \u7bc0\u9ede\u6578\u91cf\n} GraphAdjList;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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\u8a62\u9802\u9ede\u5c0d\u61c9\u7684\u7bc0\u9ede */\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/* \u65b0\u589e\u908a */\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    // \u65b0\u589e\u908a vet1 - vet2\n    addEdgeHelper(head1, vet2);\n    addEdgeHelper(head2, vet1);\n}\n\n/* \u522a\u9664\u908a */\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    // \u522a\u9664\u908a vet1 - vet2\n    removeEdgeHelper(head1, head2->vertex);\n    removeEdgeHelper(head2, head1->vertex);\n}\n\n/* \u65b0\u589e\u9802\u9ede */\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\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n    graph->heads[graph->size++] = head;\n}\n\n/* \u522a\u9664\u9802\u9ede */\nvoid removeVertex(GraphAdjList *graph, Vertex *vet) {\n    AdjListNode *node = findNode(graph, vet);\n    assert(node != NULL);\n    // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n    AdjListNode *cur = node, *pre = NULL;\n    while (cur) {\n        pre = cur;\n        cur = cur->next;\n        free(pre);\n    }\n    // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\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    // \u5c07\u8a72\u9802\u9ede\u4e4b\u5f8c\u7684\u9802\u9ede\u5411\u524d\u79fb\u52d5\uff0c\u4ee5\u586b\u88dc\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\u65bc\u9130\u63a5\u8868\u5be6\u73fe\u7684\u7121\u5411\u5716\u985e\u5225 */\nclass GraphAdjList(edges: Array<Array<Vertex?>>) {\n    // \u9130\u63a5\u8868\uff0ckey\uff1a\u9802\u9ede\uff0cvalue\uff1a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    val adjList = HashMap<Vertex, MutableList<Vertex>>()\n\n    /* \u5efa\u69cb\u5b50 */\n    init {\n        // \u65b0\u589e\u6240\u6709\u9802\u9ede\u548c\u908a\n        for (edge in edges) {\n            addVertex(edge[0]!!)\n            addVertex(edge[1]!!)\n            addEdge(edge[0]!!, edge[1]!!)\n        }\n    }\n\n    /* \u7372\u53d6\u9802\u9ede\u6578\u91cf */\n    fun size(): Int {\n        return adjList.size\n    }\n\n    /* \u65b0\u589e\u908a */\n    fun addEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u65b0\u589e\u908a vet1 - vet2\n        adjList[vet1]?.add(vet2)\n        adjList[vet2]?.add(vet1)\n    }\n\n    /* \u522a\u9664\u908a */\n    fun removeEdge(vet1: Vertex, vet2: Vertex) {\n        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)\n            throw IllegalArgumentException()\n        // \u522a\u9664\u908a vet1 - vet2\n        adjList[vet1]?.remove(vet2)\n        adjList[vet2]?.remove(vet1)\n    }\n\n    /* \u65b0\u589e\u9802\u9ede */\n    fun addVertex(vet: Vertex) {\n        if (adjList.containsKey(vet))\n            return\n        // \u5728\u9130\u63a5\u8868\u4e2d\u65b0\u589e\u4e00\u500b\u65b0\u93c8\u7d50\u4e32\u5217\n        adjList[vet] = mutableListOf()\n    }\n\n    /* \u522a\u9664\u9802\u9ede */\n    fun removeVertex(vet: Vertex) {\n        if (!adjList.containsKey(vet))\n            throw IllegalArgumentException()\n        // \u5728\u9130\u63a5\u8868\u4e2d\u522a\u9664\u9802\u9ede vet \u5c0d\u61c9\u7684\u93c8\u7d50\u4e32\u5217\n        adjList.remove(vet)\n        // \u8d70\u8a2a\u5176\u4ed6\u9802\u9ede\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u522a\u9664\u6240\u6709\u5305\u542b vet \u7684\u908a\n        for (list in adjList.values) {\n            list.remove(vet)\n        }\n    }\n\n    /* \u5217\u5370\u9130\u63a5\u8868 */\n    fun print() {\n        println(\"\u9130\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
    [class]{GraphAdjList}-[func]{}\n
    graph_adjacency_list.zig
    [class]{GraphAdjList}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_graph/graph_operations/#923","title":"9.2.3 \u00a0 \u6548\u7387\u5c0d\u6bd4","text":"

    \u8a2d\u5716\u4e2d\u5171\u6709 \\(n\\) \u500b\u9802\u9ede\u548c \\(m\\) \u689d\u908a\uff0c\u8868 9-2 \u5c0d\u6bd4\u4e86\u9130\u63a5\u77e9\u9663\u548c\u9130\u63a5\u8868\u7684\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u3002

    \u8868 9-2 \u00a0 \u9130\u63a5\u77e9\u9663\u8207\u9130\u63a5\u8868\u5c0d\u6bd4

    \u9130\u63a5\u77e9\u9663 \u9130\u63a5\u8868\uff08\u93c8\u7d50\u4e32\u5217\uff09 \u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09 \u5224\u65b7\u662f\u5426\u9130\u63a5 \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u908a \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u908a \\(O(1)\\) \\(O(m)\\) \\(O(1)\\) \u65b0\u589e\u9802\u9ede \\(O(n)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u9802\u9ede \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n)\\) \u8a18\u61b6\u9ad4\u7a7a\u9593\u4f54\u7528 \\(O(n^2)\\) \\(O(n + m)\\) \\(O(n + m)\\)

    \u89c0\u5bdf\u8868 9-2 \uff0c\u4f3c\u4e4e\u9130\u63a5\u8868\uff08\u96dc\u6e4a\u8868\uff09\u7684\u6642\u9593\u6548\u7387\u8207\u7a7a\u9593\u6548\u7387\u6700\u512a\u3002\u4f46\u5be6\u969b\u4e0a\uff0c\u5728\u9130\u63a5\u77e9\u9663\u4e2d\u64cd\u4f5c\u908a\u7684\u6548\u7387\u66f4\u9ad8\uff0c\u53ea\u9700\u4e00\u6b21\u9663\u5217\u8a2a\u554f\u6216\u8ce6\u503c\u64cd\u4f5c\u5373\u53ef\u3002\u7d9c\u5408\u4f86\u770b\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\u7684\u539f\u5247\uff0c\u800c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u7684\u539f\u5247\u3002

    "},{"location":"chapter_graph/graph_traversal/","title":"9.3 \u00a0 \u5716\u7684\u8d70\u8a2a","text":"

    \u6a39\u4ee3\u8868\u7684\u662f\u201c\u4e00\u5c0d\u591a\u201d\u7684\u95dc\u4fc2\uff0c\u800c\u5716\u5247\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u8868\u793a\u4efb\u610f\u7684\u201c\u591a\u5c0d\u591a\u201d\u95dc\u4fc2\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u6a39\u770b\u4f5c\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\u3002\u986f\u7136\uff0c\u6a39\u7684\u8d70\u8a2a\u64cd\u4f5c\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u64cd\u4f5c\u7684\u4e00\u7a2e\u7279\u4f8b\u3002

    \u5716\u548c\u6a39\u90fd\u9700\u8981\u61c9\u7528\u641c\u7d22\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u8d70\u8a2a\u64cd\u4f5c\u3002\u5716\u7684\u8d70\u8a2a\u65b9\u5f0f\u4e5f\u53ef\u5206\u70ba\u5169\u7a2e\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u548c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    "},{"location":"chapter_graph/graph_traversal/#931","title":"9.3.1 \u00a0 \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u5f9e\u67d0\u500b\u7bc0\u9ede\u51fa\u767c\uff0c\u59cb\u7d42\u512a\u5148\u8a2a\u554f\u8ddd\u96e2\u6700\u8fd1\u7684\u9802\u9ede\uff0c\u4e26\u4e00\u5c64\u5c64\u5411\u5916\u64f4\u5f35\u3002\u5982\u5716 9-9 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u9996\u5148\u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e0b\u4e00\u500b\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8a2a\u554f\u5b8c\u7562\u3002

    \u5716 9-9 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a

    "},{"location":"chapter_graph/graph_traversal/#1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

    BFS \u901a\u5e38\u85c9\u52a9\u4f47\u5217\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\u3002\u4f47\u5217\u5177\u6709\u201c\u5148\u5165\u5148\u51fa\u201d\u7684\u6027\u8cea\uff0c\u9019\u8207 BFS \u7684\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u601d\u60f3\u7570\u66f2\u540c\u5de5\u3002

    1. \u5c07\u8d70\u8a2a\u8d77\u59cb\u9802\u9ede startVet \u52a0\u5165\u5217\u5217\uff0c\u4e26\u958b\u555f\u8ff4\u5708\u3002
    2. \u5728\u8ff4\u5708\u7684\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\uff0c\u5f48\u51fa\u4f47\u5217\u9996\u9802\u9ede\u4e26\u8a18\u9304\u8a2a\u554f\uff0c\u7136\u5f8c\u5c07\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u52a0\u5165\u5230\u4f47\u5217\u5c3e\u90e8\u3002
    3. \u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u76f4\u5230\u6240\u6709\u9802\u9ede\u88ab\u8a2a\u554f\u5b8c\u7562\u5f8c\u7d50\u675f\u3002

    \u70ba\u4e86\u9632\u6b62\u91cd\u8907\u8d70\u8a2a\u9802\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 visited \u4f86\u8a18\u9304\u54ea\u4e9b\u7bc0\u9ede\u5df2\u88ab\u8a2a\u554f\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_bfs.py
    def graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]([start_vet])\n    # \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    que = deque[Vertex]([start_vet])\n    # \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while len(que) > 0:\n        vet = que.popleft()  # \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adj_vet in graph.adj_list[vet]:\n            if adj_vet in visited:\n                continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.append(adj_vet)  # \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adj_vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n
    graph_bfs.cpp
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphBFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited = {startVet};\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    queue<Vertex *> que;\n    que.push(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.empty()) {\n        Vertex *vet = que.front();\n        que.pop();          // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push_back(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (auto adjVet : graph.adjList[vet]) {\n            if (visited.count(adjVet))\n                continue;            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.push(adjVet);        // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.emplace(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.java
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new LinkedList<>();\n    que.offer(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        Vertex vet = que.poll(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet);            // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (Vertex adjVet : graph.adjList.get(vet)) {\n            if (visited.contains(adjVet))\n                continue;        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.cs
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphBFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [startVet];\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue<Vertex> que = new();\n    que.Enqueue(startVet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.Count > 0) {\n        Vertex vet = que.Dequeue(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.Add(vet);               // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        foreach (Vertex adjVet in graph.adjList[vet]) {\n            if (visited.Contains(adjVet)) {\n                continue;          // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.Enqueue(adjVet);   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.Add(adjVet);   // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.go
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    visited[startVet] = struct{}{}\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS, \u4f7f\u7528\u5207\u7247\u6a21\u64ec\u4f47\u5217\n    queue := make([]Vertex, 0)\n    queue = append(queue, startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    for len(queue) > 0 {\n        // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        vet := queue[0]\n        queue = queue[1:]\n        // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        res = append(res, vet)\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for _, adjVet := range g.adjList[vet] {\n            _, isExist := visited[adjVet]\n            // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            if !isExist {\n                queue = append(queue, adjVet)\n                visited[adjVet] = struct{}{}\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.swift
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphBFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    var visited: Set<Vertex> = [startVet]\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    var que: [Vertex] = [startVet]\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.isEmpty {\n        let vet = que.removeFirst() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for adjVet in graph.adjList[vet] ?? [] {\n            if visited.contains(adjVet) {\n                continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.append(adjVet) // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.insert(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.js
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.ts
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphBFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    visited.add(startVet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    const que = [startVet];\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (que.length) {\n        const vet = que.shift(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (const adjVet of graph.adjList.get(vet) ?? []) {\n            if (visited.has(adjVet)) {\n                continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            que.push(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\n            visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res;\n}\n
    graph_bfs.dart
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {\n  // \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  visited.add(startVet);\n  // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n  Queue<Vertex> que = Queue();\n  que.add(startVet);\n  // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n  while (que.isNotEmpty) {\n    Vertex vet = que.removeFirst(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n    res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet in graph.adjList[vet]!) {\n      if (visited.contains(adjVet)) {\n        continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n      }\n      que.add(adjVet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n      visited.add(adjVet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    }\n  }\n  // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  return res;\n}\n
    graph_bfs.rs
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    visited.insert(start_vet);\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    let mut que = VecDeque::new();\n    que.push_back(start_vet);\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while !que.is_empty() {\n        let vet = que.pop_front().unwrap(); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\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\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n                }\n                que.push_back(adj_vet); // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited.insert(adj_vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res\n}\n
    graph_bfs.c
    /* \u7bc0\u9ede\u4f47\u5217\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    Vertex *vertices[MAX_SIZE];\n    int front, rear, size;\n} Queue;\n\n/* \u5efa\u69cb\u5b50 */\nQueue *newQueue() {\n    Queue *q = (Queue *)malloc(sizeof(Queue));\n    q->front = q->rear = q->size = 0;\n    return q;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nint isEmpty(Queue *q) {\n    return q->size == 0;\n}\n\n/* \u5165\u5217\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\u5217\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/* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **visited, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\n    for (int i = 0; i < size; i++) {\n        if (visited[i] == vet)\n            return 1;\n    }\n    return 0;\n}\n\n/* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphBFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize, Vertex **visited, int *visitedSize) {\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    Queue *queue = newQueue();\n    enqueue(queue, startVet);\n    visited[(*visitedSize)++] = startVet;\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!isEmpty(queue)) {\n        Vertex *vet = dequeue(queue); // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res[(*resSize)++] = vet;      // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        AdjListNode *node = findNode(graph, vet);\n        while (node != NULL) {\n            // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            if (!isVisited(visited, *visitedSize, node->vertex)) {\n                enqueue(queue, node->vertex);             // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n                visited[(*visitedSize)++] = node->vertex; // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n            }\n            node = node->next;\n        }\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(queue);\n}\n
    graph_bfs.kt
    /* \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphBFS(graph: GraphAdjList, startVet: Vertex): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex>()\n    visited.add(startVet)\n    // \u4f47\u5217\u7528\u65bc\u5be6\u73fe BFS\n    val que = LinkedList<Vertex>()\n    que.offer(startVet)\n    // \u4ee5\u9802\u9ede vet \u70ba\u8d77\u9ede\uff0c\u8ff4\u5708\u76f4\u81f3\u8a2a\u554f\u5b8c\u6240\u6709\u9802\u9ede\n    while (!que.isEmpty()) {\n        val vet = que.poll() // \u4f47\u5217\u9996\u9802\u9ede\u51fa\u968a\n        res.add(vet)         // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n        // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n        for (adjVet in graph.adjList[vet]!!) {\n            if (visited.contains(adjVet))\n                continue        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            que.offer(adjVet)   // \u53ea\u5165\u5217\u672a\u8a2a\u554f\u7684\u9802\u9ede\n            visited.add(adjVet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n        }\n    }\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_bfs.rb
    [class]{}-[func]{graph_bfs}\n
    graph_bfs.zig
    [class]{}-[func]{graphBFS}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7a0b\u5f0f\u78bc\u76f8\u5c0d\u62bd\u8c61\uff0c\u5efa\u8b70\u5c0d\u7167\u5716 9-10 \u4f86\u52a0\u6df1\u7406\u89e3\u3002

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

    \u5716 9-10 \u00a0 \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u4e0d\u552f\u4e00\u3002\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u53ea\u8981\u6c42\u6309\u201c\u7531\u8fd1\u53ca\u9060\u201d\u7684\u9806\u5e8f\u8d70\u8a2a\uff0c\u800c\u591a\u500b\u76f8\u540c\u8ddd\u96e2\u7684\u9802\u9ede\u7684\u8d70\u8a2a\u9806\u5e8f\u5141\u8a31\u88ab\u4efb\u610f\u6253\u4e82\u3002\u4ee5\u5716 9-10 \u70ba\u4f8b\uff0c\u9802\u9ede \\(1\\)\u3001\\(3\\) \u7684\u8a2a\u554f\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\uff0c\u9802\u9ede \\(2\\)\u3001\\(4\\)\u3001\\(6\\) \u7684\u8a2a\u554f\u9806\u5e8f\u4e5f\u53ef\u4ee5\u4efb\u610f\u4ea4\u63db\u3002

    "},{"location":"chapter_graph/graph_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u5165\u5217\u4e26\u51fa\u968a\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u5728\u8d70\u8a2a\u9130\u63a5\u9802\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u7531\u65bc\u662f\u7121\u5411\u5716\uff0c\u56e0\u6b64\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u8868 visited \uff0c\u4f47\u5217 que \u4e2d\u7684\u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

    "},{"location":"chapter_graph/graph_traversal/#932","title":"9.3.2 \u00a0 \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a","text":"

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u518d\u56de\u982d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002\u5982\u5716 9-11 \u6240\u793a\uff0c\u5f9e\u5de6\u4e0a\u89d2\u9802\u9ede\u51fa\u767c\uff0c\u8a2a\u554f\u7576\u524d\u9802\u9ede\u7684\u67d0\u500b\u9130\u63a5\u9802\u9ede\uff0c\u76f4\u5230\u8d70\u5230\u76e1\u982d\u6642\u8fd4\u56de\uff0c\u518d\u7e7c\u7e8c\u8d70\u5230\u76e1\u982d\u4e26\u8fd4\u56de\uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u81f3\u6240\u6709\u9802\u9ede\u8d70\u8a2a\u5b8c\u6210\u3002

    \u5716 9-11 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a

    "},{"location":"chapter_graph/graph_traversal/#1_1","title":"1. \u00a0 \u6f14\u7b97\u6cd5\u5be6\u73fe","text":"

    \u9019\u7a2e\u201c\u8d70\u5230\u76e1\u982d\u518d\u8fd4\u56de\u201d\u7684\u6f14\u7b97\u6cd5\u7bc4\u5f0f\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002\u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u5728\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u4e2d\uff0c\u6211\u5011\u4e5f\u9700\u8981\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868 visited \u4f86\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\uff0c\u4ee5\u907f\u514d\u91cd\u8907\u8a2a\u554f\u9802\u9ede\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig graph_dfs.py
    def dfs(graph: GraphAdjList, visited: set[Vertex], res: list[Vertex], vet: Vertex):\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f\"\"\"\n    res.append(vet)  # \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet)  # \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    # \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adj_list[vet]:\n        if adjVet in visited:\n            continue  # \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        # \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n\ndef graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> list[Vertex]:\n    \"\"\"\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\"\"\"\n    # \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    # \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    # \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited = set[Vertex]()\n    dfs(graph, visited, res, start_vet)\n    return res\n
    graph_dfs.cpp
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList &graph, unordered_set<Vertex *> &visited, vector<Vertex *> &res, Vertex *vet) {\n    res.push_back(vet);   // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.emplace(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex *adjVet : graph.adjList[vet]) {\n        if (visited.count(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvector<Vertex *> graphDFS(GraphAdjList &graph, Vertex *startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    vector<Vertex *> res;\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    unordered_set<Vertex *> visited;\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.java
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (Vertex adjVet : graph.adjList.get(vet)) {\n        if (visited.contains(adjVet))\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = new ArrayList<>();\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    Set<Vertex> visited = new HashSet<>();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.cs
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid DFS(GraphAdjList graph, HashSet<Vertex> visited, List<Vertex> res, Vertex vet) {\n    res.Add(vet);     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.Add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    foreach (Vertex adjVet in graph.adjList[vet]) {\n        if (visited.Contains(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede                             \n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        DFS(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nList<Vertex> GraphDFS(GraphAdjList graph, Vertex startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    List<Vertex> res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    HashSet<Vertex> visited = [];\n    DFS(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.go
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(g *graphAdjList, visited map[Vertex]struct{}, res *[]Vertex, vet Vertex) {\n    // append \u64cd\u4f5c\u6703\u8fd4\u56de\u65b0\u7684\u7684\u5f15\u7528\uff0c\u5fc5\u9808\u8b93\u539f\u5f15\u7528\u91cd\u65b0\u8ce6\u503c\u70ba\u65b0slice\u7684\u5f15\u7528\n    *res = append(*res, vet)\n    visited[vet] = struct{}{}\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for _, adjVet := range g.adjList[vet] {\n        _, isExist := visited[adjVet]\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        if !isExist {\n            dfs(g, visited, res, adjVet)\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(g *graphAdjList, startVet Vertex) []Vertex {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    res := make([]Vertex, 0)\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    visited := make(map[Vertex]struct{})\n    dfs(g, visited, &res, startVet)\n    // \u8fd4\u56de\u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    return res\n}\n
    graph_dfs.swift
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunc dfs(graph: GraphAdjList, visited: inout Set<Vertex>, res: inout [Vertex], vet: Vertex) {\n    res.append(vet) // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for adjVet in graph.adjList[vet] ?? [] {\n        if visited.contains(adjVet) {\n            continue // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph: graph, visited: &visited, res: &res, vet: adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunc graphDFS(graph: GraphAdjList, startVet: Vertex) -> [Vertex] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    var res: [Vertex] = []\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\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\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction dfs(graph, visited, res, vet) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph, startVet) {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.ts
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfunction dfs(\n    graph: GraphAdjList,\n    visited: Set<Vertex>,\n    res: Vertex[],\n    vet: Vertex\n): void {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (const adjVet of graph.adjList.get(vet)) {\n        if (visited.has(adjVet)) {\n            continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        }\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet);\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfunction graphDFS(graph: GraphAdjList, startVet: Vertex): Vertex[] {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    const res: Vertex[] = [];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    const visited: Set<Vertex> = new Set();\n    dfs(graph, visited, res, startVet);\n    return res;\n}\n
    graph_dfs.dart
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(\n  GraphAdjList graph,\n  Set<Vertex> visited,\n  List<Vertex> res,\n  Vertex vet,\n) {\n  res.add(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n  visited.add(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n  // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n  for (Vertex adjVet in graph.adjList[vet]!) {\n    if (visited.contains(adjVet)) {\n      continue; // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n    }\n    // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n    dfs(graph, visited, res, adjVet);\n  }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\nList<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {\n  // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n  List<Vertex> res = [];\n  // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n  Set<Vertex> visited = {};\n  dfs(graph, visited, res, startVet);\n  return res;\n}\n
    graph_dfs.rs
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfn dfs(graph: &GraphAdjList, visited: &mut HashSet<Vertex>, res: &mut Vec<Vertex>, vet: Vertex) {\n    res.push(vet); // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.insert(vet); // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n                         // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\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\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n            }\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, visited, res, adj_vet);\n        }\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfn graph_dfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    let mut res = vec![];\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    let mut visited = HashSet::new();\n    dfs(&graph, &mut visited, &mut res, start_vet);\n\n    res\n}\n
    graph_dfs.c
    /* \u6aa2\u67e5\u9802\u9ede\u662f\u5426\u5df2\u88ab\u8a2a\u554f */\nint isVisited(Vertex **res, int size, Vertex *vet) {\n    // \u8d70\u8a2a\u67e5\u8a62\u7bc0\u9ede\uff0c\u4f7f\u7528 O(n) \u6642\u9593\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\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nvoid dfs(GraphAdjList *graph, Vertex **res, int *resSize, Vertex *vet) {\n    // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    res[(*resSize)++] = vet;\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    AdjListNode *node = findNode(graph, vet);\n    while (node != NULL) {\n        // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        if (!isVisited(res, *resSize, node->vertex)) {\n            // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n            dfs(graph, res, resSize, node->vertex);\n        }\n        node = node->next;\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nvoid graphDFS(GraphAdjList *graph, Vertex *startVet, Vertex **res, int *resSize) {\n    dfs(graph, res, resSize, startVet);\n}\n
    graph_dfs.kt
    /* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u8f14\u52a9\u51fd\u5f0f */\nfun dfs(\n    graph: GraphAdjList,\n    visited: MutableSet<Vertex?>,\n    res: MutableList<Vertex?>,\n    vet: Vertex?\n) {\n    res.add(vet)     // \u8a18\u9304\u8a2a\u554f\u9802\u9ede\n    visited.add(vet) // \u6a19\u8a18\u8a72\u9802\u9ede\u5df2\u88ab\u8a2a\u554f\n    // \u8d70\u8a2a\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\n    for (adjVet in graph.adjList[vet]!!) {\n        if (visited.contains(adjVet))\n            continue  // \u8df3\u904e\u5df2\u88ab\u8a2a\u554f\u7684\u9802\u9ede\n        // \u905e\u8ff4\u8a2a\u554f\u9130\u63a5\u9802\u9ede\n        dfs(graph, visited, res, adjVet)\n    }\n}\n\n/* \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a */\n// \u4f7f\u7528\u9130\u63a5\u8868\u4f86\u8868\u793a\u5716\uff0c\u4ee5\u4fbf\u7372\u53d6\u6307\u5b9a\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\nfun graphDFS(graph: GraphAdjList, startVet: Vertex?): MutableList<Vertex?> {\n    // \u9802\u9ede\u8d70\u8a2a\u5e8f\u5217\n    val res = mutableListOf<Vertex?>()\n    // \u96dc\u6e4a\u8868\uff0c\u7528\u65bc\u8a18\u9304\u5df2\u88ab\u8a2a\u554f\u904e\u7684\u9802\u9ede\n    val visited = HashSet<Vertex?>()\n    dfs(graph, visited, res, startVet)\n    return res\n}\n
    graph_dfs.rb
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graph_dfs}\n
    graph_dfs.zig
    [class]{}-[func]{dfs}\n\n[class]{}-[func]{graphDFS}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 9-12 \u6240\u793a\u3002

    • \u76f4\u865b\u7dda\u4ee3\u8868\u5411\u4e0b\u905e\u63a8\uff0c\u8868\u793a\u958b\u555f\u4e86\u4e00\u500b\u65b0\u7684\u905e\u8ff4\u65b9\u6cd5\u4f86\u8a2a\u554f\u65b0\u9802\u9ede\u3002
    • \u66f2\u865b\u7dda\u4ee3\u8868\u5411\u4e0a\u56de\u6eaf\uff0c\u8868\u793a\u6b64\u905e\u8ff4\u65b9\u6cd5\u5df2\u7d93\u8fd4\u56de\uff0c\u56de\u6eaf\u5230\u4e86\u958b\u555f\u6b64\u65b9\u6cd5\u7684\u4f4d\u7f6e\u3002

    \u70ba\u4e86\u52a0\u6df1\u7406\u89e3\uff0c\u5efa\u8b70\u5c07\u5716 9-12 \u8207\u7a0b\u5f0f\u78bc\u7d50\u5408\u8d77\u4f86\uff0c\u5728\u8166\u4e2d\u6a21\u64ec\uff08\u6216\u8005\u7528\u7b46\u756b\u4e0b\u4f86\uff09\u6574\u500b DFS \u904e\u7a0b\uff0c\u5305\u62ec\u6bcf\u500b\u905e\u8ff4\u65b9\u6cd5\u4f55\u6642\u958b\u555f\u3001\u4f55\u6642\u8fd4\u56de\u3002

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

    \u5716 9-12 \u00a0 \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u6b65\u9a5f

    \u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5e8f\u5217\u662f\u5426\u552f\u4e00\uff1f

    \u8207\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u985e\u4f3c\uff0c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5e8f\u5217\u7684\u9806\u5e8f\u4e5f\u4e0d\u662f\u552f\u4e00\u7684\u3002\u7d66\u5b9a\u67d0\u9802\u9ede\uff0c\u5148\u5f80\u54ea\u500b\u65b9\u5411\u63a2\u7d22\u90fd\u53ef\u4ee5\uff0c\u5373\u9130\u63a5\u9802\u9ede\u7684\u9806\u5e8f\u53ef\u4ee5\u4efb\u610f\u6253\u4e82\uff0c\u90fd\u662f\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    \u4ee5\u6a39\u7684\u8d70\u8a2a\u70ba\u4f8b\uff0c\u201c\u6839 \\(\\rightarrow\\) \u5de6 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u201c\u5de6 \\(\\rightarrow\\) \u53f3 \\(\\rightarrow\\) \u6839\u201d\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\uff0c\u5b83\u5011\u5c55\u793a\u4e86\u4e09\u7a2e\u8d70\u8a2a\u512a\u5148\u9806\u5e8f\uff0c\u7136\u800c\u9019\u4e09\u8005\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u3002

    "},{"location":"chapter_graph/graph_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u6642\u9593\u8907\u96dc\u5ea6\uff1a\u6240\u6709\u9802\u9ede\u90fd\u6703\u88ab\u8a2a\u554f \\(1\\) \u6b21\uff0c\u4f7f\u7528 \\(O(|V|)\\) \u6642\u9593\uff1b\u6240\u6709\u908a\u90fd\u6703\u88ab\u8a2a\u554f \\(2\\) \u6b21\uff0c\u4f7f\u7528 \\(O(2|E|)\\) \u6642\u9593\uff1b\u7e3d\u9ad4\u4f7f\u7528 \\(O(|V| + |E|)\\) \u6642\u9593\u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\uff1a\u4e32\u5217 res \uff0c\u96dc\u6e4a\u8868 visited \u9802\u9ede\u6578\u91cf\u6700\u591a\u70ba \\(|V|\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u6700\u5927\u70ba \\(|V|\\) \uff0c\u56e0\u6b64\u4f7f\u7528 \\(O(|V|)\\) \u7a7a\u9593\u3002

    "},{"location":"chapter_graph/summary/","title":"9.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_graph/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5716\u7531\u9802\u9ede\u548c\u908a\u7d44\u6210\uff0c\u53ef\u4ee5\u8868\u793a\u70ba\u4e00\u7d44\u9802\u9ede\u548c\u4e00\u7d44\u908a\u69cb\u6210\u7684\u96c6\u5408\u3002
    • \u76f8\u8f03\u65bc\u7dda\u6027\u95dc\u4fc2\uff08\u93c8\u7d50\u4e32\u5217\uff09\u548c\u5206\u6cbb\u95dc\u4fc2\uff08\u6a39\uff09\uff0c\u7db2\u8def\u95dc\u4fc2\uff08\u5716\uff09\u5177\u6709\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\uff0c\u56e0\u800c\u66f4\u70ba\u8907\u96dc\u3002
    • \u6709\u5411\u5716\u7684\u908a\u5177\u6709\u65b9\u5411\u6027\uff0c\u9023\u901a\u5716\u4e2d\u7684\u4efb\u610f\u9802\u9ede\u5747\u53ef\u9054\uff0c\u6709\u6b0a\u5716\u7684\u6bcf\u689d\u908a\u90fd\u5305\u542b\u6b0a\u91cd\u8b8a\u6578\u3002
    • \u9130\u63a5\u77e9\u9663\u5229\u7528\u77e9\u9663\u4f86\u8868\u793a\u5716\uff0c\u6bcf\u4e00\u884c\uff08\u5217\uff09\u4ee3\u8868\u4e00\u500b\u9802\u9ede\uff0c\u77e9\u9663\u5143\u7d20\u4ee3\u8868\u908a\uff0c\u7528 \\(1\\) \u6216 \\(0\\) \u8868\u793a\u5169\u500b\u9802\u9ede\u4e4b\u9593\u6709\u908a\u6216\u7121\u908a\u3002\u9130\u63a5\u77e9\u9663\u5728\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u4e0a\u6548\u7387\u5f88\u9ad8\uff0c\u4f46\u7a7a\u9593\u4f54\u7528\u8f03\u591a\u3002
    • \u9130\u63a5\u8868\u4f7f\u7528\u591a\u500b\u93c8\u7d50\u4e32\u5217\u4f86\u8868\u793a\u5716\uff0c\u7b2c \\(i\\) \u500b\u93c8\u7d50\u4e32\u5217\u5c0d\u61c9\u9802\u9ede \\(i\\) \uff0c\u5176\u4e2d\u5132\u5b58\u4e86\u8a72\u9802\u9ede\u7684\u6240\u6709\u9130\u63a5\u9802\u9ede\u3002\u9130\u63a5\u8868\u76f8\u5c0d\u65bc\u9130\u63a5\u77e9\u9663\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\uff0c\u4f46\u7531\u65bc\u9700\u8981\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u908a\uff0c\u56e0\u6b64\u6642\u9593\u6548\u7387\u8f03\u4f4e\u3002
    • \u7576\u9130\u63a5\u8868\u4e2d\u7684\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6642\uff0c\u53ef\u4ee5\u5c07\u5176\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u6216\u96dc\u6e4a\u8868\uff0c\u5f9e\u800c\u63d0\u5347\u67e5\u8a62\u6548\u7387\u3002
    • \u5f9e\u6f14\u7b97\u6cd5\u601d\u60f3\u7684\u89d2\u5ea6\u5206\u6790\uff0c\u9130\u63a5\u77e9\u9663\u9ad4\u73fe\u4e86\u201c\u4ee5\u7a7a\u9593\u63db\u6642\u9593\u201d\uff0c\u9130\u63a5\u8868\u9ad4\u73fe\u4e86\u201c\u4ee5\u6642\u9593\u63db\u7a7a\u9593\u201d\u3002
    • \u5716\u53ef\u7528\u65bc\u5efa\u6a21\u5404\u985e\u73fe\u5be6\u7cfb\u7d71\uff0c\u5982\u793e\u4ea4\u7db2\u8def\u3001\u5730\u9435\u7dda\u8def\u7b49\u3002
    • \u6a39\u662f\u5716\u7684\u4e00\u7a2e\u7279\u4f8b\uff0c\u6a39\u7684\u8d70\u8a2a\u4e5f\u662f\u5716\u7684\u8d70\u8a2a\u7684\u4e00\u7a2e\u7279\u4f8b\u3002
    • \u5716\u7684\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u7531\u8fd1\u53ca\u9060\u3001\u5c64\u5c64\u64f4\u5f35\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u901a\u5e38\u85c9\u52a9\u4f47\u5217\u5be6\u73fe\u3002
    • \u5716\u7684\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u662f\u4e00\u7a2e\u512a\u5148\u8d70\u5230\u5e95\u3001\u7121\u8def\u53ef\u8d70\u6642\u518d\u56de\u6eaf\u7684\u641c\u5c0b\u65b9\u5f0f\uff0c\u5e38\u57fa\u65bc\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
    "},{"location":"chapter_graph/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8def\u5f91\u7684\u5b9a\u7fa9\u662f\u9802\u9ede\u5e8f\u5217\u9084\u662f\u908a\u5e8f\u5217\uff1f

    \u7dad\u57fa\u767e\u79d1\u4e0a\u4e0d\u540c\u8a9e\u8a00\u7248\u672c\u7684\u5b9a\u7fa9\u4e0d\u4e00\u81f4\uff1a\u82f1\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u908a\u5e8f\u5217\u201d\uff0c\u800c\u4e2d\u6587\u7248\u662f\u201c\u8def\u5f91\u662f\u4e00\u500b\u9802\u9ede\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\u5f91\u88ab\u8996\u70ba\u4e00\u500b\u908a\u5e8f\u5217\uff0c\u800c\u4e0d\u662f\u4e00\u500b\u9802\u9ede\u5e8f\u5217\u3002\u9019\u662f\u56e0\u70ba\u5169\u500b\u9802\u9ede\u4e4b\u9593\u53ef\u80fd\u5b58\u5728\u591a\u689d\u908a\u9023\u7dda\uff0c\u6b64\u6642\u6bcf\u689d\u908a\u90fd\u5c0d\u61c9\u4e00\u689d\u8def\u5f91\u3002

    Q\uff1a\u975e\u9023\u901a\u5716\u4e2d\u662f\u5426\u6703\u6709\u7121\u6cd5\u8d70\u8a2a\u5230\u7684\u9ede\uff1f

    \u5728\u975e\u9023\u901a\u5716\u4e2d\uff0c\u5f9e\u67d0\u500b\u9802\u9ede\u51fa\u767c\uff0c\u81f3\u5c11\u6709\u4e00\u500b\u9802\u9ede\u7121\u6cd5\u5230\u9054\u3002\u8d70\u8a2a\u975e\u9023\u901a\u5716\u9700\u8981\u8a2d\u5b9a\u591a\u500b\u8d77\u9ede\uff0c\u4ee5\u8d70\u8a2a\u5230\u5716\u7684\u6240\u6709\u9023\u901a\u5206\u91cf\u3002

    Q\uff1a\u5728\u9130\u63a5\u8868\u4e2d\uff0c\u201c\u8207\u8a72\u9802\u9ede\u76f8\u9023\u7684\u6240\u6709\u9802\u9ede\u201d\u7684\u9802\u9ede\u9806\u5e8f\u662f\u5426\u6709\u8981\u6c42\uff1f

    \u53ef\u4ee5\u662f\u4efb\u610f\u9806\u5e8f\u3002\u4f46\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u53ef\u80fd\u9700\u8981\u6309\u7167\u6307\u5b9a\u898f\u5247\u4f86\u6392\u5e8f\uff0c\u6bd4\u5982\u6309\u7167\u9802\u9ede\u65b0\u589e\u7684\u6b21\u5e8f\uff0c\u6216\u8005\u6309\u7167\u9802\u9ede\u503c\u5927\u5c0f\u7684\u9806\u5e8f\u7b49\uff0c\u9019\u6a23\u6709\u52a9\u65bc\u5feb\u901f\u67e5\u8a62\u201c\u5e36\u6709\u67d0\u7a2e\u6975\u503c\u201d\u7684\u9802\u9ede\u3002

    "},{"location":"chapter_greedy/","title":"\u7b2c 15 \u7ae0 \u00a0 \u8caa\u5a6a","text":"

    Abstract

    \u5411\u65e5\u8475\u671d\u8457\u592a\u967d\u8f49\u52d5\uff0c\u6642\u523b\u8ffd\u6c42\u81ea\u8eab\u6210\u9577\u7684\u6700\u5927\u53ef\u80fd\u3002

    \u8caa\u5a6a\u7b56\u7565\u5728\u4e00\u8f2a\u8f2a\u7684\u7c21\u55ae\u9078\u64c7\u4e2d\uff0c\u9010\u6b65\u5c0e\u5411\u6700\u4f73\u7b54\u6848\u3002

    "},{"location":"chapter_greedy/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5
    • 15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c
    • 15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c
    • 15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c
    • 15.5 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_greedy/fractional_knapsack_problem/","title":"15.2 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c","text":"

    Question

    \u7d66\u5b9a \\(n\\) \u500b\u7269\u54c1\uff0c\u7b2c \\(i\\) \u500b\u7269\u54c1\u7684\u91cd\u91cf\u70ba \\(wgt[i-1]\\)\u3001\u50f9\u503c\u70ba \\(val[i-1]\\) \uff0c\u548c\u4e00\u500b\u5bb9\u91cf\u70ba \\(cap\\) \u7684\u80cc\u5305\u3002\u6bcf\u500b\u7269\u54c1\u53ea\u80fd\u9078\u64c7\u4e00\u6b21\uff0c\u4f46\u53ef\u4ee5\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u50f9\u503c\u6839\u64da\u9078\u64c7\u7684\u91cd\u91cf\u6bd4\u4f8b\u8a08\u7b97\uff0c\u554f\u5728\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u80cc\u5305\u4e2d\u7269\u54c1\u7684\u6700\u5927\u50f9\u503c\u3002\u793a\u4f8b\u5982\u5716 15-3 \u6240\u793a\u3002

    \u5716 15-3 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    \u5206\u6578\u80cc\u5305\u554f\u984c\u548c 0-1 \u80cc\u5305\u554f\u984c\u6574\u9ad4\u4e0a\u975e\u5e38\u76f8\u4f3c\uff0c\u72c0\u614b\u5305\u542b\u7576\u524d\u7269\u54c1 \\(i\\) \u548c\u5bb9\u91cf \\(c\\) \uff0c\u76ee\u6a19\u662f\u6c42\u9650\u5b9a\u80cc\u5305\u5bb9\u91cf\u4e0b\u7684\u6700\u5927\u50f9\u503c\u3002

    \u4e0d\u540c\u9ede\u5728\u65bc\uff0c\u672c\u984c\u5141\u8a31\u53ea\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\u3002\u5982\u5716 15-4 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u7269\u54c1\u4efb\u610f\u5730\u9032\u884c\u5207\u5206\uff0c\u4e26\u6309\u7167\u91cd\u91cf\u6bd4\u4f8b\u4f86\u8a08\u7b97\u76f8\u61c9\u50f9\u503c\u3002

    1. \u5c0d\u65bc\u7269\u54c1 \\(i\\) \uff0c\u5b83\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c\u70ba \\(val[i-1] / wgt[i-1]\\) \uff0c\u7c21\u7a31\u55ae\u4f4d\u50f9\u503c\u3002
    2. \u5047\u8a2d\u653e\u5165\u4e00\u90e8\u5206\u7269\u54c1 \\(i\\) \uff0c\u91cd\u91cf\u70ba \\(w\\) \uff0c\u5247\u80cc\u5305\u589e\u52a0\u7684\u50f9\u503c\u70ba \\(w \\times val[i-1] / wgt[i-1]\\) \u3002

    \u5716 15-4 \u00a0 \u7269\u54c1\u5728\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u50f9\u503c

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u6700\u5927\u5316\u80cc\u5305\u5167\u7269\u54c1\u7e3d\u50f9\u503c\uff0c\u672c\u8cea\u4e0a\u662f\u6700\u5927\u5316\u55ae\u4f4d\u91cd\u91cf\u4e0b\u7684\u7269\u54c1\u50f9\u503c\u3002\u7531\u6b64\u4fbf\u53ef\u63a8\u7406\u51fa\u5716 15-5 \u6240\u793a\u7684\u8caa\u5a6a\u7b56\u7565\u3002

    1. \u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\u3002
    2. \u8d70\u8a2a\u6240\u6709\u7269\u54c1\uff0c\u6bcf\u8f2a\u8caa\u5a6a\u5730\u9078\u64c7\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\u3002
    3. \u82e5\u5269\u9918\u80cc\u5305\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u4f7f\u7528\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u586b\u6eff\u80cc\u5305\u3002

    \u5716 15-5 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u6211\u5011\u5efa\u7acb\u4e86\u4e00\u500b\u7269\u54c1\u985e\u5225 Item \uff0c\u4ee5\u4fbf\u5c07\u7269\u54c1\u6309\u7167\u55ae\u4f4d\u50f9\u503c\u9032\u884c\u6392\u5e8f\u3002\u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u7576\u80cc\u5305\u5df2\u6eff\u6642\u8df3\u51fa\u4e26\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\u50f9\u503c\n\ndef fractional_knapsack(wgt: list[int], val: list[int], cap: int) -> int:\n    \"\"\"\u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a\"\"\"\n    # \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    items = [Item(w, v) for w, v in zip(wgt, val)]\n    # \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort(key=lambda item: item.v / item.w, reverse=True)\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res = 0\n    for item in items:\n        if item.w <= cap:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        else:\n            # \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap\n            # \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    Item(int w, int v) : w(w), v(v) {\n    }\n};\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(vector<int> &wgt, vector<int> &val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (auto &item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    public Item(int w, int v) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Arrays.sort(items, Comparator.comparingDouble(item -> -((double) item.v / item.w)));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    for (Item item : items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double) item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble FractionalKnapsack(int[] wgt, int[] val, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    Array.Sort(items, (x, y) => (y.v / y.w).CompareTo(x.v / x.w));\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    double res = 0;\n    foreach (Item item in items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (double)item.v / item.w * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt []int, val []int, cap int) float64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    res := 0.0\n    for _, item := range items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += float64(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += float64(item.v) / float64(item.w) * float64(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    init(w: Int, v: Int) {\n        self.w = w\n        self.v = v\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunc fractionalKnapsack(wgt: [Int], val: [Int], cap: Int) -> Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    var items = zip(wgt, val).map { Item(w: $0, v: $1) }\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort { -(Double($0.v) / Double($0.w)) < -(Double($1.v) / Double($1.w)) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    var cap = cap\n    for item in items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += Double(item.v)\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += Double(item.v) / Double(item.w) * Double(cap)\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt, val, cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n    constructor(w: number, v: number) {\n        this.w = w;\n        this.v = v;\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfunction fractionalKnapsack(wgt: number[], val: number[], cap: number): number {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n    const items: Item[] = wgt.map((w, i) => new Item(w, val[i]));\n    // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sort((a, b) => b.v / b.w - a.v / a.w);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let res = 0;\n    for (const item of items) {\n        if (item.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += (item.v / item.w) * cap;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n\n  Item(this.w, this.v);\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\ndouble fractionalKnapsack(List<int> wgt, List<int> val, int cap) {\n  // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\u503c\n  List<Item> items = List.generate(wgt.length, (i) => Item(wgt[i], val[i]));\n  // \u6309\u7167\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n  items.sort((a, b) => (b.v / b.w).compareTo(a.v / a.w));\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n  double res = 0;\n  for (Item item in items) {\n    if (item.w <= cap) {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n      res += item.v;\n      cap -= item.w;\n    } else {\n      // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n      res += item.v / item.w * cap;\n      // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n}\n\nimpl Item {\n    fn new(w: i32, v: i32) -> Self {\n        Self { w, v }\n    }\n}\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfn fractional_knapsack(wgt: &[i32], val: &[i32], mut cap: i32) -> f64 {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\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    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    let mut res = 0.0;\n    for item in &items {\n        if item.w <= cap {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v as f64;\n            cap -= item.w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v as f64 / item.w as f64 * cap as f64;\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\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\u50f9\u503c\n} Item;\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfloat fractionalKnapsack(int wgt[], int val[], int itemCount, int cap) {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    qsort(items, (size_t)itemCount, sizeof(Item), sortByValueDensity);\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    float res = 0.0;\n    for (int i = 0; i < itemCount; i++) {\n        if (items[i].w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += items[i].v;\n            cap -= items[i].w;\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\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\u50f9\u503c\n)\n\n/* \u5206\u6578\u80cc\u5305\uff1a\u8caa\u5a6a */\nfun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {\n    // \u5efa\u7acb\u7269\u54c1\u4e32\u5217\uff0c\u5305\u542b\u5169\u500b\u5c6c\u6027\uff1a\u91cd\u91cf\u3001\u50f9\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\u55ae\u4f4d\u50f9\u503c item.v / item.w \u5f9e\u9ad8\u5230\u4f4e\u9032\u884c\u6392\u5e8f\n    items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\n    var res = 0.0\n    for (item in items) {\n        if (item!!.w <= cap) {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u5145\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u6574\u500b\u88dd\u9032\u80cc\u5305\n            res += item.v\n            cap -= item.w\n        } else {\n            // \u82e5\u5269\u9918\u5bb9\u91cf\u4e0d\u8db3\uff0c\u5247\u5c07\u7576\u524d\u7269\u54c1\u7684\u4e00\u90e8\u5206\u88dd\u9032\u80cc\u5305\n            res += item.v.toDouble() / item.w * cap\n            // \u5df2\u7121\u5269\u9918\u5bb9\u91cf\uff0c\u56e0\u6b64\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    return res\n}\n
    fractional_knapsack.rb
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractional_knapsack}\n
    fractional_knapsack.zig
    [class]{Item}-[func]{}\n\n[class]{}-[func]{fractionalKnapsack}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u9664\u6392\u5e8f\u4e4b\u5916\uff0c\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u9700\u8981\u8d70\u8a2a\u6574\u500b\u7269\u54c1\u4e32\u5217\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u7269\u54c1\u6578\u91cf\u3002

    \u7531\u65bc\u521d\u59cb\u5316\u4e86\u4e00\u500b Item \u7269\u4ef6\u4e32\u5217\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    "},{"location":"chapter_greedy/fractional_knapsack_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u63a1\u7528\u53cd\u8b49\u6cd5\u3002\u5047\u8a2d\u7269\u54c1 \\(x\\) \u662f\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\u7684\u7269\u54c1\uff0c\u4f7f\u7528\u67d0\u6f14\u7b97\u6cd5\u6c42\u5f97\u6700\u5927\u50f9\u503c\u70ba res \uff0c\u4f46\u8a72\u89e3\u4e2d\u4e0d\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u73fe\u5728\u5f9e\u80cc\u5305\u4e2d\u62ff\u51fa\u55ae\u4f4d\u91cd\u91cf\u7684\u4efb\u610f\u7269\u54c1\uff0c\u4e26\u66ff\u63db\u70ba\u55ae\u4f4d\u91cd\u91cf\u7684\u7269\u54c1 \\(x\\) \u3002\u7531\u65bc\u7269\u54c1 \\(x\\) \u7684\u55ae\u4f4d\u50f9\u503c\u6700\u9ad8\uff0c\u56e0\u6b64\u66ff\u63db\u5f8c\u7684\u7e3d\u50f9\u503c\u4e00\u5b9a\u5927\u65bc res \u3002\u9019\u8207 res \u662f\u6700\u512a\u89e3\u77db\u76fe\uff0c\u8aaa\u660e\u6700\u512a\u89e3\u4e2d\u5fc5\u9808\u5305\u542b\u7269\u54c1 \\(x\\) \u3002

    \u5c0d\u65bc\u8a72\u89e3\u4e2d\u7684\u5176\u4ed6\u7269\u54c1\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u69cb\u5efa\u51fa\u4e0a\u8ff0\u77db\u76fe\u3002\u7e3d\u800c\u8a00\u4e4b\uff0c\u55ae\u4f4d\u50f9\u503c\u66f4\u5927\u7684\u7269\u54c1\u7e3d\u662f\u66f4\u512a\u9078\u64c7\uff0c\u9019\u8aaa\u660e\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    \u5982\u5716 15-6 \u6240\u793a\uff0c\u5982\u679c\u5c07\u7269\u54c1\u91cd\u91cf\u548c\u7269\u54c1\u55ae\u4f4d\u50f9\u503c\u5206\u5225\u770b\u4f5c\u4e00\u5f35\u4e8c\u7dad\u5716\u8868\u7684\u6a6b\u8ef8\u548c\u7e31\u8ef8\uff0c\u5247\u5206\u6578\u80cc\u5305\u554f\u984c\u53ef\u8f49\u5316\u70ba\u201c\u6c42\u5728\u6709\u9650\u6a6b\u8ef8\u5340\u9593\u4e0b\u570d\u6210\u7684\u6700\u5927\u9762\u7a4d\u201d\u3002\u9019\u500b\u985e\u6bd4\u53ef\u4ee5\u5e6b\u52a9\u6211\u5011\u5f9e\u5e7e\u4f55\u89d2\u5ea6\u7406\u89e3\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002

    \u5716 15-6 \u00a0 \u5206\u6578\u80cc\u5305\u554f\u984c\u7684\u5e7e\u4f55\u8868\u793a

    "},{"location":"chapter_greedy/greedy_algorithm/","title":"15.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\uff08greedy algorithm\uff09\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u7684\u6f14\u7b97\u6cd5\uff0c\u5176\u57fa\u672c\u601d\u60f3\u662f\u5728\u554f\u984c\u7684\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\uff0c\u90fd\u9078\u64c7\u7576\u524d\u770b\u8d77\u4f86\u6700\u512a\u7684\u9078\u64c7\uff0c\u5373\u8caa\u5a6a\u5730\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7c21\u6f54\u4e14\u9ad8\u6548\uff0c\u5728\u8a31\u591a\u5be6\u969b\u554f\u984c\u4e2d\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\u3002

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u548c\u52d5\u614b\u898f\u5283\u90fd\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u4f73\u5316\u554f\u984c\u3002\u5b83\u5011\u4e4b\u9593\u5b58\u5728\u4e00\u4e9b\u76f8\u4f3c\u4e4b\u8655\uff0c\u6bd4\u5982\u90fd\u4f9d\u8cf4\u6700\u512a\u5b50\u7d50\u69cb\u6027\u8cea\uff0c\u4f46\u5de5\u4f5c\u539f\u7406\u4e0d\u540c\u3002

    • \u52d5\u614b\u898f\u5283\u6703\u6839\u64da\u4e4b\u524d\u968e\u6bb5\u7684\u6240\u6709\u6c7a\u7b56\u4f86\u8003\u616e\u7576\u524d\u6c7a\u7b56\uff0c\u4e26\u4f7f\u7528\u904e\u53bb\u5b50\u554f\u984c\u7684\u89e3\u4f86\u69cb\u5efa\u7576\u524d\u5b50\u554f\u984c\u7684\u89e3\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u6703\u8003\u616e\u904e\u53bb\u7684\u6c7a\u7b56\uff0c\u800c\u662f\u4e00\u8def\u5411\u524d\u5730\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u4e0d\u65b7\u7e2e\u5c0f\u554f\u984c\u7bc4\u570d\uff0c\u76f4\u81f3\u554f\u984c\u88ab\u89e3\u6c7a\u3002

    \u6211\u5011\u5148\u900f\u904e\u4f8b\u984c\u201c\u96f6\u9322\u514c\u63db\u201d\u77ad\u89e3\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u3002\u9019\u9053\u984c\u5df2\u7d93\u5728\u201c\u5b8c\u5168\u80cc\u5305\u554f\u984c\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u76f8\u4fe1\u4f60\u5c0d\u5b83\u4e26\u4e0d\u964c\u751f\u3002

    Question

    \u7d66\u5b9a \\(n\\) \u7a2e\u786c\u5e63\uff0c\u7b2c \\(i\\) \u7a2e\u786c\u5e63\u7684\u9762\u503c\u70ba \\(coins[i - 1]\\) \uff0c\u76ee\u6a19\u91d1\u984d\u70ba \\(amt\\) \uff0c\u6bcf\u7a2e\u786c\u5e63\u53ef\u4ee5\u91cd\u8907\u9078\u53d6\uff0c\u554f\u80fd\u5920\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u7684\u6700\u5c11\u786c\u5e63\u6578\u91cf\u3002\u5982\u679c\u7121\u6cd5\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

    \u672c\u984c\u63a1\u53d6\u7684\u8caa\u5a6a\u7b56\u7565\u5982\u5716 15-1 \u6240\u793a\u3002\u7d66\u5b9a\u76ee\u6a19\u91d1\u984d\uff0c\u6211\u5011\u8caa\u5a6a\u5730\u9078\u64c7\u4e0d\u5927\u65bc\u4e14\u6700\u63a5\u8fd1\u5b83\u7684\u786c\u5e63\uff0c\u4e0d\u65b7\u8ff4\u5708\u8a72\u6b65\u9a5f\uff0c\u76f4\u81f3\u6e4a\u51fa\u76ee\u6a19\u91d1\u984d\u70ba\u6b62\u3002

    \u5716 15-1 \u00a0 \u96f6\u9322\u514c\u63db\u7684\u8caa\u5a6a\u7b56\u7565

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig coin_change_greedy.py
    def coin_change_greedy(coins: list[int], amt: int) -> int:\n    \"\"\"\u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a\"\"\"\n    # \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i = len(coins) - 1\n    count = 0\n    # \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0:\n        # \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 and coins[i] > amt:\n            i -= 1\n        # \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    # \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return count if amt == 0 else -1\n
    coin_change_greedy.cpp
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(vector<int> &coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.size() - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.java
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.cs
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint CoinChangeGreedy(int[] coins, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = coins.Length - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.go
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins []int, amt int) int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    i := len(coins) - 1\n    count := 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    for amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        for i > 0 && coins[i] > amt {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt != 0 {\n        return -1\n    }\n    return count\n}\n
    coin_change_greedy.swift
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunc coinChangeGreedy(coins: [Int], amt: Int) -> Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var i = coins.count - 1\n    var count = 0\n    var amt = amt\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i]\n        count += 1\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1\n}\n
    coin_change_greedy.js
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins, amt) {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.ts
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfunction coinChangeGreedy(coins: number[], amt: number): number {\n    // \u5047\u8a2d coins \u9663\u5217\u6709\u5e8f\n    let i = coins.length - 1;\n    let count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt === 0 ? count : -1;\n}\n
    coin_change_greedy.dart
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(List<int> coins, int amt) {\n  // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n  int i = coins.length - 1;\n  int count = 0;\n  // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n  while (amt > 0) {\n    // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n    while (i > 0 && coins[i] > amt) {\n      i--;\n    }\n    // \u9078\u64c7 coins[i]\n    amt -= coins[i];\n    count++;\n  }\n  // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n  return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.rs
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfn coin_change_greedy(coins: &[i32], mut amt: i32) -> i32 {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    let mut i = coins.len() - 1;\n    let mut count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while amt > 0 {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while i > 0 && coins[i] > amt {\n            i -= 1;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count += 1;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    if amt == 0 {\n        count\n    } else {\n        -1\n    }\n}\n
    coin_change_greedy.c
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nint coinChangeGreedy(int *coins, int size, int amt) {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    int i = size - 1;\n    int count = 0;\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (amt > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > amt) {\n            i--;\n        }\n        // \u9078\u64c7 coins[i]\n        amt -= coins[i];\n        count++;\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return amt == 0 ? count : -1;\n}\n
    coin_change_greedy.kt
    /* \u96f6\u9322\u514c\u63db\uff1a\u8caa\u5a6a */\nfun coinChangeGreedy(coins: IntArray, amt: Int): Int {\n    // \u5047\u8a2d coins \u4e32\u5217\u6709\u5e8f\n    var am = amt\n    var i = coins.size - 1\n    var count = 0\n    // \u8ff4\u5708\u9032\u884c\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u5230\u7121\u5269\u9918\u91d1\u984d\n    while (am > 0) {\n        // \u627e\u5230\u5c0f\u65bc\u4e14\u6700\u63a5\u8fd1\u5269\u9918\u91d1\u984d\u7684\u786c\u5e63\n        while (i > 0 && coins[i] > am) {\n            i--\n        }\n        // \u9078\u64c7 coins[i]\n        am -= coins[i]\n        count++\n    }\n    // \u82e5\u672a\u627e\u5230\u53ef\u884c\u65b9\u6848\uff0c\u5247\u8fd4\u56de -1\n    return if (am == 0) count else -1\n}\n
    coin_change_greedy.rb
    [class]{}-[func]{coin_change_greedy}\n
    coin_change_greedy.zig
    [class]{}-[func]{coinChangeGreedy}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u4f60\u53ef\u80fd\u6703\u4e0d\u7531\u5730\u767c\u51fa\u611f\u5606\uff1aSo clean \uff01\u8caa\u5a6a\u6f14\u7b97\u6cd5\u50c5\u7528\u7d04\u5341\u884c\u7a0b\u5f0f\u78bc\u5c31\u89e3\u6c7a\u4e86\u96f6\u9322\u514c\u63db\u554f\u984c\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1511","title":"15.1.1 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u64cd\u4f5c\u76f4\u63a5\u3001\u5be6\u73fe\u7c21\u55ae\uff0c\u800c\u4e14\u901a\u5e38\u6548\u7387\u4e5f\u5f88\u9ad8\u3002\u5728\u4ee5\u4e0a\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u8a18\u786c\u5e63\u6700\u5c0f\u9762\u503c\u70ba \\(\\min(coins)\\) \uff0c\u5247\u8caa\u5a6a\u9078\u64c7\u6700\u591a\u8ff4\u5708 \\(amt / \\min(coins)\\) \u6b21\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(amt / \\min(coins))\\) \u3002\u9019\u6bd4\u52d5\u614b\u898f\u5283\u89e3\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n \\times amt)\\) \u5c0f\u4e86\u4e00\u500b\u6578\u91cf\u7d1a\u3002

    \u7136\u800c\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u9762\u503c\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u80fd\u627e\u5230\u6700\u512a\u89e3\u3002\u5716 15-2 \u7d66\u51fa\u4e86\u5169\u500b\u793a\u4f8b\u3002

    • \u6b63\u4f8b \\(coins = [1, 5, 10, 20, 50, 100]\\)\uff1a\u5728\u8a72\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u7d66\u5b9a\u4efb\u610f \\(amt\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u90fd\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3\u3002
    • \u53cd\u4f8b \\(coins = [1, 20, 50]\\)\uff1a\u5047\u8a2d \\(amt = 60\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 10\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(11\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(20 + 20 + 20\\) \uff0c\u50c5\u9700 \\(3\\) \u679a\u786c\u5e63\u3002
    • \u53cd\u4f8b \\(coins = [1, 49, 50]\\)\uff1a\u5047\u8a2d \\(amt = 98\\) \uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ea\u80fd\u627e\u5230 \\(50 + 1 \\times 48\\) \u7684\u514c\u63db\u7d44\u5408\uff0c\u5171\u8a08 \\(49\\) \u679a\u786c\u5e63\uff0c\u4f46\u52d5\u614b\u898f\u5283\u53ef\u4ee5\u627e\u5230\u6700\u512a\u89e3 \\(49 + 49\\) \uff0c\u50c5\u9700 \\(2\\) \u679a\u786c\u5e63\u3002

    \u5716 15-2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u627e\u51fa\u6700\u512a\u89e3\u7684\u793a\u4f8b

    \u4e5f\u5c31\u662f\u8aaa\uff0c\u5c0d\u65bc\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7121\u6cd5\u4fdd\u8b49\u627e\u5230\u5168\u57df\u6027\u6700\u512a\u89e3\uff0c\u4e26\u4e14\u6709\u53ef\u80fd\u627e\u5230\u975e\u5e38\u5dee\u7684\u89e3\u3002\u5b83\u66f4\u9069\u5408\u7528\u52d5\u614b\u898f\u5283\u89e3\u6c7a\u3002

    \u4e00\u822c\u60c5\u6cc1\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u9069\u7528\u60c5\u6cc1\u5206\u4ee5\u4e0b\u5169\u7a2e\u3002

    1. \u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u5f80\u5f80\u662f\u6700\u512a\u9078\u64c7\uff0c\u56e0\u70ba\u5b83\u5f80\u5f80\u6bd4\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u66f4\u9ad8\u6548\u3002
    2. \u53ef\u4ee5\u627e\u5230\u8fd1\u4f3c\u6700\u512a\u89e3\uff1a\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\u4e5f\u662f\u53ef\u7528\u7684\u3002\u5c0d\u65bc\u5f88\u591a\u8907\u96dc\u554f\u984c\u4f86\u8aaa\uff0c\u5c0b\u627e\u5168\u57df\u6027\u6700\u512a\u89e3\u975e\u5e38\u56f0\u96e3\uff0c\u80fd\u4ee5\u8f03\u9ad8\u6548\u7387\u627e\u5230\u6b21\u512a\u89e3\u4e5f\u662f\u975e\u5e38\u4e0d\u932f\u7684\u3002
    "},{"location":"chapter_greedy/greedy_algorithm/#1512","title":"15.1.2 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u90a3\u9ebc\u554f\u984c\u4f86\u4e86\uff0c\u4ec0\u9ebc\u6a23\u7684\u554f\u984c\u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u5462\uff1f\u6216\u8005\u8aaa\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1f

    \u76f8\u8f03\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u4f7f\u7528\u689d\u4ef6\u66f4\u52a0\u82db\u523b\uff0c\u5176\u4e3b\u8981\u95dc\u6ce8\u554f\u984c\u7684\u5169\u500b\u6027\u8cea\u3002

    • \u8caa\u5a6a\u9078\u64c7\u6027\u8cea\uff1a\u53ea\u6709\u7576\u5c40\u90e8\u6700\u512a\u9078\u64c7\u59cb\u7d42\u53ef\u4ee5\u5c0e\u81f4\u5168\u57df\u6027\u6700\u512a\u89e3\u6642\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u624d\u80fd\u4fdd\u8b49\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u6700\u512a\u5b50\u7d50\u69cb\uff1a\u539f\u554f\u984c\u7684\u6700\u512a\u89e3\u5305\u542b\u5b50\u554f\u984c\u7684\u6700\u512a\u89e3\u3002

    \u6700\u512a\u5b50\u7d50\u69cb\u5df2\u7d93\u5728\u201c\u52d5\u614b\u898f\u5283\u201d\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u9019\u88e1\u4e0d\u518d\u8d05\u8ff0\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u4e00\u4e9b\u554f\u984c\u7684\u6700\u512a\u5b50\u7d50\u69cb\u4e26\u4e0d\u660e\u986f\uff0c\u4f46\u4ecd\u7136\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u6c7a\u3002

    \u6211\u5011\u4e3b\u8981\u63a2\u7a76\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u5224\u65b7\u65b9\u6cd5\u3002\u96d6\u7136\u5b83\u7684\u63cf\u8ff0\u770b\u4e0a\u53bb\u6bd4\u8f03\u7c21\u55ae\uff0c\u4f46\u5be6\u969b\u4e0a\u5c0d\u65bc\u8a31\u591a\u554f\u984c\uff0c\u8b49\u660e\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4e26\u975e\u6613\u4e8b\u3002

    \u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\uff0c\u6211\u5011\u96d6\u7136\u80fd\u5920\u5bb9\u6613\u5730\u8209\u51fa\u53cd\u4f8b\uff0c\u5c0d\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u9032\u884c\u8b49\u507d\uff0c\u4f46\u8b49\u5be6\u7684\u96e3\u5ea6\u8f03\u5927\u3002\u5982\u679c\u554f\uff1a\u6eff\u8db3\u4ec0\u9ebc\u689d\u4ef6\u7684\u786c\u5e63\u7d44\u5408\u53ef\u4ee5\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\uff1f\u6211\u5011\u5f80\u5f80\u53ea\u80fd\u6191\u85c9\u76f4\u89ba\u6216\u8209\u4f8b\u5b50\u4f86\u7d66\u51fa\u4e00\u500b\u6a21\u7a1c\u5169\u53ef\u7684\u7b54\u6848\uff0c\u800c\u96e3\u4ee5\u7d66\u51fa\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\u3002

    Quote

    \u6709\u4e00\u7bc7\u8ad6\u6587\u7d66\u51fa\u4e86\u4e00\u500b \\(O(n^3)\\) \u6642\u9593\u8907\u96dc\u5ea6\u7684\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u5224\u65b7\u4e00\u500b\u786c\u5e63\u7d44\u5408\u80fd\u5426\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u627e\u51fa\u4efb\u610f\u91d1\u984d\u7684\u6700\u512a\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 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u89e3\u984c\u6b65\u9a5f","text":"

    \u8caa\u5a6a\u554f\u984c\u7684\u89e3\u6c7a\u6d41\u7a0b\u5927\u9ad4\u53ef\u5206\u70ba\u4ee5\u4e0b\u4e09\u6b65\u3002

    1. \u554f\u984c\u5206\u6790\uff1a\u68b3\u7406\u8207\u7406\u89e3\u554f\u984c\u7279\u6027\uff0c\u5305\u62ec\u72c0\u614b\u5b9a\u7fa9\u3001\u6700\u4f73\u5316\u76ee\u6a19\u548c\u7d04\u675f\u689d\u4ef6\u7b49\u3002\u9019\u4e00\u6b65\u5728\u56de\u6eaf\u548c\u52d5\u614b\u898f\u5283\u4e2d\u90fd\u6709\u6d89\u53ca\u3002
    2. \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\uff1a\u78ba\u5b9a\u5982\u4f55\u5728\u6bcf\u4e00\u6b65\u4e2d\u505a\u51fa\u8caa\u5a6a\u9078\u64c7\u3002\u9019\u500b\u7b56\u7565\u80fd\u5920\u5728\u6bcf\u4e00\u6b65\u6e1b\u5c0f\u554f\u984c\u7684\u898f\u6a21\uff0c\u4e26\u6700\u7d42\u89e3\u6c7a\u6574\u500b\u554f\u984c\u3002
    3. \u6b63\u78ba\u6027\u8b49\u660e\uff1a\u901a\u5e38\u9700\u8981\u8b49\u660e\u554f\u984c\u5177\u6709\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u9019\u500b\u6b65\u9a5f\u53ef\u80fd\u9700\u8981\u7528\u5230\u6578\u5b78\u8b49\u660e\uff0c\u4f8b\u5982\u6b78\u7d0d\u6cd5\u6216\u53cd\u8b49\u6cd5\u7b49\u3002

    \u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6c42\u89e3\u554f\u984c\u7684\u6838\u5fc3\u6b65\u9a5f\uff0c\u4f46\u5be6\u65bd\u8d77\u4f86\u53ef\u80fd\u4e26\u4e0d\u5bb9\u6613\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e0d\u540c\u554f\u984c\u7684\u8caa\u5a6a\u7b56\u7565\u7684\u5dee\u7570\u8f03\u5927\u3002\u5c0d\u65bc\u8a31\u591a\u554f\u984c\u4f86\u8aaa\uff0c\u8caa\u5a6a\u7b56\u7565\u6bd4\u8f03\u6dfa\u986f\uff0c\u6211\u5011\u900f\u904e\u4e00\u4e9b\u5927\u6982\u7684\u601d\u8003\u8207\u5617\u8a66\u5c31\u80fd\u5f97\u51fa\u3002\u800c\u5c0d\u65bc\u4e00\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u7b56\u7565\u53ef\u80fd\u975e\u5e38\u96b1\u853d\uff0c\u9019\u7a2e\u60c5\u6cc1\u5c31\u975e\u5e38\u8003\u9a57\u500b\u4eba\u7684\u89e3\u984c\u7d93\u9a57\u8207\u6f14\u7b97\u6cd5\u80fd\u529b\u4e86\u3002
    • \u67d0\u4e9b\u8caa\u5a6a\u7b56\u7565\u5177\u6709\u8f03\u5f37\u7684\u8ff7\u60d1\u6027\u3002\u7576\u6211\u5011\u6eff\u61f7\u4fe1\u5fc3\u8a2d\u8a08\u597d\u8caa\u5a6a\u7b56\u7565\uff0c\u5beb\u51fa\u89e3\u984c\u7a0b\u5f0f\u78bc\u4e26\u63d0\u4ea4\u57f7\u884c\uff0c\u5f88\u53ef\u80fd\u767c\u73fe\u90e8\u5206\u6e2c\u8a66\u6a23\u4f8b\u7121\u6cd5\u900f\u904e\u3002\u9019\u662f\u56e0\u70ba\u8a2d\u8a08\u7684\u8caa\u5a6a\u7b56\u7565\u53ea\u662f\u201c\u90e8\u5206\u6b63\u78ba\u201d\u7684\uff0c\u4e0a\u6587\u4ecb\u7d39\u7684\u96f6\u9322\u514c\u63db\u5c31\u662f\u4e00\u500b\u5178\u578b\u6848\u4f8b\u3002

    \u70ba\u4e86\u4fdd\u8b49\u6b63\u78ba\u6027\uff0c\u6211\u5011\u61c9\u8a72\u5c0d\u8caa\u5a6a\u7b56\u7565\u9032\u884c\u56b4\u8b39\u7684\u6578\u5b78\u8b49\u660e\uff0c\u901a\u5e38\u9700\u8981\u7528\u5230\u53cd\u8b49\u6cd5\u6216\u6578\u5b78\u6b78\u7d0d\u6cd5\u3002

    \u7136\u800c\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u4e5f\u5f88\u53ef\u80fd\u4e0d\u662f\u4e00\u4ef6\u6613\u4e8b\u3002\u5982\u82e5\u6c92\u6709\u982d\u7dd2\uff0c\u6211\u5011\u901a\u5e38\u6703\u9078\u64c7\u9762\u5411\u6e2c\u8a66\u7528\u4f8b\u9032\u884c\u7a0b\u5f0f\u78bc\u9664\u932f\uff0c\u4e00\u6b65\u6b65\u4fee\u6539\u8207\u9a57\u8b49\u8caa\u5a6a\u7b56\u7565\u3002

    "},{"location":"chapter_greedy/greedy_algorithm/#1514","title":"15.1.4 \u00a0 \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5178\u578b\u4f8b\u984c","text":"

    \u8caa\u5a6a\u6f14\u7b97\u6cd5\u5e38\u5e38\u61c9\u7528\u5728\u6eff\u8db3\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u7684\u6700\u4f73\u5316\u554f\u984c\u4e2d\uff0c\u4ee5\u4e0b\u5217\u8209\u4e86\u4e00\u4e9b\u5178\u578b\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u554f\u984c\u3002

    • \u786c\u5e63\u627e\u96f6\u554f\u984c\uff1a\u5728\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\u4e0b\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7e3d\u662f\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u5340\u9593\u6392\u7a0b\u554f\u984c\uff1a\u5047\u8a2d\u4f60\u6709\u4e00\u4e9b\u4efb\u52d9\uff0c\u6bcf\u500b\u4efb\u52d9\u5728\u4e00\u6bb5\u6642\u9593\u5167\u9032\u884c\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u5b8c\u6210\u5118\u53ef\u80fd\u591a\u7684\u4efb\u52d9\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u7d50\u675f\u6642\u9593\u6700\u65e9\u7684\u4efb\u52d9\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5c31\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u5206\u6578\u80cc\u5305\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u7269\u54c1\u548c\u4e00\u500b\u8f09\u91cd\u91cf\uff0c\u4f60\u7684\u76ee\u6a19\u662f\u9078\u64c7\u4e00\u7d44\u7269\u54c1\uff0c\u4f7f\u5f97\u7e3d\u91cd\u91cf\u4e0d\u8d85\u904e\u8f09\u91cd\u91cf\uff0c\u4e14\u7e3d\u50f9\u503c\u6700\u5927\u3002\u5982\u679c\u6bcf\u6b21\u90fd\u9078\u64c7\u50f9\u6548\u6bd4\u6700\u9ad8\uff08\u50f9\u503c / \u91cd\u91cf\uff09\u7684\u7269\u54c1\uff0c\u90a3\u9ebc\u8caa\u5a6a\u6f14\u7b97\u6cd5\u5728\u4e00\u4e9b\u60c5\u6cc1\u4e0b\u53ef\u4ee5\u5f97\u5230\u6700\u512a\u89e3\u3002
    • \u80a1\u7968\u8cb7\u8ce3\u554f\u984c\uff1a\u7d66\u5b9a\u4e00\u7d44\u80a1\u7968\u7684\u6b77\u53f2\u50f9\u683c\uff0c\u4f60\u53ef\u4ee5\u9032\u884c\u591a\u6b21\u8cb7\u8ce3\uff0c\u4f46\u5982\u679c\u4f60\u5df2\u7d93\u6301\u6709\u80a1\u7968\uff0c\u90a3\u9ebc\u5728\u8ce3\u51fa\u4e4b\u524d\u4e0d\u80fd\u518d\u8cb7\uff0c\u76ee\u6a19\u662f\u7372\u53d6\u6700\u5927\u5229\u6f64\u3002
    • \u970d\u592b\u66fc\u7de8\u78bc\uff1a\u970d\u592b\u66fc\u7de8\u78bc\u662f\u4e00\u7a2e\u7528\u65bc\u7121\u640d\u8cc7\u6599\u58d3\u7e2e\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002\u900f\u904e\u69cb\u5efa\u970d\u592b\u66fc\u6a39\uff0c\u6bcf\u6b21\u9078\u64c7\u51fa\u73fe\u983b\u7387\u6700\u4f4e\u7684\u5169\u500b\u7bc0\u9ede\u5408\u4f75\uff0c\u6700\u5f8c\u5f97\u5230\u7684\u970d\u592b\u66fc\u6a39\u7684\u5e36\u6b0a\u8def\u5f91\u9577\u5ea6\uff08\u7de8\u78bc\u9577\u5ea6\uff09\u6700\u5c0f\u3002
    • Dijkstra \u6f14\u7b97\u6cd5\uff1a\u5b83\u662f\u4e00\u7a2e\u89e3\u6c7a\u7d66\u5b9a\u6e90\u9802\u9ede\u5230\u5176\u9918\u5404\u9802\u9ede\u7684\u6700\u77ed\u8def\u5f91\u554f\u984c\u7684\u8caa\u5a6a\u6f14\u7b97\u6cd5\u3002
    "},{"location":"chapter_greedy/max_capacity_problem/","title":"15.3 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c","text":"

    Question

    \u8f38\u5165\u4e00\u500b\u9663\u5217 \\(ht\\) \uff0c\u5176\u4e2d\u7684\u6bcf\u500b\u5143\u7d20\u4ee3\u8868\u4e00\u500b\u5782\u76f4\u9694\u677f\u7684\u9ad8\u5ea6\u3002\u9663\u5217\u4e2d\u7684\u4efb\u610f\u5169\u500b\u9694\u677f\uff0c\u4ee5\u53ca\u5b83\u5011\u4e4b\u9593\u7684\u7a7a\u9593\u53ef\u4ee5\u7d44\u6210\u4e00\u500b\u5bb9\u5668\u3002

    \u5bb9\u5668\u7684\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u548c\u5bec\u5ea6\u7684\u4e58\u7a4d\uff08\u9762\u7a4d\uff09\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u8f03\u77ed\u7684\u9694\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u500b\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002

    \u8acb\u5728\u9663\u5217\u4e2d\u9078\u64c7\u5169\u500b\u9694\u677f\uff0c\u4f7f\u5f97\u7d44\u6210\u7684\u5bb9\u5668\u7684\u5bb9\u91cf\u6700\u5927\uff0c\u8fd4\u56de\u6700\u5927\u5bb9\u91cf\u3002\u793a\u4f8b\u5982\u5716 15-7 \u6240\u793a\u3002

    \u5716 15-7 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u793a\u4f8b\u8cc7\u6599

    \u5bb9\u5668\u7531\u4efb\u610f\u5169\u500b\u9694\u677f\u570d\u6210\uff0c\u56e0\u6b64\u672c\u984c\u7684\u72c0\u614b\u70ba\u5169\u500b\u9694\u677f\u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\([i, j]\\) \u3002

    \u6839\u64da\u984c\u610f\uff0c\u5bb9\u91cf\u7b49\u65bc\u9ad8\u5ea6\u4e58\u4ee5\u5bec\u5ea6\uff0c\u5176\u4e2d\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u5bec\u5ea6\u662f\u5169\u9694\u677f\u7684\u9663\u5217\u7d22\u5f15\u4e4b\u5dee\u3002\u8a2d\u5bb9\u91cf\u70ba \\(cap[i, j]\\) \uff0c\u5247\u53ef\u5f97\u8a08\u7b97\u516c\u5f0f\uff1a

    \\[ cap[i, j] = \\min(ht[i], ht[j]) \\times (j - i) \\]

    \u8a2d\u9663\u5217\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5169\u500b\u9694\u677f\u7684\u7d44\u5408\u6578\u91cf\uff08\u72c0\u614b\u7e3d\u6578\uff09\u70ba \\(C_n^2 = \\frac{n(n - 1)}{2}\\) \u500b\u3002\u6700\u76f4\u63a5\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u7aae\u8209\u6240\u6709\u72c0\u614b\uff0c\u5f9e\u800c\u6c42\u5f97\u6700\u5927\u5bb9\u91cf\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_greedy/max_capacity_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u9019\u9053\u984c\u9084\u6709\u66f4\u9ad8\u6548\u7387\u7684\u89e3\u6cd5\u3002\u5982\u5716 15-8 \u6240\u793a\uff0c\u73fe\u9078\u53d6\u4e00\u500b\u72c0\u614b \\([i, j]\\) \uff0c\u5176\u6eff\u8db3\u7d22\u5f15 \\(i < j\\) \u4e14\u9ad8\u5ea6 \\(ht[i] < ht[j]\\) \uff0c\u5373 \\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002

    \u5716 15-8 \u00a0 \u521d\u59cb\u72c0\u614b

    \u5982\u5716 15-9 \u6240\u793a\uff0c\u82e5\u6b64\u6642\u5c07\u9577\u677f \\(j\\) \u5411\u77ed\u677f \\(i\\) \u9760\u8fd1\uff0c\u5247\u5bb9\u91cf\u4e00\u5b9a\u8b8a\u5c0f\u3002

    \u9019\u662f\u56e0\u70ba\u5728\u79fb\u52d5\u9577\u677f \\(j\\) \u5f8c\uff0c\u5bec\u5ea6 \\(j-i\\) \u80af\u5b9a\u8b8a\u5c0f\uff1b\u800c\u9ad8\u5ea6\u7531\u77ed\u677f\u6c7a\u5b9a\uff0c\u56e0\u6b64\u9ad8\u5ea6\u53ea\u53ef\u80fd\u4e0d\u8b8a\uff08 \\(i\\) \u4ecd\u70ba\u77ed\u677f\uff09\u6216\u8b8a\u5c0f\uff08\u79fb\u52d5\u5f8c\u7684 \\(j\\) \u6210\u70ba\u77ed\u677f\uff09\u3002

    \u5716 15-9 \u00a0 \u5411\u5167\u79fb\u52d5\u9577\u677f\u5f8c\u7684\u72c0\u614b

    \u53cd\u5411\u601d\u8003\uff0c\u6211\u5011\u53ea\u6709\u5411\u5167\u6536\u7e2e\u77ed\u677f \\(i\\) \uff0c\u624d\u6709\u53ef\u80fd\u4f7f\u5bb9\u91cf\u8b8a\u5927\u3002\u56e0\u70ba\u96d6\u7136\u5bec\u5ea6\u4e00\u5b9a\u8b8a\u5c0f\uff0c\u4f46\u9ad8\u5ea6\u53ef\u80fd\u6703\u8b8a\u5927\uff08\u79fb\u52d5\u5f8c\u7684\u77ed\u677f \\(i\\) \u53ef\u80fd\u6703\u8b8a\u9577\uff09\u3002\u4f8b\u5982\u5728\u5716 15-10 \u4e2d\uff0c\u79fb\u52d5\u77ed\u677f\u5f8c\u9762\u7a4d\u8b8a\u5927\u3002

    \u5716 15-10 \u00a0 \u5411\u5167\u79fb\u52d5\u77ed\u677f\u5f8c\u7684\u72c0\u614b

    \u7531\u6b64\u4fbf\u53ef\u63a8\u51fa\u672c\u984c\u7684\u8caa\u5a6a\u7b56\u7565\uff1a\u521d\u59cb\u5316\u5169\u6307\u6a19\uff0c\u4f7f\u5176\u5206\u5217\u5bb9\u5668\u5169\u7aef\uff0c\u6bcf\u8f2a\u5411\u5167\u6536\u7e2e\u77ed\u677f\u5c0d\u61c9\u7684\u6307\u6a19\uff0c\u76f4\u81f3\u5169\u6307\u6a19\u76f8\u9047\u3002

    \u5716 15-11 \u5c55\u793a\u4e86\u8caa\u5a6a\u7b56\u7565\u7684\u57f7\u884c\u904e\u7a0b\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5217\u9663\u5217\u5169\u7aef\u3002
    2. \u8a08\u7b97\u7576\u524d\u72c0\u614b\u7684\u5bb9\u91cf \\(cap[i, j]\\) \uff0c\u4e26\u66f4\u65b0\u6700\u5927\u5bb9\u91cf\u3002
    3. \u6bd4\u8f03\u677f \\(i\\) \u548c \u677f \\(j\\) \u7684\u9ad8\u5ea6\uff0c\u4e26\u5c07\u77ed\u677f\u5411\u5167\u79fb\u52d5\u4e00\u683c\u3002
    4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u76f4\u81f3 \\(i\\) \u548c \\(j\\) \u76f8\u9047\u6642\u7d50\u675f\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 15-11 \u00a0 \u6700\u5927\u5bb9\u91cf\u554f\u984c\u7684\u8caa\u5a6a\u904e\u7a0b

    "},{"location":"chapter_greedy/max_capacity_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u7a0b\u5f0f\u78bc\u8ff4\u5708\u6700\u591a \\(n\\) \u8f2a\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002

    \u8b8a\u6578 \\(i\\)\u3001\\(j\\)\u3001\\(res\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig max_capacity.py
    def max_capacity(ht: list[int]) -> int:\n    \"\"\"\u6700\u5927\u5bb9\u91cf\uff1a\u8caa\u5a6a\"\"\"\n    # \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j = 0, len(ht) - 1\n    # \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res = 0\n    # \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(vector<int> &ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.size() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint MaxCapacity(int[] ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0, j = ht.Length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunc maxCapacity(ht []int) int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    i, j := 0, len(ht)-1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    res := 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunc maxCapacity(ht: [Int]) -> Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = ht.startIndex, j = ht.endIndex - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunction maxCapacity(ht) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfunction maxCapacity(ht: number[]): number {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let i = 0,\n        j = ht.length - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(List<int> ht) {\n  // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n  int i = 0, j = ht.length - 1;\n  // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n  int res = 0;\n  // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfn max_capacity(ht: &[i32]) -> i32 {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    let mut i = 0;\n    let mut j = ht.len() - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    let mut res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nint maxCapacity(int ht[], int htLength) {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    int i = 0;\n    int j = htLength - 1;\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    int res = 0;\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\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\u8caa\u5a6a */\nfun maxCapacity(ht: IntArray): Int {\n    // \u521d\u59cb\u5316 i, j\uff0c\u4f7f\u5176\u5206\u5217\u9663\u5217\u5169\u7aef\n    var i = 0\n    var j = ht.size - 1\n    // \u521d\u59cb\u6700\u5927\u5bb9\u91cf\u70ba 0\n    var res = 0\n    // \u8ff4\u5708\u8caa\u5a6a\u9078\u64c7\uff0c\u76f4\u81f3\u5169\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\u5167\u79fb\u52d5\u77ed\u677f\n        if (ht[i] < ht[j]) {\n            i++\n        } else {\n            j--\n        }\n    }\n    return res\n}\n
    max_capacity.rb
    [class]{}-[func]{max_capacity}\n
    max_capacity.zig
    [class]{}-[func]{maxCapacity}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_greedy/max_capacity_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u4e4b\u6240\u4ee5\u8caa\u5a6a\u6bd4\u7aae\u8209\u66f4\u5feb\uff0c\u662f\u56e0\u70ba\u6bcf\u8f2a\u7684\u8caa\u5a6a\u9078\u64c7\u90fd\u6703\u201c\u8df3\u904e\u201d\u4e00\u4e9b\u72c0\u614b\u3002

    \u6bd4\u5982\u5728\u72c0\u614b \\(cap[i, j]\\) \u4e0b\uff0c\\(i\\) \u70ba\u77ed\u677f\u3001\\(j\\) \u70ba\u9577\u677f\u3002\u82e5\u8caa\u5a6a\u5730\u5c07\u77ed\u677f \\(i\\) \u5411\u5167\u79fb\u52d5\u4e00\u683c\uff0c\u6703\u5c0e\u81f4\u5716 15-12 \u6240\u793a\u7684\u72c0\u614b\u88ab\u201c\u8df3\u904e\u201d\u3002\u9019\u610f\u5473\u8457\u4e4b\u5f8c\u7121\u6cd5\u9a57\u8b49\u9019\u4e9b\u72c0\u614b\u7684\u5bb9\u91cf\u5927\u5c0f\u3002

    \\[ cap[i, i+1], cap[i, i+2], \\dots, cap[i, j-2], cap[i, j-1] \\]

    \u5716 15-12 \u00a0 \u79fb\u52d5\u77ed\u677f\u5c0e\u81f4\u88ab\u8df3\u904e\u7684\u72c0\u614b

    \u89c0\u5bdf\u767c\u73fe\uff0c\u9019\u4e9b\u88ab\u8df3\u904e\u7684\u72c0\u614b\u5be6\u969b\u4e0a\u5c31\u662f\u5c07\u9577\u677f \\(j\\) \u5411\u5167\u79fb\u52d5\u7684\u6240\u6709\u72c0\u614b\u3002\u524d\u9762\u6211\u5011\u5df2\u7d93\u8b49\u660e\u5167\u79fb\u9577\u677f\u4e00\u5b9a\u6703\u5c0e\u81f4\u5bb9\u91cf\u8b8a\u5c0f\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u88ab\u8df3\u904e\u7684\u72c0\u614b\u90fd\u4e0d\u53ef\u80fd\u662f\u6700\u512a\u89e3\uff0c\u8df3\u904e\u5b83\u5011\u4e0d\u6703\u5c0e\u81f4\u932f\u904e\u6700\u512a\u89e3\u3002

    \u4ee5\u4e0a\u5206\u6790\u8aaa\u660e\uff0c\u79fb\u52d5\u77ed\u677f\u7684\u64cd\u4f5c\u662f\u201c\u5b89\u5168\u201d\u7684\uff0c\u8caa\u5a6a\u7b56\u7565\u662f\u6709\u6548\u7684\u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/","title":"15.4 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u6b63\u6574\u6578 \\(n\\) \uff0c\u5c07\u5176\u5207\u5206\u70ba\u81f3\u5c11\u5169\u500b\u6b63\u6574\u6578\u7684\u548c\uff0c\u6c42\u5207\u5206\u5f8c\u6240\u6709\u6574\u6578\u7684\u4e58\u7a4d\u6700\u5927\u662f\u591a\u5c11\uff0c\u5982\u5716 15-13 \u6240\u793a\u3002

    \u5716 15-13 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u554f\u984c\u5b9a\u7fa9

    \u5047\u8a2d\u6211\u5011\u5c07 \\(n\\) \u5207\u5206\u70ba \\(m\\) \u500b\u6574\u6578\u56e0\u5b50\uff0c\u5176\u4e2d\u7b2c \\(i\\) \u500b\u56e0\u5b50\u8a18\u70ba \\(n_i\\) \uff0c\u5373

    \\[ n = \\sum_{i=1}^{m}n_i \\]

    \u672c\u984c\u7684\u76ee\u6a19\u662f\u6c42\u5f97\u6240\u6709\u6574\u6578\u56e0\u5b50\u7684\u6700\u5927\u4e58\u7a4d\uff0c\u5373

    \\[ \\max(\\prod_{i=1}^{m}n_i) \\]

    \u6211\u5011\u9700\u8981\u601d\u8003\u7684\u662f\uff1a\u5207\u5206\u6578\u91cf \\(m\\) \u61c9\u8a72\u591a\u5927\uff0c\u6bcf\u500b \\(n_i\\) \u61c9\u8a72\u662f\u591a\u5c11\uff1f

    "},{"location":"chapter_greedy/max_product_cutting_problem/#1","title":"1. \u00a0 \u8caa\u5a6a\u7b56\u7565\u78ba\u5b9a","text":"

    \u6839\u64da\u7d93\u9a57\uff0c\u5169\u500b\u6574\u6578\u7684\u4e58\u7a4d\u5f80\u5f80\u6bd4\u5b83\u5011\u7684\u52a0\u548c\u66f4\u5927\u3002\u5047\u8a2d\u5f9e \\(n\\) \u4e2d\u5206\u51fa\u4e00\u500b\u56e0\u5b50 \\(2\\) \uff0c\u5247\u5b83\u5011\u7684\u4e58\u7a4d\u70ba \\(2(n-2)\\) \u3002\u6211\u5011\u5c07\u8a72\u4e58\u7a4d\u8207 \\(n\\) \u4f5c\u6bd4\u8f03\uff1a

    \\[ \\begin{aligned} 2(n-2) & \\geq n \\newline 2n - n - 4 & \\geq 0 \\newline n & \\geq 4 \\end{aligned} \\]

    \u5982\u5716 15-14 \u6240\u793a\uff0c\u7576 \\(n \\geq 4\\) \u6642\uff0c\u5207\u5206\u51fa\u4e00\u500b \\(2\\) \u5f8c\u4e58\u7a4d\u6703\u8b8a\u5927\uff0c\u9019\u8aaa\u660e\u5927\u65bc\u7b49\u65bc \\(4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u88ab\u5207\u5206\u3002

    \u8caa\u5a6a\u7b56\u7565\u4e00\uff1a\u5982\u679c\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b \\(\\geq 4\\) \u7684\u56e0\u5b50\uff0c\u90a3\u9ebc\u5b83\u5c31\u61c9\u8a72\u88ab\u7e7c\u7e8c\u5207\u5206\u3002\u6700\u7d42\u7684\u5207\u5206\u65b9\u6848\u53ea\u61c9\u51fa\u73fe \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u7a2e\u56e0\u5b50\u3002

    \u5716 15-14 \u00a0 \u5207\u5206\u5c0e\u81f4\u4e58\u7a4d\u8b8a\u5927

    \u63a5\u4e0b\u4f86\u601d\u8003\u54ea\u500b\u56e0\u5b50\u662f\u6700\u512a\u7684\u3002\u5728 \\(1\\)\u3001\\(2\\)\u3001\\(3\\) \u9019\u4e09\u500b\u56e0\u5b50\u4e2d\uff0c\u986f\u7136 \\(1\\) \u662f\u6700\u5dee\u7684\uff0c\u56e0\u70ba \\(1 \\times (n-1) < n\\) \u6046\u6210\u7acb\uff0c\u5373\u5207\u5206\u51fa \\(1\\) \u53cd\u800c\u6703\u5c0e\u81f4\u4e58\u7a4d\u6e1b\u5c0f\u3002

    \u5982\u5716 15-15 \u6240\u793a\uff0c\u7576 \\(n = 6\\) \u6642\uff0c\u6709 \\(3 \\times 3 > 2 \\times 2 \\times 2\\) \u3002\u9019\u610f\u5473\u8457\u5207\u5206\u51fa \\(3\\) \u6bd4\u5207\u5206\u51fa \\(2\\) \u66f4\u512a\u3002

    \u8caa\u5a6a\u7b56\u7565\u4e8c\uff1a\u5728\u5207\u5206\u65b9\u6848\u4e2d\uff0c\u6700\u591a\u96bb\u61c9\u5b58\u5728\u5169\u500b \\(2\\) \u3002\u56e0\u70ba\u4e09\u500b \\(2\\) \u7e3d\u662f\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002

    \u5716 15-15 \u00a0 \u6700\u512a\u5207\u5206\u56e0\u5b50

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u53ef\u63a8\u7406\u51fa\u4ee5\u4e0b\u8caa\u5a6a\u7b56\u7565\u3002

    1. \u8f38\u5165\u6574\u6578 \\(n\\) \uff0c\u5f9e\u5176\u4e0d\u65b7\u5730\u5207\u5206\u51fa\u56e0\u5b50 \\(3\\) \uff0c\u76f4\u81f3\u9918\u6578\u70ba \\(0\\)\u3001\\(1\\)\u3001\\(2\\) \u3002
    2. \u7576\u9918\u6578\u70ba \\(0\\) \u6642\uff0c\u4ee3\u8868 \\(n\\) \u662f \\(3\\) \u7684\u500d\u6578\uff0c\u56e0\u6b64\u4e0d\u505a\u4efb\u4f55\u8655\u7406\u3002
    3. \u7576\u9918\u6578\u70ba \\(2\\) \u6642\uff0c\u4e0d\u7e7c\u7e8c\u5283\u5206\uff0c\u4fdd\u7559\u3002
    4. \u7576\u9918\u6578\u70ba \\(1\\) \u6642\uff0c\u7531\u65bc \\(2 \\times 2 > 1 \\times 3\\) \uff0c\u56e0\u6b64\u61c9\u5c07\u6700\u5f8c\u4e00\u500b \\(3\\) \u66ff\u63db\u70ba \\(2\\) \u3002
    "},{"location":"chapter_greedy/max_product_cutting_problem/#2","title":"2. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5982\u5716 15-16 \u6240\u793a\uff0c\u6211\u5011\u7121\u9808\u900f\u904e\u8ff4\u5708\u4f86\u5207\u5206\u6574\u6578\uff0c\u800c\u53ef\u4ee5\u5229\u7528\u5411\u4e0b\u6574\u9664\u904b\u7b97\u5f97\u5230 \\(3\\) \u7684\u500b\u6578 \\(a\\) \uff0c\u7528\u53d6\u6a21\u904b\u7b97\u5f97\u5230\u9918\u6578 \\(b\\) \uff0c\u6b64\u6642\u6709\uff1a

    \\[ n = 3 a + b \\]

    \u8acb\u6ce8\u610f\uff0c\u5c0d\u65bc \\(n \\leq 3\\) \u7684\u908a\u754c\u60c5\u6cc1\uff0c\u5fc5\u9808\u62c6\u5206\u51fa\u4e00\u500b \\(1\\) \uff0c\u4e58\u7a4d\u70ba \\(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\u7a4d\uff1a\u8caa\u5a6a\"\"\"\n    # \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3:\n        return 1 * (n - 1)\n    # \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a, b = n // 3, n % 3\n    if b == 1:\n        # \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.pow(3, a - 1)) * 2 * 2\n    if b == 2:\n        # \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.pow(3, a)) * 2\n    # \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.pow(3, a))\n
    max_product_cutting.cpp
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)pow(3, a);\n}\n
    max_product_cutting.java
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int) Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int) Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int) Math.pow(3, a);\n}\n
    max_product_cutting.cs
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint MaxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return (int)Math.Pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return (int)Math.Pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (int)Math.Pow(3, a);\n}\n
    max_product_cutting.go
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n int) int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    a := n / 3\n    b := n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return int(math.Pow(3, float64(a-1))) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return int(math.Pow(3, float64(a))) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return int(math.Pow(3, float64(a)))\n}\n
    max_product_cutting.swift
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunc maxProductCutting(n: Int) -> Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3\n    let b = n % 3\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2\n    }\n    if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a)\n}\n
    max_product_cutting.js
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = Math.floor(n / 3);\n    let b = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.ts
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfunction maxProductCutting(n: number): number {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a: number = Math.floor(n / 3);\n    let b: number = n % 3;\n    if (b === 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return Math.pow(3, a - 1) * 2 * 2;\n    }\n    if (b === 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return Math.pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return Math.pow(3, a);\n}\n
    max_product_cutting.dart
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n  // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n  if (n <= 3) {\n    return 1 * (n - 1);\n  }\n  // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n  int a = n ~/ 3;\n  int b = n % 3;\n  if (b == 1) {\n    // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n    return (pow(3, a - 1) * 2 * 2).toInt();\n  }\n  if (b == 2) {\n    // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return (pow(3, a) * 2).toInt();\n  }\n  // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n  return pow(3, a).toInt();\n}\n
    max_product_cutting.rs
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfn max_product_cutting(n: i32) -> i32 {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if n <= 3 {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    let a = n / 3;\n    let b = n % 3;\n    if b == 1 {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        3_i32.pow(a as u32 - 1) * 2 * 2\n    } else if b == 2 {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32) * 2\n    } else {\n        // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        3_i32.pow(a as u32)\n    }\n}\n
    max_product_cutting.c
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nint maxProductCutting(int n) {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1);\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    int a = n / 3;\n    int b = n % 3;\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return pow(3, a - 1) * 2 * 2;\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return pow(3, a) * 2;\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return pow(3, a);\n}\n
    max_product_cutting.kt
    /* \u6700\u5927\u5207\u5206\u4e58\u7a4d\uff1a\u8caa\u5a6a */\nfun maxProductCutting(n: Int): Int {\n    // \u7576 n <= 3 \u6642\uff0c\u5fc5\u9808\u5207\u5206\u51fa\u4e00\u500b 1\n    if (n <= 3) {\n        return 1 * (n - 1)\n    }\n    // \u8caa\u5a6a\u5730\u5207\u5206\u51fa 3 \uff0ca \u70ba 3 \u7684\u500b\u6578\uff0cb \u70ba\u9918\u6578\n    val a = n / 3\n    val b = n % 3\n    if (b == 1) {\n        // \u7576\u9918\u6578\u70ba 1 \u6642\uff0c\u5c07\u4e00\u5c0d 1 * 3 \u8f49\u5316\u70ba 2 * 2\n        return 3.0.pow((a - 1)).toInt() * 2 * 2\n    }\n    if (b == 2) {\n        // \u7576\u9918\u6578\u70ba 2 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n        return 3.0.pow(a).toInt() * 2 * 2\n    }\n    // \u7576\u9918\u6578\u70ba 0 \u6642\uff0c\u4e0d\u505a\u8655\u7406\n    return 3.0.pow(a).toInt()\n}\n
    max_product_cutting.rb
    [class]{}-[func]{max_product_cutting}\n
    max_product_cutting.zig
    [class]{}-[func]{maxProductCutting}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5716 15-16 \u00a0 \u6700\u5927\u5207\u5206\u4e58\u7a4d\u7684\u8a08\u7b97\u65b9\u6cd5

    \u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u51aa\u904b\u7b97\u7684\u5be6\u73fe\u65b9\u6cd5\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u5e38\u7528\u7684\u51aa\u8a08\u7b97\u51fd\u5f0f\u6709\u4e09\u7a2e\u3002

    • \u904b\u7b97\u5b50 ** \u548c\u51fd\u5f0f pow() \u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log\u2061 a)\\) \u3002
    • \u51fd\u5f0f math.pow() \u5167\u90e8\u547c\u53eb C \u8a9e\u8a00\u5eab\u7684 pow() \u51fd\u5f0f\uff0c\u5176\u57f7\u884c\u6d6e\u9ede\u53d6\u51aa\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    \u8b8a\u6578 \\(a\\) \u548c \\(b\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002

    "},{"location":"chapter_greedy/max_product_cutting_problem/#3","title":"3. \u00a0 \u6b63\u78ba\u6027\u8b49\u660e","text":"

    \u4f7f\u7528\u53cd\u8b49\u6cd5\uff0c\u53ea\u5206\u6790 \\(n \\geq 3\\) \u7684\u60c5\u6cc1\u3002

    1. \u6240\u6709\u56e0\u5b50 \\(\\leq 3\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728 \\(\\geq 4\\) \u7684\u56e0\u5b50 \\(x\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u5c07\u5176\u7e7c\u7e8c\u5283\u5206\u70ba \\(2(x-2)\\) \uff0c\u5f9e\u800c\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    2. \u5207\u5206\u65b9\u6848\u4e0d\u5305\u542b \\(1\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5b58\u5728\u4e00\u500b\u56e0\u5b50 \\(1\\) \uff0c\u90a3\u9ebc\u5b83\u4e00\u5b9a\u53ef\u4ee5\u5408\u4f75\u5165\u53e6\u5916\u4e00\u500b\u56e0\u5b50\u4e2d\uff0c\u4ee5\u7372\u5f97\u66f4\u5927\u7684\u4e58\u7a4d\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    3. \u5207\u5206\u65b9\u6848\u6700\u591a\u5305\u542b\u5169\u500b \\(2\\) \uff1a\u5047\u8a2d\u6700\u512a\u5207\u5206\u65b9\u6848\u4e2d\u5305\u542b\u4e09\u500b \\(2\\) \uff0c\u90a3\u9ebc\u4e00\u5b9a\u53ef\u4ee5\u66ff\u63db\u70ba\u5169\u500b \\(3\\) \uff0c\u4e58\u7a4d\u66f4\u5927\u3002\u9019\u8207\u5047\u8a2d\u77db\u76fe\u3002
    "},{"location":"chapter_greedy/summary/","title":"15.5 \u00a0 \u5c0f\u7d50","text":"
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u901a\u5e38\u7528\u65bc\u89e3\u6c7a\u6700\u6700\u4f73\u5316\u554f\u984c\uff0c\u5176\u539f\u7406\u662f\u5728\u6bcf\u500b\u6c7a\u7b56\u968e\u6bb5\u90fd\u505a\u51fa\u5340\u57df\u6027\u6700\u512a\u7684\u6c7a\u7b56\uff0c\u4ee5\u671f\u7372\u5f97\u5168\u57df\u6027\u6700\u512a\u89e3\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u6703\u8fed\u4ee3\u5730\u505a\u51fa\u4e00\u500b\u53c8\u4e00\u500b\u7684\u8caa\u5a6a\u9078\u64c7\uff0c\u6bcf\u8f2a\u90fd\u5c07\u554f\u984c\u8f49\u5316\u6210\u4e00\u500b\u898f\u6a21\u66f4\u5c0f\u7684\u5b50\u554f\u984c\uff0c\u76f4\u5230\u554f\u984c\u88ab\u89e3\u6c7a\u3002
    • \u8caa\u5a6a\u6f14\u7b97\u6cd5\u4e0d\u50c5\u5be6\u73fe\u7c21\u55ae\uff0c\u9084\u5177\u6709\u5f88\u9ad8\u7684\u89e3\u984c\u6548\u7387\u3002\u76f8\u6bd4\u65bc\u52d5\u614b\u898f\u5283\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u66f4\u4f4e\u3002
    • \u5728\u96f6\u9322\u514c\u63db\u554f\u984c\u4e2d\uff0c\u5c0d\u65bc\u67d0\u4e9b\u786c\u5e63\u7d44\u5408\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u4ee5\u4fdd\u8b49\u627e\u5230\u6700\u512a\u89e3\uff1b\u5c0d\u65bc\u53e6\u5916\u4e00\u4e9b\u786c\u5e63\u7d44\u5408\u5247\u4e0d\u7136\uff0c\u8caa\u5a6a\u6f14\u7b97\u6cd5\u53ef\u80fd\u627e\u5230\u5f88\u5dee\u7684\u89e3\u3002
    • \u9069\u5408\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u7684\u554f\u984c\u5177\u6709\u5169\u5927\u6027\u8cea\uff1a\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u548c\u6700\u512a\u5b50\u7d50\u69cb\u3002\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u4ee3\u8868\u8caa\u5a6a\u7b56\u7565\u7684\u6709\u6548\u6027\u3002
    • \u5c0d\u65bc\u67d0\u4e9b\u8907\u96dc\u554f\u984c\uff0c\u8caa\u5a6a\u9078\u64c7\u6027\u8cea\u7684\u8b49\u660e\u4e26\u4e0d\u7c21\u55ae\u3002\u76f8\u5c0d\u4f86\u8aaa\uff0c\u8b49\u507d\u66f4\u52a0\u5bb9\u6613\uff0c\u4f8b\u5982\u96f6\u9322\u514c\u63db\u554f\u984c\u3002
    • \u6c42\u89e3\u8caa\u5a6a\u554f\u984c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\uff1a\u554f\u984c\u5206\u6790\u3001\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u3001\u6b63\u78ba\u6027\u8b49\u660e\u3002\u5176\u4e2d\uff0c\u78ba\u5b9a\u8caa\u5a6a\u7b56\u7565\u662f\u6838\u5fc3\u6b65\u9a5f\uff0c\u6b63\u78ba\u6027\u8b49\u660e\u5f80\u5f80\u662f\u96e3\u9ede\u3002
    • \u5206\u6578\u80cc\u5305\u554f\u984c\u5728 0-1 \u80cc\u5305\u7684\u57fa\u790e\u4e0a\uff0c\u5141\u8a31\u9078\u64c7\u7269\u54c1\u7684\u4e00\u90e8\u5206\uff0c\u56e0\u6b64\u53ef\u4f7f\u7528\u8caa\u5a6a\u6f14\u7b97\u6cd5\u6c42\u89e3\u3002\u8caa\u5a6a\u7b56\u7565\u7684\u6b63\u78ba\u6027\u53ef\u4ee5\u4f7f\u7528\u53cd\u8b49\u6cd5\u4f86\u8b49\u660e\u3002
    • \u6700\u5927\u5bb9\u91cf\u554f\u984c\u53ef\u4f7f\u7528\u7aae\u8209\u6cd5\u6c42\u89e3\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u900f\u904e\u8a2d\u8a08\u8caa\u5a6a\u7b56\u7565\uff0c\u6bcf\u8f2a\u5411\u5167\u79fb\u52d5\u77ed\u677f\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \u3002
    • \u5728\u6700\u5927\u5207\u5206\u4e58\u7a4d\u554f\u984c\u4e2d\uff0c\u6211\u5011\u5148\u5f8c\u63a8\u7406\u51fa\u5169\u500b\u8caa\u5a6a\u7b56\u7565\uff1a\\(\\geq 4\\) \u7684\u6574\u6578\u90fd\u61c9\u8a72\u7e7c\u7e8c\u5207\u5206\uff0c\u6700\u512a\u5207\u5206\u56e0\u5b50\u70ba \\(3\\) \u3002\u7a0b\u5f0f\u78bc\u4e2d\u5305\u542b\u51aa\u904b\u7b97\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53d6\u6c7a\u65bc\u51aa\u904b\u7b97\u5be6\u73fe\u65b9\u6cd5\uff0c\u901a\u5e38\u70ba \\(O(1)\\) \u6216 \\(O(\\log n)\\) \u3002
    "},{"location":"chapter_hashing/","title":"\u7b2c 6 \u7ae0 \u00a0 \u96dc\u6e4a\u8868","text":"

    Abstract

    \u5728\u8a08\u7b97\u6a5f\u4e16\u754c\u4e2d\uff0c\u96dc\u6e4a\u8868\u5982\u540c\u4e00\u4f4d\u8070\u6167\u7684\u5716\u66f8\u7ba1\u7406\u54e1\u3002

    \u4ed6\u77e5\u9053\u5982\u4f55\u8a08\u7b97\u7d22\u66f8\u865f\uff0c\u5f9e\u800c\u53ef\u4ee5\u5feb\u901f\u627e\u5230\u76ee\u6a19\u5716\u66f8\u3002

    "},{"location":"chapter_hashing/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 6.1 \u00a0 \u96dc\u6e4a\u8868
    • 6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81
    • 6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5
    • 6.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_hashing/hash_algorithm/","title":"6.3 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

    \u524d\u5169\u7bc0\u4ecb\u7d39\u4e86\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u539f\u7406\u548c\u96dc\u6e4a\u885d\u7a81\u7684\u8655\u7406\u65b9\u6cd5\u3002\u7136\u800c\u7121\u8ad6\u662f\u958b\u653e\u5b9a\u5740\u9084\u662f\u93c8\u5f0f\u4f4d\u5740\uff0c\u5b83\u5011\u53ea\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u767c\u751f\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\uff0c\u800c\u7121\u6cd5\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u3002

    \u5982\u679c\u96dc\u6e4a\u885d\u7a81\u904e\u65bc\u983b\u7e41\uff0c\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u5247\u6703\u6025\u5287\u52a3\u5316\u3002\u5982\u5716 6-8 \u6240\u793a\uff0c\u5c0d\u65bc\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\uff0c\u7406\u60f3\u60c5\u6cc1\u4e0b\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u5404\u500b\u6876\u4e2d\uff0c\u9054\u5230\u6700\u4f73\u67e5\u8a62\u6548\u7387\uff1b\u6700\u5dee\u60c5\u6cc1\u4e0b\u6240\u6709\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5230\u540c\u4e00\u500b\u6876\u4e2d\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u5716 6-8 \u00a0 \u96dc\u6e4a\u885d\u7a81\u7684\u6700\u4f73\u60c5\u6cc1\u8207\u6700\u5dee\u60c5\u6cc1

    \u9375\u503c\u5c0d\u7684\u5206\u4f48\u60c5\u6cc1\u7531\u96dc\u6e4a\u51fd\u5f0f\u6c7a\u5b9a\u3002\u56de\u61b6\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u6b65\u9a5f\uff0c\u5148\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u518d\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\uff1a

    index = hash(key) % capacity\n

    \u89c0\u5bdf\u4ee5\u4e0a\u516c\u5f0f\uff0c\u7576\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u56fa\u5b9a\u6642\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u6c7a\u5b9a\u4e86\u8f38\u51fa\u503c\uff0c\u9032\u800c\u6c7a\u5b9a\u4e86\u9375\u503c\u5c0d\u5728\u96dc\u6e4a\u8868\u4e2d\u7684\u5206\u4f48\u60c5\u6cc1\u3002

    \u9019\u610f\u5473\u8457\uff0c\u70ba\u4e86\u964d\u4f4e\u96dc\u6e4a\u885d\u7a81\u7684\u767c\u751f\u6a5f\u7387\uff0c\u6211\u5011\u61c9\u7576\u5c07\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u7684\u8a2d\u8a08\u4e0a\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#631","title":"6.3.1 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u76ee\u6a19","text":"

    \u70ba\u4e86\u5be6\u73fe\u201c\u65e2\u5feb\u53c8\u7a69\u201d\u7684\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u5177\u5099\u4ee5\u4e0b\u7279\u9ede\u3002

    • \u78ba\u5b9a\u6027\uff1a\u5c0d\u65bc\u76f8\u540c\u7684\u8f38\u5165\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u59cb\u7d42\u7522\u751f\u76f8\u540c\u7684\u8f38\u51fa\u3002\u9019\u6a23\u624d\u80fd\u78ba\u4fdd\u96dc\u6e4a\u8868\u662f\u53ef\u9760\u7684\u3002
    • \u6548\u7387\u9ad8\uff1a\u8a08\u7b97\u96dc\u6e4a\u503c\u7684\u904e\u7a0b\u61c9\u8a72\u8db3\u5920\u5feb\u3002\u8a08\u7b97\u958b\u92b7\u8d8a\u5c0f\uff0c\u96dc\u6e4a\u8868\u7684\u5be6\u7528\u6027\u8d8a\u9ad8\u3002
    • \u5747\u52fb\u5206\u4f48\uff1a\u96dc\u6e4a\u6f14\u7b97\u6cd5\u61c9\u4f7f\u5f97\u9375\u503c\u5c0d\u5747\u52fb\u5206\u4f48\u5728\u96dc\u6e4a\u8868\u4e2d\u3002\u5206\u4f48\u8d8a\u5747\u52fb\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002

    \u5be6\u969b\u4e0a\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9664\u4e86\u53ef\u4ee5\u7528\u65bc\u5be6\u73fe\u96dc\u6e4a\u8868\uff0c\u9084\u5ee3\u6cdb\u61c9\u7528\u65bc\u5176\u4ed6\u9818\u57df\u4e2d\u3002

    • \u5bc6\u78bc\u5132\u5b58\uff1a\u70ba\u4e86\u4fdd\u8b77\u4f7f\u7528\u8005\u5bc6\u78bc\u7684\u5b89\u5168\uff0c\u7cfb\u7d71\u901a\u5e38\u4e0d\u6703\u76f4\u63a5\u5132\u5b58\u4f7f\u7528\u8005\u7684\u660e\u6587\u5bc6\u78bc\uff0c\u800c\u662f\u5132\u5b58\u5bc6\u78bc\u7684\u96dc\u6e4a\u503c\u3002\u7576\u7528\u6236\u8f38\u5165\u5bc6\u78bc\u6642\uff0c\u7cfb\u7d71\u6703\u5c0d\u8f38\u5165\u7684\u5bc6\u78bc\u8a08\u7b97\u96dc\u6e4a\u503c\uff0c\u7136\u5f8c\u8207\u5132\u5b58\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u5bc6\u78bc\u5c31\u88ab\u8996\u70ba\u6b63\u78ba\u3002
    • \u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5\uff1a\u8cc7\u6599\u50b3\u9001\u65b9\u53ef\u4ee5\u8a08\u7b97\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\u4e26\u5c07\u5176\u4e00\u540c\u50b3\u9001\uff1b\u63a5\u6536\u65b9\u53ef\u4ee5\u91cd\u65b0\u8a08\u7b97\u63a5\u6536\u5230\u7684\u8cc7\u6599\u7684\u96dc\u6e4a\u503c\uff0c\u4e26\u8207\u63a5\u6536\u5230\u7684\u96dc\u6e4a\u503c\u9032\u884c\u6bd4\u8f03\u3002\u5982\u679c\u5169\u8005\u5339\u914d\uff0c\u90a3\u9ebc\u8cc7\u6599\u5c31\u88ab\u8996\u70ba\u5b8c\u6574\u3002

    \u5c0d\u65bc\u5bc6\u78bc\u5b78\u7684\u76f8\u95dc\u61c9\u7528\uff0c\u70ba\u4e86\u9632\u6b62\u5f9e\u96dc\u6e4a\u503c\u63a8\u5c0e\u51fa\u539f\u59cb\u5bc6\u78bc\u7b49\u9006\u5411\u5de5\u7a0b\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9700\u8981\u5177\u5099\u66f4\u9ad8\u7b49\u7d1a\u7684\u5b89\u5168\u7279\u6027\u3002

    • \u55ae\u5411\u6027\uff1a\u7121\u6cd5\u900f\u904e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u95dc\u65bc\u8f38\u5165\u8cc7\u6599\u7684\u4efb\u4f55\u8cc7\u8a0a\u3002
    • \u6297\u78b0\u649e\u6027\uff1a\u61c9\u7576\u6975\u96e3\u627e\u5230\u5169\u500b\u4e0d\u540c\u7684\u8f38\u5165\uff0c\u4f7f\u5f97\u5b83\u5011\u7684\u96dc\u6e4a\u503c\u76f8\u540c\u3002
    • \u96ea\u5d29\u6548\u61c9\uff1a\u8f38\u5165\u7684\u5fae\u5c0f\u8b8a\u5316\u61c9\u7576\u5c0e\u81f4\u8f38\u51fa\u7684\u986f\u8457\u4e14\u4e0d\u53ef\u9810\u6e2c\u7684\u8b8a\u5316\u3002

    \u8acb\u6ce8\u610f\uff0c\u201c\u5747\u52fb\u5206\u4f48\u201d\u8207\u201c\u6297\u78b0\u649e\u6027\u201d\u662f\u5169\u500b\u7368\u7acb\u7684\u6982\u5ff5\uff0c\u6eff\u8db3\u5747\u52fb\u5206\u4f48\u4e0d\u4e00\u5b9a\u6eff\u8db3\u6297\u78b0\u649e\u6027\u3002\u4f8b\u5982\uff0c\u5728\u96a8\u6a5f\u8f38\u5165 key \u4e0b\uff0c\u96dc\u6e4a\u51fd\u5f0f key % 100 \u53ef\u4ee5\u7522\u751f\u5747\u52fb\u5206\u4f48\u7684\u8f38\u51fa\u3002\u7136\u800c\u8a72\u96dc\u6e4a\u6f14\u7b97\u6cd5\u904e\u65bc\u7c21\u55ae\uff0c\u6240\u6709\u5f8c\u5169\u4f4d\u76f8\u7b49\u7684 key \u7684\u8f38\u51fa\u90fd\u76f8\u540c\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u5f9e\u96dc\u6e4a\u503c\u53cd\u63a8\u51fa\u53ef\u7528\u7684 key \uff0c\u5f9e\u800c\u7834\u89e3\u5bc6\u78bc\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#632","title":"6.3.2 \u00a0 \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08","text":"

    \u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u662f\u4e00\u500b\u9700\u8981\u8003\u616e\u8a31\u591a\u56e0\u7d20\u7684\u8907\u96dc\u554f\u984c\u3002\u7136\u800c\u5c0d\u65bc\u67d0\u4e9b\u8981\u6c42\u4e0d\u9ad8\u7684\u5834\u666f\uff0c\u6211\u5011\u4e5f\u80fd\u8a2d\u8a08\u4e00\u4e9b\u7c21\u55ae\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

    • \u52a0\u6cd5\u96dc\u6e4a\uff1a\u5c0d\u8f38\u5165\u7684\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u9032\u884c\u76f8\u52a0\uff0c\u5c07\u5f97\u5230\u7684\u7e3d\u548c\u4f5c\u70ba\u96dc\u6e4a\u503c\u3002
    • \u4e58\u6cd5\u96dc\u6e4a\uff1a\u5229\u7528\u4e58\u6cd5\u7684\u4e0d\u76f8\u95dc\u6027\uff0c\u6bcf\u8f2a\u4e58\u4ee5\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5404\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u96dc\u6e4a\u503c\u4e2d\u3002
    • \u4e92\u65a5\u6216\u96dc\u6e4a\uff1a\u5c07\u8f38\u5165\u8cc7\u6599\u7684\u6bcf\u500b\u5143\u7d20\u900f\u904e\u4e92\u65a5\u6216\u64cd\u4f5c\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\u3002
    • \u65cb\u8f49\u96dc\u6e4a\uff1a\u5c07\u6bcf\u500b\u5b57\u5143\u7684 ASCII \u78bc\u7d2f\u7a4d\u5230\u4e00\u500b\u96dc\u6e4a\u503c\u4e2d\uff0c\u6bcf\u6b21\u7d2f\u7a4d\u4e4b\u524d\u90fd\u6703\u5c0d\u96dc\u6e4a\u503c\u9032\u884c\u65cb\u8f49\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig simple_hash.py
    def add_hash(key: str) -> int:\n    \"\"\"\u52a0\u6cd5\u96dc\u6e4a\"\"\"\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\u96dc\u6e4a\"\"\"\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    \"\"\"\u4e92\u65a5\u6216\u96dc\u6e4a\"\"\"\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\u8f49\u96dc\u6e4a\"\"\"\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a */\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\u96dc\u6e4a */\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/* \u4e92\u65a5\u6216\u96dc\u6e4a */\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\u8f49\u96dc\u6e4a */\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\u96dc\u6e4a ###\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\u96dc\u6e4a ###\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### \u4e92\u65a5\u6216\u96dc\u6e4a ###\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\u8f49\u96dc\u6e4a ###\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u89c0\u5bdf\u767c\u73fe\uff0c\u6bcf\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6700\u5f8c\u4e00\u6b65\u90fd\u662f\u5c0d\u5927\u8cea\u6578 \\(1000000007\\) \u53d6\u6a21\uff0c\u4ee5\u78ba\u4fdd\u96dc\u6e4a\u503c\u5728\u5408\u9069\u7684\u7bc4\u570d\u5167\u3002\u503c\u5f97\u601d\u8003\u7684\u662f\uff0c\u70ba\u4ec0\u9ebc\u8981\u5f37\u8abf\u5c0d\u8cea\u6578\u53d6\u6a21\uff0c\u6216\u8005\u8aaa\u5c0d\u5408\u6578\u53d6\u6a21\u7684\u5f0a\u7aef\u662f\u4ec0\u9ebc\uff1f\u9019\u662f\u4e00\u500b\u6709\u8da3\u7684\u554f\u984c\u3002

    \u5148\u4e1f\u64f2\u7d50\u8ad6\uff1a\u4f7f\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u53ef\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u5206\u4f48\u3002\u56e0\u70ba\u8cea\u6578\u4e0d\u8207\u5176\u4ed6\u6578\u5b57\u5b58\u5728\u516c\u7d04\u6578\uff0c\u53ef\u4ee5\u6e1b\u5c11\u56e0\u53d6\u6a21\u64cd\u4f5c\u800c\u7522\u751f\u7684\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u5f9e\u800c\u907f\u514d\u96dc\u6e4a\u885d\u7a81\u3002

    \u8209\u500b\u4f8b\u5b50\uff0c\u5047\u8a2d\u6211\u5011\u9078\u64c7\u5408\u6578 \\(9\\) \u4f5c\u70ba\u6a21\u6578\uff0c\u5b83\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\uff0c\u90a3\u9ebc\u6240\u6709\u53ef\u4ee5\u88ab \\(3\\) \u6574\u9664\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230 \\(0\\)\u3001\\(3\\)\u3001\\(6\\) \u9019\u4e09\u500b\u96dc\u6e4a\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\u8f38\u5165 key \u6070\u597d\u6eff\u8db3\u9019\u7a2e\u7b49\u5dee\u6578\u5217\u7684\u8cc7\u6599\u5206\u4f48\uff0c\u90a3\u9ebc\u96dc\u6e4a\u503c\u5c31\u6703\u51fa\u73fe\u805a\u5806\u7a4d\uff0c\u5f9e\u800c\u52a0\u91cd\u96dc\u6e4a\u885d\u7a81\u3002\u73fe\u5728\uff0c\u5047\u8a2d\u5c07 modulus \u66ff\u63db\u70ba\u8cea\u6578 \\(13\\) \uff0c\u7531\u65bc key \u548c modulus \u4e4b\u9593\u4e0d\u5b58\u5728\u516c\u7d04\u6578\uff0c\u56e0\u6b64\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u7684\u5747\u52fb\u6027\u6703\u660e\u986f\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\u8aaa\u660e\u7684\u662f\uff0c\u5982\u679c\u80fd\u5920\u4fdd\u8b49 key \u662f\u96a8\u6a5f\u5747\u52fb\u5206\u4f48\u7684\uff0c\u90a3\u9ebc\u9078\u64c7\u8cea\u6578\u6216\u8005\u5408\u6578\u4f5c\u70ba\u6a21\u6578\u90fd\u53ef\u4ee5\uff0c\u5b83\u5011\u90fd\u80fd\u8f38\u51fa\u5747\u52fb\u5206\u4f48\u7684\u96dc\u6e4a\u503c\u3002\u800c\u7576 key \u7684\u5206\u4f48\u5b58\u5728\u67d0\u7a2e\u9031\u671f\u6027\u6642\uff0c\u5c0d\u5408\u6578\u53d6\u6a21\u66f4\u5bb9\u6613\u51fa\u73fe\u805a\u96c6\u73fe\u8c61\u3002

    \u7e3d\u800c\u8a00\u4e4b\uff0c\u6211\u5011\u901a\u5e38\u9078\u53d6\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4e26\u4e14\u9019\u500b\u8cea\u6578\u6700\u597d\u8db3\u5920\u5927\uff0c\u4ee5\u5118\u53ef\u80fd\u6d88\u9664\u9031\u671f\u6027\u6a21\u5f0f\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002

    "},{"location":"chapter_hashing/hash_algorithm/#633","title":"6.3.3 \u00a0 \u5e38\u898b\u96dc\u6e4a\u6f14\u7b97\u6cd5","text":"

    \u4e0d\u96e3\u767c\u73fe\uff0c\u4ee5\u4e0a\u4ecb\u7d39\u7684\u7c21\u55ae\u96dc\u6e4a\u6f14\u7b97\u6cd5\u90fd\u6bd4\u8f03\u201c\u8106\u5f31\u201d\uff0c\u9060\u9060\u6c92\u6709\u9054\u5230\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u8a2d\u8a08\u76ee\u6a19\u3002\u4f8b\u5982\uff0c\u7531\u65bc\u52a0\u6cd5\u548c\u4e92\u65a5\u6216\u6eff\u8db3\u4ea4\u63db\u5f8b\uff0c\u56e0\u6b64\u52a0\u6cd5\u96dc\u6e4a\u548c\u4e92\u65a5\u6216\u96dc\u6e4a\u7121\u6cd5\u5340\u5206\u5167\u5bb9\u76f8\u540c\u4f46\u9806\u5e8f\u4e0d\u540c\u7684\u5b57\u4e32\uff0c\u9019\u53ef\u80fd\u6703\u52a0\u5287\u96dc\u6e4a\u885d\u7a81\uff0c\u4e26\u5f15\u8d77\u4e00\u4e9b\u5b89\u5168\u554f\u984c\u3002

    \u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u6703\u7528\u4e00\u4e9b\u6a19\u6e96\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982 MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002\u5b83\u5011\u53ef\u4ee5\u5c07\u4efb\u610f\u9577\u5ea6\u7684\u8f38\u5165\u8cc7\u6599\u5c0d\u6620\u5230\u6046\u5b9a\u9577\u5ea6\u7684\u96dc\u6e4a\u503c\u3002

    \u8fd1\u4e00\u500b\u4e16\u7d00\u4ee5\u4f86\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u8655\u5728\u4e0d\u65b7\u5347\u7d1a\u8207\u6700\u4f73\u5316\u7684\u904e\u7a0b\u4e2d\u3002\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u52aa\u529b\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u6548\u80fd\uff0c\u53e6\u4e00\u90e8\u5206\u7814\u7a76\u4eba\u54e1\u548c\u99ed\u5ba2\u5247\u81f4\u529b\u65bc\u5c0b\u627e\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u554f\u984c\u3002\u8868 6-2 \u5c55\u793a\u4e86\u5728\u5be6\u969b\u61c9\u7528\u4e2d\u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u3002

    • MD5 \u548c SHA-1 \u5df2\u591a\u6b21\u88ab\u6210\u529f\u653b\u64ca\uff0c\u56e0\u6b64\u5b83\u5011\u88ab\u5404\u985e\u5b89\u5168\u61c9\u7528\u68c4\u7528\u3002
    • SHA-2 \u7cfb\u5217\u4e2d\u7684 SHA-256 \u662f\u6700\u5b89\u5168\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u4e4b\u4e00\uff0c\u4ecd\u672a\u51fa\u73fe\u6210\u529f\u7684\u653b\u64ca\u6848\u4f8b\uff0c\u56e0\u6b64\u5e38\u7528\u5728\u5404\u985e\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u4e2d\u3002
    • SHA-3 \u76f8\u8f03 SHA-2 \u7684\u5be6\u73fe\u958b\u92b7\u66f4\u4f4e\u3001\u8a08\u7b97\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u76ee\u524d\u4f7f\u7528\u8986\u84cb\u5ea6\u4e0d\u5982 SHA-2 \u7cfb\u5217\u3002

    \u8868 6-2 \u00a0 \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5

    MD5 SHA-1 SHA-2 SHA-3 \u63a8\u51fa\u6642\u9593 1992 1995 2002 2008 \u8f38\u51fa\u9577\u5ea6 128 bit 160 bit 256/512 bit 224/256/384/512 bit \u96dc\u6e4a\u885d\u7a81 \u8f03\u591a \u8f03\u591a \u5f88\u5c11 \u5f88\u5c11 \u5b89\u5168\u7b49\u7d1a \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u4f4e\uff0c\u5df2\u88ab\u6210\u529f\u653b\u64ca \u9ad8 \u9ad8 \u61c9\u7528 \u5df2\u88ab\u68c4\u7528\uff0c\u4ecd\u7528\u65bc\u8cc7\u6599\u5b8c\u6574\u6027\u6aa2\u67e5 \u5df2\u88ab\u68c4\u7528 \u52a0\u5bc6\u8ca8\u5e63\u4ea4\u6613\u9a57\u8b49\u3001\u6578\u5b57\u7c3d\u540d\u7b49 \u53ef\u7528\u65bc\u66ff\u4ee3 SHA-2"},{"location":"chapter_hashing/hash_algorithm/#634","title":"6.3.4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u7684\u96dc\u6e4a\u503c","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u96dc\u6e4a\u8868\u7684 key \u53ef\u4ee5\u662f\u6574\u6578\u3001\u5c0f\u6578\u6216\u5b57\u4e32\u7b49\u8cc7\u6599\u578b\u5225\u3002\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u9019\u4e9b\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u4ee5 Python \u70ba\u4f8b\uff0c\u6211\u5011\u53ef\u4ee5\u547c\u53eb hash() \u51fd\u5f0f\u4f86\u8a08\u7b97\u5404\u7a2e\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u3002

    • \u6574\u6578\u548c\u5e03\u6797\u91cf\u7684\u96dc\u6e4a\u503c\u5c31\u662f\u5176\u672c\u8eab\u3002
    • \u6d6e\u9ede\u6578\u548c\u5b57\u4e32\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u8f03\u70ba\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u8acb\u81ea\u884c\u5b78\u7fd2\u3002
    • \u5143\u7d44\u7684\u96dc\u6e4a\u503c\u662f\u5c0d\u5176\u4e2d\u6bcf\u4e00\u500b\u5143\u7d20\u9032\u884c\u96dc\u6e4a\uff0c\u7136\u5f8c\u5c07\u9019\u4e9b\u96dc\u6e4a\u503c\u7d44\u5408\u8d77\u4f86\uff0c\u5f97\u5230\u55ae\u4e00\u7684\u96dc\u6e4a\u503c\u3002
    • \u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u57fa\u65bc\u5176\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u3002\u900f\u904e\u91cd\u5beb\u7269\u4ef6\u7684\u96dc\u6e4a\u65b9\u6cd5\uff0c\u53ef\u5be6\u73fe\u57fa\u65bc\u5167\u5bb9\u751f\u6210\u96dc\u6e4a\u503c\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u96dc\u6e4a\u503c\u8a08\u7b97\u51fd\u5f0f\u7684\u5b9a\u7fa9\u548c\u65b9\u6cd5\u4e0d\u540c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig built_in_hash.py
    num = 3\nhash_num = hash(num)\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbol = True\nhash_bol = hash(bol)\n# \u5e03\u6797\u91cf True \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndec = 3.14159\nhash_dec = hash(dec)\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 326484311674566659\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = hash(str)\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 4617003410720528961\n\ntup = (12836, \"\u5c0f\u54c8\")\nhash_tup = hash(tup)\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1029005403108185979\n\nobj = ListNode(0)\nhash_obj = hash(obj)\n# \u7bc0\u9ede\u7269\u4ef6 <ListNode object at 0x1058fd810> \u7684\u96dc\u6e4a\u503c\u70ba 274267521\n
    built_in_hash.cpp
    int num = 3;\nsize_t hashNum = hash<int>()(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nbool bol = true;\nsize_t hashBol = hash<bool>()(bol);\n// \u5e03\u6797\u91cf 1 \u7684\u96dc\u6e4a\u503c\u70ba 1\n\ndouble dec = 3.14159;\nsize_t hashDec = hash<double>()(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 4614256650576692846\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nsize_t hashStr = hash<string>()(str);\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 15466937326284535026\n\n// \u5728 C++ \u4e2d\uff0c\u5167\u5efa std:hash() \u50c5\u63d0\u4f9b\u57fa\u672c\u8cc7\u6599\u578b\u5225\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\n// \u9663\u5217\u3001\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u8a08\u7b97\u9700\u8981\u81ea\u884c\u5be6\u73fe\n
    built_in_hash.java
    int num = 3;\nint hashNum = Integer.hashCode(num);\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nboolean bol = true;\nint hashBol = Boolean.hashCode(bol);\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = Double.hashCode(dec);\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nObject[] arr = { 12836, \"\u5c0f\u54c8\" };\nint hashTup = Arrays.hashCode(arr);\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 1151158\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode();\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@7dc5e7b4 \u7684\u96dc\u6e4a\u503c\u70ba 2110121908\n
    built_in_hash.cs
    int num = 3;\nint hashNum = num.GetHashCode();\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3;\n\nbool bol = true;\nint hashBol = bol.GetHashCode();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1;\n\ndouble dec = 3.14159;\nint hashDec = dec.GetHashCode();\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729;\n\nstring str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.GetHashCode();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -586107568;\n\nobject[] arr = [12836, \"\u5c0f\u54c8\"];\nint hashTup = arr.GetHashCode();\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 42931033;\n\nListNode obj = new(0);\nint hashObj = obj.GetHashCode();\n// \u7bc0\u9ede\u7269\u4ef6 0 \u7684\u96dc\u6e4a\u503c\u70ba 39053774;\n
    built_in_hash.go
    // Go \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.swift
    let num = 3\nlet hashNum = num.hashValue\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 9047044699613009734\n\nlet bol = true\nlet hashBol = bol.hashValue\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -4431640247352757451\n\nlet dec = 3.14159\nlet hashDec = dec.hashValue\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -2465384235396674631\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\"\nlet hashStr = str.hashValue\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -7850626797806988787\n\nlet arr = [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")]\nlet hashTup = arr.hashValue\n// \u9663\u5217 [AnyHashable(12836), AnyHashable(\"\u5c0f\u54c8\")] \u7684\u96dc\u6e4a\u503c\u70ba -2308633508154532996\n\nlet obj = ListNode(x: 0)\nlet hashObj = obj.hashValue\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode \u7684\u96dc\u6e4a\u503c\u70ba -2434780518035996159\n
    built_in_hash.js
    // JavaScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.ts
    // TypeScript \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.dart
    int num = 3;\nint hashNum = num.hashCode;\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 34803\n\nbool bol = true;\nint hashBol = bol.hashCode;\n// \u5e03\u6797\u503c true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\ndouble dec = 3.14159;\nint hashDec = dec.hashCode;\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2570631074981783\n\nString str = \"Hello \u6f14\u7b97\u6cd5\";\nint hashStr = str.hashCode;\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 468167534\n\nList arr = [12836, \"\u5c0f\u54c8\"];\nint hashArr = arr.hashCode;\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 976512528\n\nListNode obj = new ListNode(0);\nint hashObj = obj.hashCode;\n// \u7bc0\u9ede\u7269\u4ef6 Instance of 'ListNode' \u7684\u96dc\u6e4a\u503c\u70ba 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\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 568126464209439262\n\nlet bol = true;\nlet mut bol_hasher = DefaultHasher::new();\nbol.hash(&mut bol_hasher);\nlet hash_bol = bol_hasher.finish();\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 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\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba 2566941990314602357\n\nlet str = \"Hello \u6f14\u7b97\u6cd5\";\nlet mut str_hasher = DefaultHasher::new();\nstr.hash(&mut str_hasher);\nlet hash_str = str_hasher.finish();\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba 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\u7d44 (12836, \"\u5c0f\u54c8\") \u7684\u96dc\u6e4a\u503c\u70ba 1885128010422702749\n\nlet node = ListNode::new(42);\nlet mut hasher = DefaultHasher::new();\nnode.borrow().val.hash(&mut hasher);\nlet hash = hasher.finish();\n// \u7bc0\u9ede\u7269\u4ef6 RefCell { value: ListNode { val: 42, next: None } } \u7684\u96dc\u6e4a\u503c\u70ba15387811073369036852\n
    built_in_hash.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa hash code \u51fd\u5f0f\n
    built_in_hash.kt
    val num = 3\nval hashNum = num.hashCode()\n// \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba 3\n\nval bol = true\nval hashBol = bol.hashCode()\n// \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba 1231\n\nval dec = 3.14159\nval hashDec = dec.hashCode()\n// \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1340954729\n\nval str = \"Hello \u6f14\u7b97\u6cd5\"\nval hashStr = str.hashCode()\n// \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -727081396\n\nval arr = arrayOf<Any>(12836, \"\u5c0f\u54c8\")\nval hashTup = arr.hashCode()\n// \u9663\u5217 [12836, \u5c0f\u54c8] \u7684\u96dc\u6e4a\u503c\u70ba 189568618\n\nval obj = ListNode(0)\nval hashObj = obj.hashCode()\n// \u7bc0\u9ede\u7269\u4ef6 utils.ListNode@1d81eb93 \u7684\u96dc\u6e4a\u503c\u70ba 495053715\n
    built_in_hash.rb
    num = 3\nhash_num = num.hash\n# \u6574\u6578 3 \u7684\u96dc\u6e4a\u503c\u70ba -4385856518450339636\n\nbol = true\nhash_bol = bol.hash\n# \u5e03\u6797\u91cf true \u7684\u96dc\u6e4a\u503c\u70ba -1617938112149317027\n\ndec = 3.14159\nhash_dec = dec.hash\n# \u5c0f\u6578 3.14159 \u7684\u96dc\u6e4a\u503c\u70ba -1479186995943067893\n\nstr = \"Hello \u6f14\u7b97\u6cd5\"\nhash_str = str.hash\n# \u5b57\u4e32\u201cHello \u6f14\u7b97\u6cd5\u201d\u7684\u96dc\u6e4a\u503c\u70ba -4075943250025831763\n\ntup = [12836, '\u5c0f\u54c8']\nhash_tup = tup.hash\n# \u5143\u7d44 (12836, '\u5c0f\u54c8') \u7684\u96dc\u6e4a\u503c\u70ba 1999544809202288822\n\nobj = ListNode.new(0)\nhash_obj = obj.hash\n# \u7bc0\u9ede\u7269\u4ef6 #<ListNode:0x000078133140ab70> \u7684\u96dc\u6e4a\u503c\u70ba 4302940560806366381\n
    built_in_hash.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5728\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u624d\u53ef\u4f5c\u70ba\u96dc\u6e4a\u8868\u7684 key \u3002\u5047\u5982\u6211\u5011\u5c07\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4f5c\u70ba key \uff0c\u7576\u4e32\u5217\u7684\u5167\u5bb9\u767c\u751f\u8b8a\u5316\u6642\uff0c\u5b83\u7684\u96dc\u6e4a\u503c\u4e5f\u96a8\u4e4b\u6539\u8b8a\uff0c\u6211\u5011\u5c31\u7121\u6cd5\u5728\u96dc\u6e4a\u8868\u4e2d\u67e5\u8a62\u5230\u539f\u5148\u7684 value \u4e86\u3002

    \u96d6\u7136\u81ea\u5b9a\u7fa9\u7269\u4ef6\uff08\u6bd4\u5982\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff09\u7684\u6210\u54e1\u8b8a\u6578\u662f\u53ef\u8b8a\u7684\uff0c\u4f46\u5b83\u662f\u53ef\u96dc\u6e4a\u7684\u3002\u9019\u662f\u56e0\u70ba\u7269\u4ef6\u7684\u96dc\u6e4a\u503c\u901a\u5e38\u662f\u57fa\u65bc\u8a18\u61b6\u9ad4\u4f4d\u5740\u751f\u6210\u7684\uff0c\u5373\u4f7f\u7269\u4ef6\u7684\u5167\u5bb9\u767c\u751f\u4e86\u8b8a\u5316\uff0c\u4f46\u5b83\u7684\u8a18\u61b6\u9ad4\u4f4d\u5740\u4e0d\u8b8a\uff0c\u96dc\u6e4a\u503c\u4ecd\u7136\u662f\u4e0d\u8b8a\u7684\u3002

    \u7d30\u5fc3\u7684\u4f60\u53ef\u80fd\u767c\u73fe\u5728\u4e0d\u540c\u63a7\u5236\u6aaf\u4e2d\u57f7\u884c\u7a0b\u5f0f\u6642\uff0c\u8f38\u51fa\u7684\u96dc\u6e4a\u503c\u662f\u4e0d\u540c\u7684\u3002\u9019\u662f\u56e0\u70ba Python \u76f4\u8b6f\u5668\u5728\u6bcf\u6b21\u555f\u52d5\u6642\uff0c\u90fd\u6703\u70ba\u5b57\u4e32\u96dc\u6e4a\u51fd\u5f0f\u52a0\u5165\u4e00\u500b\u96a8\u6a5f\u7684\u9e7d\uff08salt\uff09\u503c\u3002\u9019\u7a2e\u505a\u6cd5\u53ef\u4ee5\u6709\u6548\u9632\u6b62 HashDoS \u653b\u64ca\uff0c\u63d0\u5347\u96dc\u6e4a\u6f14\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002

    "},{"location":"chapter_hashing/hash_collision/","title":"6.2 \u00a0 \u96dc\u6e4a\u885d\u7a81","text":"

    \u4e0a\u4e00\u7bc0\u63d0\u5230\uff0c\u901a\u5e38\u60c5\u6cc1\u4e0b\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u5165\u7a7a\u9593\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff0c\u56e0\u6b64\u7406\u8ad6\u4e0a\u96dc\u6e4a\u885d\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002\u6bd4\u5982\uff0c\u8f38\u5165\u7a7a\u9593\u70ba\u5168\u9ad4\u6574\u6578\uff0c\u8f38\u51fa\u7a7a\u9593\u70ba\u9663\u5217\u5bb9\u91cf\u5927\u5c0f\uff0c\u5247\u5fc5\u7136\u6709\u591a\u500b\u6574\u6578\u5c0d\u6620\u81f3\u540c\u4e00\u6876\u7d22\u5f15\u3002

    \u96dc\u6e4a\u885d\u7a81\u6703\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u932f\u8aa4\uff0c\u56b4\u91cd\u5f71\u97ff\u96dc\u6e4a\u8868\u7684\u53ef\u7528\u6027\u3002\u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6bcf\u7576\u9047\u5230\u96dc\u6e4a\u885d\u7a81\u6642\uff0c\u6211\u5011\u5c31\u9032\u884c\u96dc\u6e4a\u8868\u64f4\u5bb9\uff0c\u76f4\u81f3\u885d\u7a81\u6d88\u5931\u70ba\u6b62\u3002\u6b64\u65b9\u6cd5\u7c21\u55ae\u7c97\u66b4\u4e14\u6709\u6548\uff0c\u4f46\u6548\u7387\u592a\u4f4e\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u8981\u9032\u884c\u5927\u91cf\u7684\u8cc7\u6599\u642c\u904b\u8207\u96dc\u6e4a\u503c\u8a08\u7b97\u3002\u70ba\u4e86\u63d0\u5347\u6548\u7387\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u7b56\u7565\u3002

    1. \u6539\u826f\u96dc\u6e4a\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u4f7f\u5f97\u96dc\u6e4a\u8868\u53ef\u4ee5\u5728\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u6642\u6b63\u5e38\u5de5\u4f5c\u3002
    2. \u50c5\u5728\u5fc5\u8981\u6642\uff0c\u5373\u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u624d\u57f7\u884c\u64f4\u5bb9\u64cd\u4f5c\u3002

    \u96dc\u6e4a\u8868\u7684\u7d50\u69cb\u6539\u826f\u65b9\u6cd5\u4e3b\u8981\u5305\u62ec\u201c\u93c8\u5f0f\u4f4d\u5740\u201d\u548c\u201c\u958b\u653e\u5b9a\u5740\u201d\u3002

    "},{"location":"chapter_hashing/hash_collision/#621","title":"6.2.1 \u00a0 \u93c8\u5f0f\u4f4d\u5740","text":"

    \u5728\u539f\u59cb\u96dc\u6e4a\u8868\u4e2d\uff0c\u6bcf\u500b\u6876\u50c5\u80fd\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u93c8\u5f0f\u4f4d\u5740\uff08separate chaining\uff09\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u63db\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u9375\u503c\u5c0d\u4f5c\u70ba\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\uff0c\u5c07\u6240\u6709\u767c\u751f\u885d\u7a81\u7684\u9375\u503c\u5c0d\u90fd\u5132\u5b58\u5728\u540c\u4e00\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u5716 6-5 \u5c55\u793a\u4e86\u4e00\u500b\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u4f8b\u5b50\u3002

    \u5716 6-5 \u00a0 \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868

    \u57fa\u65bc\u93c8\u5f0f\u4f4d\u5740\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\u7684\u64cd\u4f5c\u65b9\u6cd5\u767c\u751f\u4e86\u4ee5\u4e0b\u8b8a\u5316\u3002

    • \u67e5\u8a62\u5143\u7d20\uff1a\u8f38\u5165 key \uff0c\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u6876\u7d22\u5f15\uff0c\u5373\u53ef\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4e26\u5c0d\u6bd4 key \u4ee5\u67e5\u8a62\u76ee\u6a19\u9375\u503c\u5c0d\u3002
    • \u65b0\u589e\u5143\u7d20\uff1a\u9996\u5148\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u7bc0\u9ede\uff0c\u7136\u5f8c\u5c07\u7bc0\u9ede\uff08\u9375\u503c\u5c0d\uff09\u65b0\u589e\u5230\u93c8\u7d50\u4e32\u5217\u4e2d\u3002
    • \u522a\u9664\u5143\u7d20\uff1a\u6839\u64da\u96dc\u6e4a\u51fd\u5f0f\u7684\u7d50\u679c\u8a2a\u554f\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u63a5\u8457\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4ee5\u67e5\u8a62\u76ee\u6a19\u7bc0\u9ede\u4e26\u5c07\u5176\u522a\u9664\u3002

    \u93c8\u5f0f\u4f4d\u5740\u5b58\u5728\u4ee5\u4e0b\u4fb7\u9650\u6027\u3002

    • \u4f54\u7528\u7a7a\u9593\u589e\u5927\uff1a\u93c8\u7d50\u4e32\u5217\u5305\u542b\u7bc0\u9ede\u6307\u6a19\uff0c\u5b83\u76f8\u6bd4\u9663\u5217\u66f4\u52a0\u8017\u8cbb\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u67e5\u8a62\u6548\u7387\u964d\u4f4e\uff1a\u56e0\u70ba\u9700\u8981\u7dda\u6027\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u4f86\u67e5\u8a62\u5c0d\u61c9\u5143\u7d20\u3002

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u7d66\u51fa\u4e86\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\u7684\u7c21\u55ae\u5be6\u73fe\uff0c\u9700\u8981\u6ce8\u610f\u5169\u9ede\u3002

    • \u4f7f\u7528\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\u4ee3\u66ff\u93c8\u7d50\u4e32\u5217\uff0c\u5f9e\u800c\u7c21\u5316\u7a0b\u5f0f\u78bc\u3002\u5728\u9019\u7a2e\u8a2d\u5b9a\u4e0b\uff0c\u96dc\u6e4a\u8868\uff08\u9663\u5217\uff09\u5305\u542b\u591a\u500b\u6876\uff0c\u6bcf\u500b\u6876\u90fd\u662f\u4e00\u500b\u4e32\u5217\u3002
    • \u4ee5\u4e0b\u5be6\u73fe\u5305\u542b\u96dc\u6e4a\u8868\u64f4\u5bb9\u65b9\u6cd5\u3002\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(\\frac{2}{3}\\) \u6642\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_chaining.py
    class HashMapChaining:\n    \"\"\"\u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets = [[] for _ in range(self.capacity)]  # \u6876\u9663\u5217\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def get(self, key: int) -> str | None:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket:\n            if pair.key == key:\n                return pair.val\n        # \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket:\n            if pair.key == key:\n                pair.val = val\n                return\n        # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        pair = Pair(key, val)\n        bucket.append(pair)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index = self.hash_func(key)\n        bucket = self.buckets[index]\n        # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [[] for _ in range(self.capacity)]\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets:\n            for pair in bucket:\n                self.put(pair.key, pair.val)\n\n    def print(self):\n        \"\"\"\u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  private:\n    int size;                       // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;                   // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres;               // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;                // \u64f4\u5bb9\u500d\u6578\n    vector<vector<Pair *>> buckets; // \u6876\u9663\u5217\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapChaining() : size(0), capacity(4), loadThres(2.0 / 3.0), extendRatio(2) {\n        buckets.resize(capacity);\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~HashMapChaining() {\n        for (auto &bucket : buckets) {\n            for (Pair *pair : bucket) {\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / (double)capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair *pair : buckets[index]) {\n            if (pair->key == key) {\n                pair->val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].push_back(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        auto &bucket = buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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); // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n                delete tmp;                       // \u91cb\u653e\u8a18\u61b6\u9ad4\n                size--;\n                return;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<vector<Pair *>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets.clear();\n        buckets.resize(capacity);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (auto &bucket : bucketsTmp) {\n            for (Pair *pair : bucket) {\n                put(pair->key, pair->val);\n                // \u91cb\u653e\u8a18\u61b6\u9ad4\n                delete pair;\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    String get(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                return pair.val;\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        Pair pair = new Pair(key, val);\n        bucket.add(pair);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        List<Pair> bucket = buckets.get(index);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (Pair pair : bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair);\n                size--;\n                break;\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (List<Pair> bucket : bucketsTmp) {\n            for (Pair pair : bucket) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio; // \u64f4\u5bb9\u500d\u6578\n    List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        foreach (Pair pair in buckets[index]) {\n            if (pair.key == key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        buckets[index].Add(new Pair(key, val));\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        List<List<Pair>> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntype hashMapChaining struct {\n    size        int      // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int      // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64  // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int      // \u64f4\u5bb9\u500d\u6578\n    buckets     [][]pair // \u6876\u9663\u5217\n}\n\n/* \u5efa\u69cb\u5b50 */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (m *hashMapChaining) hashFunc(key int) int {\n    return key % m.capacity\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (m *hashMapChaining) loadFactor() float64 {\n    return float64(m.size) / float64(m.capacity)\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (m *hashMapChaining) get(key int) string {\n    idx := m.hashFunc(key)\n    bucket := m.buckets[idx]\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for _, p := range bucket {\n        if p.key == key {\n            return p.val\n        }\n    }\n    // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (m *hashMapChaining) put(key int, val string) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if m.loadFactor() > m.loadThres {\n        m.extend()\n    }\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\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/* \u522a\u9664\u64cd\u4f5c */\nfunc (m *hashMapChaining) remove(key int) {\n    idx := m.hashFunc(key)\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for i, p := range m.buckets[idx] {\n        if p.key == key {\n            // \u5207\u7247\u522a\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (m *hashMapChaining) extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\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\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for _, bucket := range tmpBuckets {\n        for _, p := range bucket {\n            m.put(p.key, p.val)\n        }\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [[Pair]] // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for pair in bucket {\n            if pair.key == key {\n                return pair.val\n            }\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de nil\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for pair in bucket {\n            if pair.key == key {\n                pair.val = val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair(key: key, val: val)\n        buckets[index].append(pair)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        let bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: [], count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in bucketsTmp {\n            for pair in bucket {\n                put(key: pair.key, val: pair.val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    #size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    #buckets: Pair[][]; // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key: number): number {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor(): number {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        const index = this.#hashFunc(key);\n        const bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (const pair of bucket) {\n            if (pair.key === key) {\n                pair.val = val;\n                return;\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        const pair = new Pair(key, val);\n        bucket.push(pair);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        const index = this.#hashFunc(key);\n        let bucket = this.#buckets[index];\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = new Array(this.#capacity).fill(null).map((x) => []);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n  late int size; // \u9375\u503c\u5c0d\u6578\u91cf\n  late int capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  late double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  late int extendRatio; // \u64f4\u5bb9\u500d\u6578\n  late List<List<Pair>> buckets; // \u6876\u9663\u5217\n\n  /* \u5efa\u69cb\u5b50 */\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  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return size / capacity;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > loadThres) {\n      extend();\n    }\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        pair.val = val;\n        return;\n      }\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    Pair pair = Pair(key, val);\n    bucket.add(pair);\n    size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    int index = hashFunc(key);\n    List<Pair> bucket = buckets[index];\n    // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n    for (Pair pair in bucket) {\n      if (pair.key == key) {\n        bucket.remove(pair);\n        size--;\n        break;\n      }\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<List<Pair>> bucketsTmp = buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    capacity *= extendRatio;\n    buckets = List.generate(capacity, (_) => []);\n    size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\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    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % self.capacity as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f32 {\n        self.size as f32 / self.capacity as f32\n    }\n\n    /* \u522a\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        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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\u5247\u8fd4\u56de None\n        None\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = std::mem::replace(&mut self.buckets, vec![]);\n\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![Vec::new(); self.capacity as usize];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for bucket in buckets_tmp {\n            for pair in bucket {\n                self.put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\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        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        let pair = Pair { key, val };\n        bucket.push(pair);\n        self.size += 1;\n    }\n\n    /* \u67e5\u8a62\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        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de None\n        None\n    }\n}\n
    hash_map_chaining.c
    /* \u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct Node {\n    Pair *pair;\n    struct Node *next;\n} Node;\n\n/* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Node **buckets;   // \u6876\u9663\u5217\n} HashMapChaining;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapChaining *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapChaining *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapChaining *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapChaining *hashMap, int key, const char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    int index = hashFunc(hashMap, key);\n    // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\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\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n            return;\n        }\n        cur = cur->next;\n    }\n    // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapChaining *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    int oldCapacity = hashMap->capacity;\n    Node **oldBuckets = hashMap->buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\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    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(temp->pair);\n            free(temp);\n        }\n    }\n\n    free(oldBuckets);\n}\n\n/* \u522a\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            // \u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n            if (pre) {\n                pre->next = cur->next;\n            } else {\n                hashMap->buckets[index] = cur->next;\n            }\n            // \u91cb\u653e\u8a18\u61b6\u9ad4\n            free(cur->pair);\n            free(cur);\n            hashMap->size--;\n            return;\n        }\n        pre = cur;\n        cur = cur->next;\n    }\n}\n\n/* \u5217\u5370\u96dc\u6e4a\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
    /* \u93c8\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 */\nclass HashMapChaining {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    val loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    val extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: MutableList<MutableList<Pair>> // \u6876\u9663\u5217\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        for (pair in bucket) {\n            if (pair.key == key) return pair._val\n        }\n        // \u82e5\u672a\u627e\u5230 key \uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n        for (pair in bucket) {\n            if (pair.key == key) {\n                pair._val = _val\n                return\n            }\n        }\n        // \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n        val pair = Pair(key, _val)\n        bucket.add(pair)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        val bucket = buckets[index]\n        // \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\n        for (pair in bucket) {\n            if (pair.key == key) {\n                bucket.remove(pair)\n                size--\n                break\n            }\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        // mutablelist \u7121\u56fa\u5b9a\u5927\u5c0f\n        buckets = mutableListOf()\n        for (i in 0..<capacity) {\n            buckets.add(mutableListOf())\n        }\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (bucket in bucketsTmp) {\n            for (pair in bucket) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u9375\u5f0f\u4f4d\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapChaining\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) { [] } # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u627e\u5230 key \uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    for pair in bucket\n      return pair.val if pair.key == key\n    end\n    # \u82e5\u672a\u627e\u5230 key , \u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u82e5\u9047\u5230\u6307\u5b9a key \uff0c\u5247\u66f4\u65b0\u5c0d\u61c9 val \u4e26\u8fd4\u56de\n    for pair in bucket\n      if pair.key == key\n        pair.val = val\n        return\n      end\n    end\n    # \u82e5\u7121\u8a72 key \uff0c\u5247\u5c07\u9375\u503c\u5c0d\u65b0\u589e\u81f3\u5c3e\u90e8\n    pair = Pair.new(key, val)\n    bucket << pair\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    bucket = @buckets[index]\n    # \u8d70\u8a2a\u6876\uff0c\u5f9e\u4e2d\u522a\u9664\u9375\u503c\u5c0d\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  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity) { [] }\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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  ### \u5217\u5370\u96dc\u6e4a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7576\u93c8\u7d50\u4e32\u5217\u5f88\u9577\u6642\uff0c\u67e5\u8a62\u6548\u7387 \\(O(n)\\) \u5f88\u5dee\u3002\u6b64\u6642\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u201cAVL \u6a39\u201d\u6216\u201c\u7d05\u9ed1\u6a39\u201d\uff0c\u5f9e\u800c\u5c07\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002

    "},{"location":"chapter_hashing/hash_collision/#622","title":"6.2.2 \u00a0 \u958b\u653e\u5b9a\u5740","text":"

    \u958b\u653e\u5b9a\u5740\uff08open addressing\uff09\u4e0d\u5f15\u5165\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u800c\u662f\u900f\u904e\u201c\u591a\u6b21\u63a2\u6e2c\u201d\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\uff0c\u63a2\u6e2c\u65b9\u5f0f\u4e3b\u8981\u5305\u62ec\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\u7b49\u3002

    \u4e0b\u9762\u4ee5\u7dda\u6027\u63a2\u67e5\u70ba\u4f8b\uff0c\u4ecb\u7d39\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u7684\u5de5\u4f5c\u6a5f\u5236\u3002

    "},{"location":"chapter_hashing/hash_collision/#1","title":"1. \u00a0 \u7dda\u6027\u63a2\u67e5","text":"

    \u7dda\u6027\u63a2\u67e5\u63a1\u7528\u56fa\u5b9a\u6b65\u9577\u7684\u7dda\u6027\u641c\u5c0b\u4f86\u9032\u884c\u63a2\u6e2c\uff0c\u5176\u64cd\u4f5c\u65b9\u6cd5\u8207\u666e\u901a\u96dc\u6e4a\u8868\u6709\u6240\u4e0d\u540c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u82e5\u767c\u73fe\u6876\u5167\u5df2\u6709\u5143\u7d20\uff0c\u5247\u5f9e\u885d\u7a81\u4f4d\u7f6e\u5411\u5f8c\u7dda\u6027\u8d70\u8a2a\uff08\u6b65\u9577\u901a\u5e38\u70ba \\(1\\) \uff09\uff0c\u76f4\u81f3\u627e\u5230\u7a7a\u6876\uff0c\u5c07\u5143\u7d20\u63d2\u5165\u5176\u4e2d\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u82e5\u767c\u73fe\u96dc\u6e4a\u885d\u7a81\uff0c\u5247\u4f7f\u7528\u76f8\u540c\u6b65\u9577\u5411\u5f8c\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u76f4\u5230\u627e\u5230\u5c0d\u61c9\u5143\u7d20\uff0c\u8fd4\u56de value \u5373\u53ef\uff1b\u5982\u679c\u9047\u5230\u7a7a\u6876\uff0c\u8aaa\u660e\u76ee\u6a19\u5143\u7d20\u4e0d\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8fd4\u56de None \u3002

    \u5716 6-6 \u5c55\u793a\u4e86\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48\u3002\u6839\u64da\u6b64\u96dc\u6e4a\u51fd\u5f0f\uff0c\u6700\u5f8c\u5169\u4f4d\u76f8\u540c\u7684 key \u90fd\u6703\u88ab\u5c0d\u6620\u5230\u76f8\u540c\u7684\u6876\u3002\u800c\u900f\u904e\u7dda\u6027\u63a2\u67e5\uff0c\u5b83\u5011\u88ab\u4f9d\u6b21\u5132\u5b58\u5728\u8a72\u6876\u4ee5\u53ca\u4e4b\u4e0b\u7684\u6876\u4e2d\u3002

    \u5716 6-6 \u00a0 \u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u7684\u9375\u503c\u5c0d\u5206\u4f48

    \u7136\u800c\uff0c\u7dda\u6027\u63a2\u67e5\u5bb9\u6613\u7522\u751f\u201c\u805a\u96c6\u73fe\u8c61\u201d\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u9663\u5217\u4e2d\u9023\u7e8c\u88ab\u4f54\u7528\u7684\u4f4d\u7f6e\u8d8a\u9577\uff0c\u9019\u4e9b\u9023\u7e8c\u4f4d\u7f6e\u767c\u751f\u96dc\u6e4a\u885d\u7a81\u7684\u53ef\u80fd\u6027\u8d8a\u5927\uff0c\u5f9e\u800c\u9032\u4e00\u6b65\u4fc3\u4f7f\u8a72\u4f4d\u7f6e\u7684\u805a\u5806\u7a4d\u751f\u9577\uff0c\u5f62\u6210\u60e1\u6027\u8ff4\u5708\uff0c\u6700\u7d42\u5c0e\u81f4\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u6548\u7387\u52a3\u5316\u3002

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u5011\u4e0d\u80fd\u5728\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\u4e2d\u76f4\u63a5\u522a\u9664\u5143\u7d20\u3002\u9019\u662f\u56e0\u70ba\u522a\u9664\u5143\u7d20\u6703\u5728\u9663\u5217\u5167\u7522\u751f\u4e00\u500b\u7a7a\u6876 None \uff0c\u800c\u7576\u67e5\u8a62\u5143\u7d20\u6642\uff0c\u7dda\u6027\u63a2\u67e5\u5230\u8a72\u7a7a\u6876\u5c31\u6703\u8fd4\u56de\uff0c\u56e0\u6b64\u5728\u8a72\u7a7a\u6876\u4e4b\u4e0b\u7684\u5143\u7d20\u90fd\u7121\u6cd5\u518d\u88ab\u8a2a\u554f\u5230\uff0c\u7a0b\u5f0f\u53ef\u80fd\u8aa4\u5224\u9019\u4e9b\u5143\u7d20\u4e0d\u5b58\u5728\uff0c\u5982\u5716 6-7 \u6240\u793a\u3002

    \u5716 6-7 \u00a0 \u5728\u958b\u653e\u5b9a\u5740\u4e2d\u522a\u9664\u5143\u7d20\u5c0e\u81f4\u7684\u67e5\u8a62\u554f\u984c

    \u70ba\u4e86\u89e3\u6c7a\u8a72\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u61f6\u522a\u9664\uff08lazy deletion\uff09\u6a5f\u5236\uff1a\u5b83\u4e0d\u76f4\u63a5\u5f9e\u96dc\u6e4a\u8868\u4e2d\u79fb\u9664\u5143\u7d20\uff0c\u800c\u662f\u5229\u7528\u4e00\u500b\u5e38\u6578 TOMBSTONE \u4f86\u6a19\u8a18\u9019\u500b\u6876\u3002\u5728\u8a72\u6a5f\u5236\u4e0b\uff0cNone \u548c TOMBSTONE \u90fd\u4ee3\u8868\u7a7a\u6876\uff0c\u90fd\u53ef\u4ee5\u653e\u7f6e\u9375\u503c\u5c0d\u3002\u4f46\u4e0d\u540c\u7684\u662f\uff0c\u7dda\u6027\u63a2\u67e5\u5230 TOMBSTONE \u6642\u61c9\u8a72\u7e7c\u7e8c\u8d70\u8a2a\uff0c\u56e0\u70ba\u5176\u4e4b\u4e0b\u53ef\u80fd\u9084\u5b58\u5728\u9375\u503c\u5c0d\u3002

    \u7136\u800c\uff0c\u61f6\u522a\u9664\u53ef\u80fd\u6703\u52a0\u901f\u96dc\u6e4a\u8868\u7684\u6548\u80fd\u9000\u5316\u3002\u9019\u662f\u56e0\u70ba\u6bcf\u6b21\u522a\u9664\u64cd\u4f5c\u90fd\u6703\u7522\u751f\u4e00\u500b\u522a\u9664\u6a19\u8a18\uff0c\u96a8\u8457 TOMBSTONE \u7684\u589e\u52a0\uff0c\u641c\u5c0b\u6642\u9593\u4e5f\u6703\u589e\u52a0\uff0c\u56e0\u70ba\u7dda\u6027\u63a2\u67e5\u53ef\u80fd\u9700\u8981\u8df3\u904e\u591a\u500b TOMBSTONE \u624d\u80fd\u627e\u5230\u76ee\u6a19\u5143\u7d20\u3002

    \u70ba\u6b64\uff0c\u8003\u616e\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\u8a18\u9304\u9047\u5230\u7684\u9996\u500b TOMBSTONE \u7684\u7d22\u5f15\uff0c\u4e26\u5c07\u641c\u5c0b\u5230\u7684\u76ee\u6a19\u5143\u7d20\u8207\u8a72 TOMBSTONE \u4ea4\u63db\u4f4d\u7f6e\u3002\u9019\u6a23\u505a\u7684\u597d\u8655\u662f\u7576\u6bcf\u6b21\u67e5\u8a62\u6216\u65b0\u589e\u5143\u7d20\u6642\uff0c\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u81f3\u8ddd\u96e2\u7406\u60f3\u4f4d\u7f6e\uff08\u63a2\u6e2c\u8d77\u59cb\u9ede\uff09\u66f4\u8fd1\u7684\u6876\uff0c\u5f9e\u800c\u6700\u4f73\u5316\u67e5\u8a62\u6548\u7387\u3002

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u5305\u542b\u61f6\u522a\u9664\u7684\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\uff09\u96dc\u6e4a\u8868\u3002\u70ba\u4e86\u66f4\u52a0\u5145\u5206\u5730\u4f7f\u7528\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\uff0c\u6211\u5011\u5c07\u96dc\u6e4a\u8868\u770b\u4f5c\u4e00\u500b\u201c\u74b0\u5f62\u9663\u5217\u201d\uff0c\u7576\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map_open_addressing.py
    class HashMapOpenAddressing:\n    \"\"\"\u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.size = 0  # \u9375\u503c\u5c0d\u6578\u91cf\n        self.capacity = 4  # \u96dc\u6e4a\u8868\u5bb9\u91cf\n        self.load_thres = 2.0 / 3.0  # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        self.extend_ratio = 2  # \u64f4\u5bb9\u500d\u6578\n        self.buckets: list[Pair | None] = [None] * self.capacity  # \u6876\u9663\u5217\n        self.TOMBSTONE = Pair(-1, \"-1\")  # \u522a\u9664\u6a19\u8a18\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        return key % self.capacity\n\n    def load_factor(self) -> float:\n        \"\"\"\u8ca0\u8f09\u56e0\u5b50\"\"\"\n        return self.size / self.capacity\n\n    def find_bucket(self, key: int) -> int:\n        \"\"\"\u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\"\"\"\n        index = self.hash_func(key)\n        first_tombstone = -1\n        # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index] is not None:\n            # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].key == key:\n                # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\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\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                return index  # \u8fd4\u56de\u6876\u7d22\u5f15\n            # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 and self.buckets[index] is self.TOMBSTONE:\n                first_tombstone = index\n            # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity\n        # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return index if first_tombstone == -1 else first_tombstone\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            return self.buckets[index].val\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de None\n        return None\n\n    def put(self, key: int, val: str):\n        \"\"\"\u65b0\u589e\u64cd\u4f5c\"\"\"\n        # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres:\n            self.extend()\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if self.buckets[index] not in [None, self.TOMBSTONE]:\n            self.buckets[index].val = val\n            return\n        # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Pair(key, val)\n        self.size += 1\n\n    def remove(self, key: int):\n        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        index = self.find_bucket(key)\n        # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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        \"\"\"\u64f4\u5bb9\u96dc\u6e4a\u8868\"\"\"\n        # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        buckets_tmp = self.buckets\n        # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio\n        self.buckets = [None] * self.capacity\n        self.size = 0\n        # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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        \"\"\"\u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  private:\n    int size;                             // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4;                     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    const double loadThres = 2.0 / 3.0;     // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    const int extendRatio = 2;            // \u64f4\u5bb9\u500d\u6578\n    vector<Pair *> buckets;               // \u6876\u9663\u5217\n    Pair *TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    HashMapOpenAddressing() : size(0), buckets(capacity, nullptr) {\n    }\n\n    /* \u6790\u69cb\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double loadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != nullptr) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]->key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    string get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            return buckets[index]->val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n        return \"\";\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    void put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            buckets[index]->val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != nullptr && buckets[index] != TOMBSTONE) {\n            delete buckets[index];\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        vector<Pair *> bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = vector<Pair *>(capacity, nullptr);\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    private int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private final double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private final int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    private Pair[] buckets; // \u6876\u9663\u5217\n    private final Pair TOMBSTONE = new Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private double loadFactor() {\n        return (double) size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private int findBucket(int key) {\n        int index = hashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public String get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void put(int key, String val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private void extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (Pair pair : bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    int size; // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n    Pair[] buckets; // \u6876\u9663\u5217\n    Pair TOMBSTONE = new(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    public HashMapOpenAddressing() {\n        size = 0;\n        buckets = new Pair[capacity];\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        return key % capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    double LoadFactor() {\n        return (double)size / capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    int FindBucket(int key) {\n        int index = HashFunc(key);\n        int firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index].key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index];\n                    buckets[index] = TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    public string? Get(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    public void Put(int key, string val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (LoadFactor() > loadThres) {\n            Extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index].val = val;\n            return;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = new Pair(key, val);\n        size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        int index = FindBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE;\n            size--;\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    void Extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        Pair[] bucketsTmp = buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio;\n        buckets = new Pair[capacity];\n        size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        foreach (Pair pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                Put(pair.key, pair.val);\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntype hashMapOpenAddressing struct {\n    size        int     // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity    int     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    loadThres   float64 // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extendRatio int     // \u64f4\u5bb9\u500d\u6578\n    buckets     []*pair // \u6876\u9663\u5217\n    TOMBSTONE   *pair   // \u522a\u9664\u6a19\u8a18\n}\n\n/* \u5efa\u69cb\u5b50 */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (h *hashMapOpenAddressing) hashFunc(key int) int {\n    return key % h.capacity // \u6839\u64da\u9375\u8a08\u7b97\u96dc\u6e4a\u503c\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\nfunc (h *hashMapOpenAddressing) loadFactor() float64 {\n    return float64(h.size) / float64(h.capacity) // \u8a08\u7b97\u7576\u524d\u8ca0\u8f09\u56e0\u5b50\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nfunc (h *hashMapOpenAddressing) findBucket(key int) int {\n    index := h.hashFunc(key) // \u7372\u53d6\u521d\u59cb\u7d22\u5f15\n    firstTombstone := -1     // \u8a18\u9304\u9047\u5230\u7684\u7b2c\u4e00\u500bTOMBSTONE\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\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                h.buckets[firstTombstone] = h.buckets[index]\n                h.buckets[index] = h.TOMBSTONE\n                return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\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 // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\u7684\u4f4d\u7f6e\n        }\n        index = (index + 1) % h.capacity // \u7dda\u6027\u63a2\u67e5\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    if firstTombstone != -1 {\n        return firstTombstone\n    }\n    return index\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) get(key int) string {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        return h.buckets[index].val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    }\n    return \"\" // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de \"\"\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) put(key int, val string) {\n    if h.loadFactor() > h.loadThres {\n        h.extend() // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    }\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] == nil || h.buckets[index] == h.TOMBSTONE {\n        h.buckets[index] = &pair{key, val} // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        h.size++\n    } else {\n        h.buckets[index].val = val // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val\n    }\n}\n\n/* \u522a\u9664\u64cd\u4f5c */\nfunc (h *hashMapOpenAddressing) remove(key int) {\n    index := h.findBucket(key) // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    if h.buckets[index] != nil && h.buckets[index] != h.TOMBSTONE {\n        h.buckets[index] = h.TOMBSTONE // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        h.size--\n    }\n}\n\n/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nfunc (h *hashMapOpenAddressing) extend() {\n    oldBuckets := h.buckets               // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    h.capacity *= h.extendRatio           // \u66f4\u65b0\u5bb9\u91cf\n    h.buckets = make([]*pair, h.capacity) // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    h.size = 0                            // \u91cd\u7f6e\u5927\u5c0f\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    var size: Int // \u9375\u503c\u5c0d\u6578\u91cf\n    var capacity: Int // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    var loadThres: Double // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    var extendRatio: Int // \u64f4\u5bb9\u500d\u6578\n    var buckets: [Pair?] // \u6876\u9663\u5217\n    var TOMBSTONE: Pair // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    func hashFunc(key: Int) -> Int {\n        key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    func loadFactor() -> Double {\n        Double(size) / Double(capacity)\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    func findBucket(key: Int) -> Int {\n        var index = hashFunc(key: key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while buckets[index] != nil {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if buckets[index]!.key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if firstTombstone != -1 {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if firstTombstone == -1 && buckets[index] == TOMBSTONE {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone == -1 ? index : firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    func get(key: Int) -> String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            return buckets[index]!.val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return nil\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    func put(key: Int, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if loadFactor() > loadThres {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index]!.val = val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key: key, val: val)\n        size += 1\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = findBucket(key: key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if buckets[index] != nil, buckets[index] != TOMBSTONE {\n            buckets[index] = TOMBSTONE\n            size -= 1\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    func extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = Array(repeating: nil, count: capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    #size; // \u9375\u503c\u5c0d\u6578\u91cf\n    #capacity; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    #loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    #extendRatio; // \u64f4\u5bb9\u500d\u6578\n    #buckets; // \u6876\u9663\u5217\n    #TOMBSTONE; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.#size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.#capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.#loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.#extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.#buckets = Array(this.#capacity).fill(null); // \u6876\u9663\u5217\n        this.#TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % this.#capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    #loadFactor() {\n        return this.#size / this.#capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    #findBucket(key) {\n        let index = this.#hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.#buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.#buckets[index].key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.#buckets[firstTombstone] = this.#buckets[index];\n                    this.#buckets[index] = this.#TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.#buckets[index] === this.#TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.#capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.#buckets[index] !== null &&\n            this.#buckets[index] !== this.#TOMBSTONE\n        ) {\n            return this.#buckets[index].val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key, val) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.#loadFactor() > this.#loadThres) {\n            this.#extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.#buckets[index] = new Pair(key, val);\n        this.#size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.#findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    #extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.#buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.#capacity *= this.#extendRatio;\n        this.#buckets = Array(this.#capacity).fill(null);\n        this.#size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private size: number; // \u9375\u503c\u5c0d\u6578\u91cf\n    private capacity: number; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private loadThres: number; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private extendRatio: number; // \u64f4\u5bb9\u500d\u6578\n    private buckets: Array<Pair | null>; // \u6876\u9663\u5217\n    private TOMBSTONE: Pair; // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor() {\n        this.size = 0; // \u9375\u503c\u5c0d\u6578\u91cf\n        this.capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n        this.loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n        this.extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n        this.buckets = Array(this.capacity).fill(null); // \u6876\u9663\u5217\n        this.TOMBSTONE = new Pair(-1, '-1'); // \u522a\u9664\u6a19\u8a18\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % this.capacity;\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    private loadFactor(): number {\n        return this.size / this.capacity;\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    private findBucket(key: number): number {\n        let index = this.hashFunc(key);\n        let firstTombstone = -1;\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (this.buckets[index] !== null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (this.buckets[index]!.key === key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone !== -1) {\n                    this.buckets[firstTombstone] = this.buckets[index];\n                    this.buckets[index] = this.TOMBSTONE;\n                    return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (\n                firstTombstone === -1 &&\n                this.buckets[index] === this.TOMBSTONE\n            ) {\n                firstTombstone = index;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % this.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return firstTombstone === -1 ? index : firstTombstone;\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    get(key: number): string | null {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (\n            this.buckets[index] !== null &&\n            this.buckets[index] !== this.TOMBSTONE\n        ) {\n            return this.buckets[index]!.val;\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null;\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    put(key: number, val: string): void {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (this.loadFactor() > this.loadThres) {\n            this.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        this.buckets[index] = new Pair(key, val);\n        this.size++;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    remove(key: number): void {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        const index = this.findBucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    private extend(): void {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        const bucketsTmp = this.buckets;\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        this.capacity *= this.extendRatio;\n        this.buckets = Array(this.capacity).fill(null);\n        this.size = 0;\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n  late int _size; // \u9375\u503c\u5c0d\u6578\u91cf\n  int _capacity = 4; // \u96dc\u6e4a\u8868\u5bb9\u91cf\n  double _loadThres = 2.0 / 3.0; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n  int _extendRatio = 2; // \u64f4\u5bb9\u500d\u6578\n  late List<Pair?> _buckets; // \u6876\u9663\u5217\n  Pair _TOMBSTONE = Pair(-1, \"-1\"); // \u522a\u9664\u6a19\u8a18\n\n  /* \u5efa\u69cb\u5b50 */\n  HashMapOpenAddressing() {\n    _size = 0;\n    _buckets = List.generate(_capacity, (index) => null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int hashFunc(int key) {\n    return key % _capacity;\n  }\n\n  /* \u8ca0\u8f09\u56e0\u5b50 */\n  double loadFactor() {\n    return _size / _capacity;\n  }\n\n  /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n  int findBucket(int key) {\n    int index = hashFunc(key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (_buckets[index] != null) {\n      // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if (_buckets[index]!.key == key) {\n        // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if (firstTombstone != -1) {\n          _buckets[firstTombstone] = _buckets[index];\n          _buckets[index] = _TOMBSTONE;\n          return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        }\n        return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n      }\n      // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      if (firstTombstone == -1 && _buckets[index] == _TOMBSTONE) {\n        firstTombstone = index;\n      }\n      // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % _capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n  }\n\n  /* \u67e5\u8a62\u64cd\u4f5c */\n  String? get(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      return _buckets[index]!.val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n    return null;\n  }\n\n  /* \u65b0\u589e\u64cd\u4f5c */\n  void put(int key, String val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor() > _loadThres) {\n      extend();\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index]!.val = val;\n      return;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    _buckets[index] = new Pair(key, val);\n    _size++;\n  }\n\n  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    if (_buckets[index] != null && _buckets[index] != _TOMBSTONE) {\n      _buckets[index] = _TOMBSTONE;\n      _size--;\n    }\n  }\n\n  /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n  void extend() {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    List<Pair?> bucketsTmp = _buckets;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    _capacity *= _extendRatio;\n    _buckets = List.generate(_capacity, (index) => null);\n    _size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for (Pair? pair in bucketsTmp) {\n      if (pair != null && pair != _TOMBSTONE) {\n        put(pair.key, pair.val);\n      }\n    }\n  }\n\n  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nstruct HashMapOpenAddressing {\n    size: usize,                // \u9375\u503c\u5c0d\u6578\u91cf\n    capacity: usize,            // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    load_thres: f64,            // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    extend_ratio: usize,        // \u64f4\u5bb9\u500d\u6578\n    buckets: Vec<Option<Pair>>, // \u6876\u9663\u5217\n    TOMBSTONE: Option<Pair>,    // \u522a\u9664\u6a19\u8a18\n}\n\nimpl HashMapOpenAddressing {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        (key % self.capacity as i32) as usize\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fn load_factor(&self) -> f64 {\n        self.size as f64 / self.capacity as f64\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\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        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while self.buckets[index].is_some() {\n            // \u82e5\u9047\u5230 key\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if self.buckets[index].as_ref().unwrap().key == key {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u5efa\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\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\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if first_tombstone == -1 && self.buckets[index] == self.TOMBSTONE {\n                first_tombstone = index as i32;\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % self.capacity;\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        if first_tombstone == -1 {\n            index\n        } else {\n            first_tombstone as usize\n        }\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fn get(&mut self, key: i32) -> Option<&str> {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        None\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fn put(&mut self, key: i32, val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if self.load_factor() > self.load_thres {\n            self.extend();\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        self.buckets[index] = Some(Pair { key, val });\n        self.size += 1;\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fn remove(&mut self, key: i32) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        let index = self.find_bucket(key);\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fn extend(&mut self) {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        let buckets_tmp = self.buckets.clone();\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        self.capacity *= self.extend_ratio;\n        self.buckets = vec![None; self.capacity];\n        self.size = 0;\n\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\ntypedef struct {\n    int size;         // \u9375\u503c\u5c0d\u6578\u91cf\n    int capacity;     // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    double loadThres; // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    int extendRatio;  // \u64f4\u5bb9\u500d\u6578\n    Pair **buckets;   // \u6876\u9663\u5217\n    Pair *TOMBSTONE;  // \u522a\u9664\u6a19\u8a18\n} HashMapOpenAddressing;\n\n/* \u5efa\u69cb\u5b50 */\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 **)malloc(sizeof(Pair *) * hashMap->capacity);\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\u69cb\u51fd\u5f0f */\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/* \u96dc\u6e4a\u51fd\u5f0f */\nint hashFunc(HashMapOpenAddressing *hashMap, int key) {\n    return key % hashMap->capacity;\n}\n\n/* \u8ca0\u8f09\u56e0\u5b50 */\ndouble loadFactor(HashMapOpenAddressing *hashMap) {\n    return (double)hashMap->size / (double)hashMap->capacity;\n}\n\n/* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\nint findBucket(HashMapOpenAddressing *hashMap, int key) {\n    int index = hashFunc(hashMap, key);\n    int firstTombstone = -1;\n    // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while (hashMap->buckets[index] != NULL) {\n        // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        if (hashMap->buckets[index]->key == key) {\n            // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n            if (firstTombstone != -1) {\n                hashMap->buckets[firstTombstone] = hashMap->buckets[index];\n                hashMap->buckets[index] = hashMap->TOMBSTONE;\n                return firstTombstone; // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n            }\n            return index; // \u8fd4\u56de\u6876\u7d22\u5f15\n        }\n        // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n        if (firstTombstone == -1 && hashMap->buckets[index] == hashMap->TOMBSTONE) {\n            firstTombstone = index;\n        }\n        // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n        index = (index + 1) % hashMap->capacity;\n    }\n    // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    return firstTombstone == -1 ? index : firstTombstone;\n}\n\n/* \u67e5\u8a62\u64cd\u4f5c */\nchar *get(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    if (hashMap->buckets[index] != NULL && hashMap->buckets[index] != hashMap->TOMBSTONE) {\n        return hashMap->buckets[index]->val;\n    }\n    // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u7a7a\u5b57\u4e32\n    return \"\";\n}\n\n/* \u65b0\u589e\u64cd\u4f5c */\nvoid put(HashMapOpenAddressing *hashMap, int key, char *val) {\n    // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    if (loadFactor(hashMap) > hashMap->loadThres) {\n        extend(hashMap);\n    }\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\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\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\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/* \u522a\u9664\u64cd\u4f5c */\nvoid removeItem(HashMapOpenAddressing *hashMap, int key) {\n    // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    int index = findBucket(hashMap, key);\n    // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\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/* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\nvoid extend(HashMapOpenAddressing *hashMap) {\n    // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    Pair **bucketsTmp = hashMap->buckets;\n    int oldCapacity = hashMap->capacity;\n    // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    hashMap->capacity *= hashMap->extendRatio;\n    hashMap->buckets = (Pair **)malloc(sizeof(Pair *) * hashMap->capacity);\n    hashMap->size = 0;\n    // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 */\nclass HashMapOpenAddressing {\n    private var size: Int               // \u9375\u503c\u5c0d\u6578\u91cf\n    private var capacity: Int           // \u96dc\u6e4a\u8868\u5bb9\u91cf\n    private val loadThres: Double       // \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    private val extendRatio: Int        // \u64f4\u5bb9\u500d\u6578\n    private var buckets: Array<Pair?>   // \u6876\u9663\u5217\n    private val TOMBSTONE: Pair         // \u522a\u9664\u6a19\u8a18\n\n    /* \u5efa\u69cb\u5b50 */\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    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        return key % capacity\n    }\n\n    /* \u8ca0\u8f09\u56e0\u5b50 */\n    fun loadFactor(): Double {\n        return (size / capacity).toDouble()\n    }\n\n    /* \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 */\n    fun findBucket(key: Int): Int {\n        var index = hashFunc(key)\n        var firstTombstone = -1\n        // \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n        while (buckets[index] != null) {\n            // \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n            if (buckets[index]?.key == key) {\n                // \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n                if (firstTombstone != -1) {\n                    buckets[firstTombstone] = buckets[index]\n                    buckets[index] = TOMBSTONE\n                    return firstTombstone // \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n                }\n                return index // \u8fd4\u56de\u6876\u7d22\u5f15\n            }\n            // \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n            if (firstTombstone == -1 && buckets[index] == TOMBSTONE) {\n                firstTombstone = index\n            }\n            // \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n            index = (index + 1) % capacity\n        }\n        // \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n        return if (firstTombstone == -1) index else firstTombstone\n    }\n\n    /* \u67e5\u8a62\u64cd\u4f5c */\n    fun get(key: Int): String? {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            return buckets[index]?._val\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de null\n        return null\n    }\n\n    /* \u65b0\u589e\u64cd\u4f5c */\n    fun put(key: Int, _val: String) {\n        // \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n        if (loadFactor() > loadThres) {\n            extend()\n        }\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u4e26\u8fd4\u56de\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index]!!._val = _val\n            return\n        }\n        // \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n        buckets[index] = Pair(key, _val)\n        size++\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        // \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n        val index = findBucket(key)\n        // \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n        if (buckets[index] != null && buckets[index] != TOMBSTONE) {\n            buckets[index] = TOMBSTONE\n            size--\n        }\n    }\n\n    /* \u64f4\u5bb9\u96dc\u6e4a\u8868 */\n    fun extend() {\n        // \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n        val bucketsTmp = buckets\n        // \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n        capacity *= extendRatio\n        buckets = arrayOfNulls(capacity)\n        size = 0\n        // \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n        for (pair in bucketsTmp) {\n            if (pair != null && pair != TOMBSTONE) {\n                put(pair.key, pair._val)\n            }\n        }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u958b\u653e\u5b9a\u5740\u96dc\u6e4a\u8868 ###\nclass HashMapOpenAddressing\n  TOMBSTONE = Pair.new(-1, '-1') # \u522a\u9664\u6a19\u8a18\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0 # \u9375\u503c\u5c0d\u6578\u91cf\n    @capacity = 4 # \u96dc\u6e4a\u8868\u5bb9\u91cf\n    @load_thres = 2.0 / 3.0 # \u89f8\u767c\u64f4\u5bb9\u7684\u8ca0\u8f09\u56e0\u5b50\u95be\u503c\n    @extend_ratio = 2 # \u64f4\u5bb9\u500d\u6578\n    @buckets = Array.new(@capacity) # \u6876\u9663\u5217\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    key % @capacity\n  end\n\n  ### \u8ca0\u8f09\u56e0\u5b50 ###\n  def load_factor\n    @size / @capacity\n  end\n\n  ### \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15 ###\n  def find_bucket(key)\n    index = hash_func(key)\n    first_tombstone = -1\n    # \u7dda\u6027\u63a2\u67e5\uff0c\u7576\u9047\u5230\u7a7a\u6876\u6642\u8df3\u51fa\n    while !@buckets[index].nil?\n      # \u82e5\u9047\u5230 key \uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n      if @buckets[index].key == key\n        # \u82e5\u4e4b\u524d\u9047\u5230\u4e86\u522a\u9664\u6a19\u8a18\uff0c\u5247\u5c07\u9375\u503c\u5c0d\u79fb\u52d5\u81f3\u8a72\u7d22\u5f15\u8655\n        if first_tombstone != -1\n          @buckets[first_tombstone] = @buckets[index]\n          @buckets[index] = TOMBSTONE\n          return first_tombstone # \u8fd4\u56de\u79fb\u52d5\u5f8c\u7684\u6876\u7d22\u5f15\n        end\n        return index # \u8fd4\u56de\u6876\u7d22\u5f15\n      end\n      # \u8a18\u9304\u9047\u5230\u7684\u9996\u500b\u522a\u9664\u6a19\u8a18\n      first_tombstone = index if first_tombstone == -1 && @buckets[index] == TOMBSTONE\n      # \u8a08\u7b97\u6876\u7d22\u5f15\uff0c\u8d8a\u904e\u5c3e\u90e8\u5247\u8fd4\u56de\u982d\u90e8\n      index = (index + 1) % @capacity\n    end\n    # \u82e5 key \u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de\u65b0\u589e\u9ede\u7684\u7d22\u5f15\n    first_tombstone == -1 ? index : first_tombstone\n  end\n\n  ### \u67e5\u8a62\u64cd\u4f5c ###\n  def get(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8fd4\u56de\u5c0d\u61c9 val\n    return @buckets[index].val unless [nil, TOMBSTONE].include?(@buckets[index])\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u8fd4\u56de nil\n    nil\n  end\n\n  ### \u65b0\u589e\u64cd\u4f5c ###\n  def put(key, val)\n    # \u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e\u95be\u503c\u6642\uff0c\u57f7\u884c\u64f4\u5bb9\n    extend if load_factor > @load_thres\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u8986\u84cb val \u958b\u8fd4\u56de\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index].val = val\n      return\n    end\n    # \u82e5\u9375\u503c\u5c0d\u4e0d\u5b58\u5728\uff0c\u5247\u65b0\u589e\u8a72\u9375\u503c\u5c0d\n    @buckets[index] = Pair.new(key, val)\n    @size += 1\n  end\n\n  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    # \u641c\u5c0b key \u5c0d\u61c9\u7684\u6876\u7d22\u5f15\n    index = find_bucket(key)\n    # \u82e5\u627e\u5230\u9375\u503c\u5c0d\uff0c\u5247\u7528\u522a\u9664\u6a19\u8a18\u8986\u84cb\u5b83\n    unless [nil, TOMBSTONE].include?(@buckets[index])\n      @buckets[index] = TOMBSTONE\n      @size -= 1\n    end\n  end\n\n  ### \u64f4\u5bb9\u96dc\u6e4a\u8868 ###\n  def extend\n    # \u66ab\u5b58\u539f\u96dc\u6e4a\u8868\n    buckets_tmp = @buckets\n    # \u521d\u59cb\u5316\u64f4\u5bb9\u5f8c\u7684\u65b0\u96dc\u6e4a\u8868\n    @capacity *= @extend_ratio\n    @buckets = Array.new(@capacity)\n    @size = 0\n    # \u5c07\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u642c\u904b\u81f3\u65b0\u96dc\u6e4a\u8868\n    for pair in buckets_tmp\n      put(pair.key, pair.val) unless [nil, TOMBSTONE].include?(pair)\n    end\n  end\n\n  ### \u5217\u5370\u96dc\u6e4a\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\u6e2c","text":"

    \u5e73\u65b9\u63a2\u6e2c\u8207\u7dda\u6027\u63a2\u67e5\u985e\u4f3c\uff0c\u90fd\u662f\u958b\u653e\u5b9a\u5740\u7684\u5e38\u898b\u7b56\u7565\u4e4b\u4e00\u3002\u7576\u767c\u751f\u885d\u7a81\u6642\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e0d\u662f\u7c21\u55ae\u5730\u8df3\u904e\u4e00\u500b\u56fa\u5b9a\u7684\u6b65\u6578\uff0c\u800c\u662f\u8df3\u904e\u201c\u63a2\u6e2c\u6b21\u6578\u7684\u5e73\u65b9\u201d\u7684\u6b65\u6578\uff0c\u5373 \\(1, 4, 9, \\dots\\) \u6b65\u3002

    \u5e73\u65b9\u63a2\u6e2c\u4e3b\u8981\u5177\u6709\u4ee5\u4e0b\u512a\u52e2\u3002

    • \u5e73\u65b9\u63a2\u6e2c\u900f\u904e\u8df3\u904e\u63a2\u6e2c\u6b21\u6578\u5e73\u65b9\u7684\u8ddd\u96e2\uff0c\u8a66\u5716\u7de9\u89e3\u7dda\u6027\u63a2\u67e5\u7684\u805a\u96c6\u6548\u61c9\u3002
    • \u5e73\u65b9\u63a2\u6e2c\u6703\u8df3\u904e\u66f4\u5927\u7684\u8ddd\u96e2\u4f86\u5c0b\u627e\u7a7a\u4f4d\u7f6e\uff0c\u6709\u52a9\u65bc\u8cc7\u6599\u5206\u4f48\u5f97\u66f4\u52a0\u5747\u52fb\u3002

    \u7136\u800c\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e26\u4e0d\u662f\u5b8c\u7f8e\u7684\u3002

    • \u4ecd\u7136\u5b58\u5728\u805a\u96c6\u73fe\u8c61\uff0c\u5373\u67d0\u4e9b\u4f4d\u7f6e\u6bd4\u5176\u4ed6\u4f4d\u7f6e\u66f4\u5bb9\u6613\u88ab\u4f54\u7528\u3002
    • \u7531\u65bc\u5e73\u65b9\u7684\u589e\u9577\uff0c\u5e73\u65b9\u63a2\u6e2c\u53ef\u80fd\u4e0d\u6703\u63a2\u6e2c\u6574\u500b\u96dc\u6e4a\u8868\uff0c\u9019\u610f\u5473\u8457\u5373\u4f7f\u96dc\u6e4a\u8868\u4e2d\u6709\u7a7a\u6876\uff0c\u5e73\u65b9\u63a2\u6e2c\u4e5f\u53ef\u80fd\u7121\u6cd5\u8a2a\u554f\u5230\u5b83\u3002
    "},{"location":"chapter_hashing/hash_collision/#3","title":"3. \u00a0 \u591a\u6b21\u96dc\u6e4a","text":"

    \u9867\u540d\u601d\u7fa9\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\)\u3001\\(f_2(x)\\)\u3001\\(f_3(x)\\)\u3001\\(\\dots\\) \u9032\u884c\u63a2\u6e2c\u3002

    • \u63d2\u5165\u5143\u7d20\uff1a\u82e5\u96dc\u6e4a\u51fd\u5f0f \\(f_1(x)\\) \u51fa\u73fe\u885d\u7a81\uff0c\u5247\u5617\u8a66 \\(f_2(x)\\) \uff0c\u4ee5\u6b64\u985e\u63a8\uff0c\u76f4\u5230\u627e\u5230\u7a7a\u4f4d\u5f8c\u63d2\u5165\u5143\u7d20\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u5728\u76f8\u540c\u7684\u96dc\u6e4a\u51fd\u5f0f\u9806\u5e8f\u4e0b\u9032\u884c\u67e5\u8a62\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6642\u8fd4\u56de\uff1b\u82e5\u9047\u5230\u7a7a\u4f4d\u6216\u5df2\u5617\u8a66\u6240\u6709\u96dc\u6e4a\u51fd\u5f0f\uff0c\u8aaa\u660e\u96dc\u6e4a\u8868\u4e2d\u4e0d\u5b58\u5728\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de None \u3002

    \u8207\u7dda\u6027\u63a2\u67e5\u76f8\u6bd4\uff0c\u591a\u6b21\u96dc\u6e4a\u65b9\u6cd5\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u6703\u5e36\u4f86\u984d\u5916\u7684\u8a08\u7b97\u91cf\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u958b\u653e\u5b9a\u5740\uff08\u7dda\u6027\u63a2\u67e5\u3001\u5e73\u65b9\u63a2\u6e2c\u548c\u591a\u6b21\u96dc\u6e4a\uff09\u96dc\u6e4a\u8868\u90fd\u5b58\u5728\u201c\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u201d\u7684\u554f\u984c\u3002

    "},{"location":"chapter_hashing/hash_collision/#623","title":"6.2.3 \u00a0 \u7a0b\u5f0f\u8a9e\u8a00\u7684\u9078\u64c7","text":"

    \u5404\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u7b56\u7565\uff0c\u4e0b\u9762\u8209\u5e7e\u500b\u4f8b\u5b50\u3002

    • Python \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002\u5b57\u5178 dict \u4f7f\u7528\u507d\u96a8\u6a5f\u6578\u9032\u884c\u63a2\u6e2c\u3002
    • Java \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002\u81ea JDK 1.8 \u4ee5\u4f86\uff0c\u7576 HashMap \u5167\u9663\u5217\u9577\u5ea6\u9054\u5230 64 \u4e14\u93c8\u7d50\u4e32\u5217\u9577\u5ea6\u9054\u5230 8 \u6642\uff0c\u93c8\u7d50\u4e32\u5217\u6703\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4ee5\u63d0\u5347\u67e5\u8a62\u6548\u80fd\u3002
    • Go \u63a1\u7528\u93c8\u5f0f\u4f4d\u5740\u3002Go \u898f\u5b9a\u6bcf\u500b\u6876\u6700\u591a\u5132\u5b58 8 \u500b\u9375\u503c\u5c0d\uff0c\u8d85\u51fa\u5bb9\u91cf\u5247\u9023\u7dda\u4e00\u500b\u6ea2\u4f4d\u6876\uff1b\u7576\u6ea2\u4f4d\u6876\u904e\u591a\u6642\uff0c\u6703\u57f7\u884c\u4e00\u6b21\u7279\u6b8a\u7684\u7b49\u91cf\u64f4\u5bb9\u64cd\u4f5c\uff0c\u4ee5\u78ba\u4fdd\u6548\u80fd\u3002
    "},{"location":"chapter_hashing/hash_map/","title":"6.1 \u00a0 \u96dc\u6e4a\u8868","text":"

    \u96dc\u6e4a\u8868\uff08hash table\uff09\uff0c\u53c8\u7a31\u6563\u5217\u8868\uff0c\u5b83\u900f\u904e\u5efa\u7acb\u9375 key \u8207\u503c value \u4e4b\u9593\u7684\u5c0d\u6620\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u3002\u5177\u9ad4\u800c\u8a00\uff0c\u6211\u5011\u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u4e00\u500b\u9375 key \uff0c\u5247\u53ef\u4ee5\u5728 \\(O(1)\\) \u6642\u9593\u5167\u7372\u53d6\u5c0d\u61c9\u7684\u503c value \u3002

    \u5982\u5716 6-1 \u6240\u793a\uff0c\u7d66\u5b9a \\(n\\) \u500b\u5b78\u751f\uff0c\u6bcf\u500b\u5b78\u751f\u90fd\u6709\u201c\u59d3\u540d\u201d\u548c\u201c\u5b78\u865f\u201d\u5169\u9805\u8cc7\u6599\u3002\u5047\u5982\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u201c\u8f38\u5165\u4e00\u500b\u5b78\u865f\uff0c\u8fd4\u56de\u5c0d\u61c9\u7684\u59d3\u540d\u201d\u7684\u67e5\u8a62\u529f\u80fd\uff0c\u5247\u53ef\u4ee5\u63a1\u7528\u5716 6-1 \u6240\u793a\u7684\u96dc\u6e4a\u8868\u4f86\u5be6\u73fe\u3002

    \u5716 6-1 \u00a0 \u96dc\u6e4a\u8868\u7684\u62bd\u8c61\u8868\u793a

    \u9664\u96dc\u6e4a\u8868\u5916\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u4e5f\u53ef\u4ee5\u5be6\u73fe\u67e5\u8a62\u529f\u80fd\uff0c\u5b83\u5011\u7684\u6548\u7387\u5c0d\u6bd4\u5982\u8868 6-1 \u6240\u793a\u3002

    • \u65b0\u589e\u5143\u7d20\uff1a\u50c5\u9700\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u7684\u5c3e\u90e8\u5373\u53ef\uff0c\u4f7f\u7528 \\(O(1)\\) \u6642\u9593\u3002
    • \u67e5\u8a62\u5143\u7d20\uff1a\u7531\u65bc\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u662f\u4e82\u5e8f\u7684\uff0c\u56e0\u6b64\u9700\u8981\u8d70\u8a2a\u5176\u4e2d\u7684\u6240\u6709\u5143\u7d20\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u522a\u9664\u5143\u7d20\uff1a\u9700\u8981\u5148\u67e5\u8a62\u5230\u5143\u7d20\uff0c\u518d\u5f9e\u9663\u5217\uff08\u93c8\u7d50\u4e32\u5217\uff09\u4e2d\u522a\u9664\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002

    \u8868 6-1 \u00a0 \u5143\u7d20\u67e5\u8a62\u6548\u7387\u5c0d\u6bd4

    \u9663\u5217 \u93c8\u7d50\u4e32\u5217 \u96dc\u6e4a\u8868 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\) \u65b0\u589e\u5143\u7d20 \\(O(1)\\) \\(O(1)\\) \\(O(1)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(1)\\)

    \u89c0\u5bdf\u767c\u73fe\uff0c\u5728\u96dc\u6e4a\u8868\u4e2d\u9032\u884c\u589e\u522a\u67e5\u6539\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f \\(O(1)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_hashing/hash_map/#611","title":"6.1.1 \u00a0 \u96dc\u6e4a\u8868\u5e38\u7528\u64cd\u4f5c","text":"

    \u96dc\u6e4a\u8868\u7684\u5e38\u898b\u64cd\u4f5c\u5305\u62ec\uff1a\u521d\u59cb\u5316\u3001\u67e5\u8a62\u64cd\u4f5c\u3001\u65b0\u589e\u9375\u503c\u5c0d\u548c\u522a\u9664\u9375\u503c\u5c0d\u7b49\uff0c\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap: dict = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname: str = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.pop(10583)\n
    hash_map.cpp
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nunordered_map<int, string> map;\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.erase(10583);\n
    hash_map.java
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<Integer, String> map = new HashMap<>();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.put(12836, \"\u5c0f\u54c8\");\nmap.put(15937, \"\u5c0f\u56c9\");\nmap.put(16750, \"\u5c0f\u7b97\");\nmap.put(13276, \"\u5c0f\u6cd5\");\nmap.put(10583, \"\u5c0f\u9d28\");\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
    hash_map.cs
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nDictionary<int, string> map = new() {\n    /* \u65b0\u589e\u64cd\u4f5c */\n    // \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\n    { 12836, \"\u5c0f\u54c8\" },\n    { 15937, \"\u5c0f\u56c9\" },\n    { 16750, \"\u5c0f\u7b97\" },\n    { 13276, \"\u5c0f\u6cd5\" },\n    { 10583, \"\u5c0f\u9d28\" }\n};\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nstring name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.Remove(10583);\n
    hash_map_test.go
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nhmap := make(map[int]string)\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname := hmap[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\ndelete(hmap, 10583)\n
    hash_map.swift
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nvar map: [Int: String] = [:]\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map[15937]!\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.removeValue(forKey: 10583)\n
    hash_map.js
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\n
    hash_map.ts
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nconst map = new Map<number, string>();\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.set(12836, '\u5c0f\u54c8');\nmap.set(15937, '\u5c0f\u56c9');\nmap.set(16750, '\u5c0f\u7b97');\nmap.set(13276, '\u5c0f\u6cd5');\nmap.set(10583, '\u5c0f\u9d28');\nconsole.info('\\n\u65b0\u589e\u5b8c\u6210\u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet name = map.get(15937);\nconsole.info('\\n\u8f38\u5165\u5b78\u865f 15937 \uff0c\u67e5\u8a62\u5230\u59d3\u540d ' + name);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.delete(10583);\nconsole.info('\\n\u522a\u9664 10583 \u5f8c\uff0c\u96dc\u6e4a\u8868\u70ba\\nKey -> Value');\nconsole.info(map);\n
    hash_map.dart
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nMap<int, String> map = {};\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\";\nmap[15937] = \"\u5c0f\u56c9\";\nmap[16750] = \"\u5c0f\u7b97\";\nmap[13276] = \"\u5c0f\u6cd5\";\nmap[10583] = \"\u5c0f\u9d28\";\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nString name = map[15937];\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583);\n
    hash_map.rs
    use std::collections::HashMap;\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nlet mut map: HashMap<i32, String> = HashMap::new();\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap.insert(12836, \"\u5c0f\u54c8\".to_string());\nmap.insert(15937, \"\u5c0f\u56c9\".to_string());\nmap.insert(16750, \"\u5c0f\u7b97\".to_string());\nmap.insert(13279, \"\u5c0f\u6cd5\".to_string());\nmap.insert(10583, \"\u5c0f\u9d28\".to_string());\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nlet _name: Option<&String> = map.get(&15937);\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nlet _removed_value: Option<String> = map.remove(&10583);\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
    hash_map.kt
    /* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nval map = HashMap<Int,String>()\n\n/* \u65b0\u589e\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nmap[12836] = \"\u5c0f\u54c8\"\nmap[15937] = \"\u5c0f\u56c9\"\nmap[16750] = \"\u5c0f\u7b97\"\nmap[13276] = \"\u5c0f\u6cd5\"\nmap[10583] = \"\u5c0f\u9d28\"\n\n/* \u67e5\u8a62\u64cd\u4f5c */\n// \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nval name = map[15937]\n\n/* \u522a\u9664\u64cd\u4f5c */\n// \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nmap.remove(10583)\n
    hash_map.rb
    # \u521d\u59cb\u5316\u96dc\u6e4a\u8868\nhmap = {}\n\n# \u65b0\u589e\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u65b0\u589e\u9375\u503c\u5c0d (key, value)\nhmap[12836] = \"\u5c0f\u54c8\"\nhmap[15937] = \"\u5c0f\u56c9\"\nhmap[16750] = \"\u5c0f\u7b97\"\nhmap[13276] = \"\u5c0f\u6cd5\"\nhmap[10583] = \"\u5c0f\u9d28\"\n\n# \u67e5\u8a62\u64cd\u4f5c\n# \u5411\u96dc\u6e4a\u8868\u4e2d\u8f38\u5165\u9375 key \uff0c\u5f97\u5230\u503c value\nname = hmap[15937]\n\n# \u522a\u9664\u64cd\u4f5c\n# \u5728\u96dc\u6e4a\u8868\u4e2d\u522a\u9664\u9375\u503c\u5c0d (key, value)\nhmap.delete(10583)\n
    hash_map.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u96dc\u6e4a\u8868\u6709\u4e09\u7a2e\u5e38\u7528\u7684\u8d70\u8a2a\u65b9\u5f0f\uff1a\u8d70\u8a2a\u9375\u503c\u5c0d\u3001\u8d70\u8a2a\u9375\u548c\u8d70\u8a2a\u503c\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig hash_map.py
    # \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value in hmap.items():\n    print(key, \"->\", value)\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key in hmap.keys():\n    print(key)\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nfor value in hmap.values():\n    print(value)\n
    hash_map.cpp
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (auto kv: map) {\n    cout << kv.first << \" -> \" << kv.second << endl;\n}\n// \u4f7f\u7528\u8fed\u4ee3\u5668\u8d70\u8a2a key->value\nfor (auto iter = map.begin(); iter != map.end(); iter++) {\n    cout << iter->first << \"->\" << iter->second << endl;\n}\n
    hash_map.java
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor (Map.Entry <Integer, String> kv: map.entrySet()) {\n    System.out.println(kv.getKey() + \" -> \" + kv.getValue());\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (int key: map.keySet()) {\n    System.out.println(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (String val: map.values()) {\n    System.out.println(val);\n}\n
    hash_map.cs
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nforeach (var kv in map) {\n    Console.WriteLine(kv.Key + \" -> \" + kv.Value);\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nforeach (int key in map.Keys) {\n    Console.WriteLine(key);\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nforeach (string val in map.Values) {\n    Console.WriteLine(val);\n}\n
    hash_map_test.go
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor key, value := range hmap {\n    fmt.Println(key, \"->\", value)\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor key := range hmap {\n    fmt.Println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor _, value := range hmap {\n    fmt.Println(value)\n}\n
    hash_map.swift
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in map {\n    print(\"\\(key) -> \\(value)\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys {\n    print(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values {\n    print(value)\n}\n
    hash_map.js
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.ts
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\nconsole.info('\\n\u8d70\u8a2a\u9375\u503c\u5c0d Key->Value');\nfor (const [k, v] of map.entries()) {\n    console.info(k + ' -> ' + v);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u9375 Key');\nfor (const k of map.keys()) {\n    console.info(k);\n}\nconsole.info('\\n\u55ae\u7368\u8d70\u8a2a\u503c Value');\nfor (const v of map.values()) {\n    console.info(v);\n}\n
    hash_map.dart
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nmap.forEach((key, value) {\n  print('$key -> $value');\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nmap.keys.forEach((key) {\n  print(key);\n});\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nmap.values.forEach((value) {\n  print(value);\n});\n
    hash_map.rs
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d Key->Value\nfor (key, value) in &map {\n    println!(\"{key} -> {value}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u9375 Key\nfor key in map.keys() {\n    println!(\"{key}\");\n}\n\n// \u55ae\u7368\u8d70\u8a2a\u503c Value\nfor value in map.values() {\n    println!(\"{value}\");\n}\n
    hash_map.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u8868\n
    hash_map.kt
    /* \u8d70\u8a2a\u96dc\u6e4a\u8868 */\n// \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nfor ((key, value) in map) {\n    println(\"$key -> $value\")\n}\n// \u55ae\u7368\u8d70\u8a2a\u9375 key\nfor (key in map.keys) {\n    println(key)\n}\n// \u55ae\u7368\u8d70\u8a2a\u503c value\nfor (_val in map.values) {\n    println(_val)\n}\n
    hash_map.rb
    # \u8d70\u8a2a\u96dc\u6e4a\u8868\n# \u8d70\u8a2a\u9375\u503c\u5c0d key->value\nhmap.entries.each { |key, value| puts \"#{key} -> #{value}\" }\n\n# \u55ae\u7368\u8d70\u8a2a\u9375 key\nhmap.keys.each { |key| puts key }\n\n# \u55ae\u7368\u8d70\u8a2a\u503c value\nhmap.values.each { |val| puts val }\n
    hash_map.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_hashing/hash_map/#612","title":"6.1.2 \u00a0 \u96dc\u6e4a\u8868\u7c21\u55ae\u5be6\u73fe","text":"

    \u6211\u5011\u5148\u8003\u616e\u6700\u7c21\u55ae\u7684\u60c5\u6cc1\uff0c\u50c5\u7528\u4e00\u500b\u9663\u5217\u4f86\u5be6\u73fe\u96dc\u6e4a\u8868\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5c07\u9663\u5217\u4e2d\u7684\u6bcf\u500b\u7a7a\u4f4d\u7a31\u70ba\u6876\uff08bucket\uff09\uff0c\u6bcf\u500b\u6876\u53ef\u5132\u5b58\u4e00\u500b\u9375\u503c\u5c0d\u3002\u56e0\u6b64\uff0c\u67e5\u8a62\u64cd\u4f5c\u5c31\u662f\u627e\u5230 key \u5c0d\u61c9\u7684\u6876\uff0c\u4e26\u5728\u6876\u4e2d\u7372\u53d6 value \u3002

    \u90a3\u9ebc\uff0c\u5982\u4f55\u57fa\u65bc key \u5b9a\u4f4d\u5c0d\u61c9\u7684\u6876\u5462\uff1f\u9019\u662f\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\uff08hash function\uff09\u5be6\u73fe\u7684\u3002\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u8f38\u51fa\u7a7a\u9593\u3002\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u8f38\u5165\u7a7a\u9593\u662f\u6240\u6709 key \uff0c\u8f38\u51fa\u7a7a\u9593\u662f\u6240\u6709\u6876\uff08\u9663\u5217\u7d22\u5f15\uff09\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u8f38\u5165\u4e00\u500b key \uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f97\u5230\u8a72 key \u5c0d\u61c9\u7684\u9375\u503c\u5c0d\u5728\u9663\u5217\u4e2d\u7684\u5132\u5b58\u4f4d\u7f6e\u3002

    \u8f38\u5165\u4e00\u500b key \uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8a08\u7b97\u904e\u7a0b\u5206\u70ba\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u900f\u904e\u67d0\u7a2e\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash() \u8a08\u7b97\u5f97\u5230\u96dc\u6e4a\u503c\u3002
    2. \u5c07\u96dc\u6e4a\u503c\u5c0d\u6876\u6578\u91cf\uff08\u9663\u5217\u9577\u5ea6\uff09capacity \u53d6\u6a21\uff0c\u5f9e\u800c\u7372\u53d6\u8a72 key \u5c0d\u61c9\u7684\u9663\u5217\u7d22\u5f15 index \u3002
    index = hash(key) % capacity\n

    \u96a8\u5f8c\uff0c\u6211\u5011\u5c31\u53ef\u4ee5\u5229\u7528 index \u5728\u96dc\u6e4a\u8868\u4e2d\u8a2a\u554f\u5c0d\u61c9\u7684\u6876\uff0c\u5f9e\u800c\u7372\u53d6 value \u3002

    \u8a2d\u9663\u5217\u9577\u5ea6 capacity = 100\u3001\u96dc\u6e4a\u6f14\u7b97\u6cd5 hash(key) = key \uff0c\u6613\u5f97\u96dc\u6e4a\u51fd\u5f0f\u70ba key % 100 \u3002\u5716 6-2 \u4ee5 key \u5b78\u865f\u548c value \u59d3\u540d\u70ba\u4f8b\uff0c\u5c55\u793a\u4e86\u96dc\u6e4a\u51fd\u5f0f\u7684\u5de5\u4f5c\u539f\u7406\u3002

    \u5716 6-2 \u00a0 \u96dc\u6e4a\u51fd\u5f0f\u5de5\u4f5c\u539f\u7406

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u500b\u7c21\u55ae\u96dc\u6e4a\u8868\u3002\u5176\u4e2d\uff0c\u6211\u5011\u5c07 key \u548c value \u5c01\u88dd\u6210\u4e00\u500b\u985e\u5225 Pair \uff0c\u4ee5\u8868\u793a\u9375\u503c\u5c0d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_hash_map.py
    class Pair:\n    \"\"\"\u9375\u503c\u5c0d\"\"\"\n\n    def __init__(self, key: int, val: str):\n        self.key = key\n        self.val = val\n\nclass ArrayHashMap:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        self.buckets: list[Pair | None] = [None] * 100\n\n    def hash_func(self, key: int) -> int:\n        \"\"\"\u96dc\u6e4a\u51fd\u5f0f\"\"\"\n        index = key % 100\n        return index\n\n    def get(self, key: int) -> str:\n        \"\"\"\u67e5\u8a62\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        \"\"\"\u65b0\u589e\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        \"\"\"\u522a\u9664\u64cd\u4f5c\"\"\"\n        index: int = self.hash_func(key)\n        # \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None\n\n    def entry_set(self) -> list[Pair]:\n        \"\"\"\u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\"\"\"\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        \"\"\"\u7372\u53d6\u6240\u6709\u9375\"\"\"\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        \"\"\"\u7372\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        \"\"\"\u5217\u5370\u96dc\u6e4a\u8868\"\"\"\n        for pair in self.buckets:\n            if pair is not None:\n                print(pair.key, \"->\", pair.val)\n
    array_hash_map.cpp
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  private:\n    vector<Pair *> buckets;\n\n  public:\n    ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = vector<Pair *>(100);\n    }\n\n    ~ArrayHashMap() {\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        for (const auto &bucket : buckets) {\n            delete bucket;\n        }\n        buckets.clear();\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    void remove(int key) {\n        int index = hashFunc(key);\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\u4e26\u7f6e\u70ba nullptr\n        delete buckets[index];\n        buckets[index] = nullptr;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    void print() {\n        for (Pair *kv : pairSet()) {\n            cout << kv->key << \" -> \" << kv->val << endl;\n        }\n    }\n};\n
    array_hash_map.java
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private List<Pair> buckets;\n\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = new ArrayList<>();\n        for (int i = 0; i < 100; i++) {\n            buckets.add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private int hashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public void remove(int key) {\n        int index = hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets.set(index, null);\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d int->string */\nclass Pair(int key, string val) {\n    public int key = key;\n    public string val = val;\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    List<Pair?> buckets;\n    public ArrayHashMap() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = [];\n        for (int i = 0; i < 100; i++) {\n            buckets.Add(null);\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    int HashFunc(int key) {\n        int index = key % 100;\n        return index;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public void Remove(int key) {\n        int index = HashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\ntype pair struct {\n    key int\n    val string\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntype arrayHashMap struct {\n    buckets []*pair\n}\n\n/* \u521d\u59cb\u5316\u96dc\u6e4a\u8868 */\nfunc newArrayHashMap() *arrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    buckets := make([]*pair, 100)\n    return &arrayHashMap{buckets: buckets}\n}\n\n/* \u96dc\u6e4a\u51fd\u5f0f */\nfunc (a *arrayHashMap) hashFunc(key int) int {\n    index := key % 100\n    return index\n}\n\n/* \u67e5\u8a62\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/* \u65b0\u589e\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/* \u522a\u9664\u64cd\u4f5c */\nfunc (a *arrayHashMap) remove(key int) {\n    index := a.hashFunc(key)\n    // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    a.buckets[index] = nil\n}\n\n/* \u7372\u53d6\u6240\u6709\u9375\u5c0d */\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/* \u7372\u53d6\u6240\u6709\u9375 */\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/* \u7372\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private var buckets: [Pair?]\n\n    init() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        buckets = Array(repeating: nil, count: 100)\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private func hashFunc(key: Int) -> Int {\n        let index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    func remove(key: Int) {\n        let index = hashFunc(key: key)\n        // \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = nil\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\n    func pairSet() -> [Pair] {\n        buckets.compactMap { $0 }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375 */\n    func keySet() -> [Int] {\n        buckets.compactMap { $0?.key }\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u503c */\n    func valueSet() -> [String] {\n        buckets.compactMap { $0?.val }\n    }\n\n    /* \u5217\u5370\u96dc\u6e4a\u8868 */\n    func print() {\n        for pair in pairSet() {\n            Swift.print(\"\\(pair.key) -> \\(pair.val)\")\n        }\n    }\n}\n
    array_hash_map.js
    /* \u9375\u503c\u5c0d Number -> String */\nclass Pair {\n    constructor(key, val) {\n        this.key = key;\n        this.val = val;\n    }\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    #buckets;\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.#buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    #hashFunc(key) {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\u64cd\u4f5c */\n    set(key, val) {\n        let index = this.#hashFunc(key);\n        this.#buckets[index] = new Pair(key, val);\n    }\n\n    /* \u522a\u9664\u64cd\u4f5c */\n    delete(key) {\n        let index = this.#hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.#buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d 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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    private readonly buckets: (Pair | null)[];\n\n    constructor() {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        this.buckets = new Array(100).fill(null);\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    private hashFunc(key: number): number {\n        return key % 100;\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    public delete(key: number) {\n        let index = this.hashFunc(key);\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        this.buckets[index] = null;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\nclass Pair {\n  int key;\n  String val;\n  Pair(this.key, this.val);\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n  late List<Pair?> _buckets;\n\n  ArrayHashMap() {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    _buckets = List.filled(100, null);\n  }\n\n  /* \u96dc\u6e4a\u51fd\u5f0f */\n  int _hashFunc(int key) {\n    final int index = key % 100;\n    return index;\n  }\n\n  /* \u67e5\u8a62\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  /* \u65b0\u589e\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  /* \u522a\u9664\u64cd\u4f5c */\n  void remove(int key) {\n    final int index = _hashFunc(key);\n    _buckets[index] = null;\n  }\n\n  /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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  /* \u7372\u53d6\u6240\u6709\u9375 */\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  /* \u7372\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  /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\n#[derive(Debug, Clone, PartialEq)]\npub struct Pair {\n    pub key: i32,\n    pub val: String,\n}\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\npub struct ArrayHashMap {\n    buckets: Vec<Option<Pair>>,\n}\n\nimpl ArrayHashMap {\n    pub fn new() -> ArrayHashMap {\n        // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n        Self {\n            buckets: vec![None; 100],\n        }\n    }\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fn hash_func(&self, key: i32) -> usize {\n        key as usize % 100\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    pub fn remove(&mut self, key: i32) {\n        let index = self.hash_func(key);\n        // \u7f6e\u70ba None \uff0c\u4ee3\u8868\u522a\u9664\n        self.buckets[index] = None;\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d int->string */\ntypedef struct {\n    int key;\n    char *val;\n} Pair;\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\ntypedef struct {\n    Pair *buckets[MAX_SIZE];\n} ArrayHashMap;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\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/* \u65b0\u589e\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/* \u522a\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/* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\nvoid pairSet(ArrayHashMap *hmap, MapSet *set) {\n    Pair *entries;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u7372\u53d6\u6240\u6709\u9375 */\nvoid keySet(ArrayHashMap *hmap, MapSet *set) {\n    int *keys;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u7372\u53d6\u6240\u6709\u503c */\nvoid valueSet(ArrayHashMap *hmap, MapSet *set) {\n    char **vals;\n    int i = 0, index = 0;\n    int total = 0;\n    /* \u7d71\u8a08\u6709\u6548\u9375\u503c\u5c0d\u6578\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/* \u5217\u5370\u96dc\u6e4a\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
    /* \u9375\u503c\u5c0d */\nclass Pair(\n    var key: Int,\n    var _val: String\n)\n\n/* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 */\nclass ArrayHashMap {\n    // \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    private val buckets = arrayOfNulls<Pair>(100)\n\n    /* \u96dc\u6e4a\u51fd\u5f0f */\n    fun hashFunc(key: Int): Int {\n        val index = key % 100\n        return index\n    }\n\n    /* \u67e5\u8a62\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    /* \u65b0\u589e\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    /* \u522a\u9664\u64cd\u4f5c */\n    fun remove(key: Int) {\n        val index = hashFunc(key)\n        // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n        buckets[index] = null\n    }\n\n    /* \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d */\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    /* \u7372\u53d6\u6240\u6709\u9375 */\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    /* \u7372\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    /* \u5217\u5370\u96dc\u6e4a\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
    ### \u9375\u503c\u5c0d ###\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\u8868 ###\nclass ArrayHashMap\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    # \u521d\u59cb\u5316\u9663\u5217\uff0c\u5305\u542b 100 \u500b\u6876\n    @buckets = Array.new(100)\n  end\n\n  ### \u96dc\u6e4a\u51fd\u5f0f ###\n  def hash_func(key)\n    index = key % 100\n  end\n\n  ### \u67e5\u8a62\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  ### \u65b0\u589e\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  ### \u522a\u9664\u64cd\u4f5c ###\n  def remove(key)\n    index = hash_func(key)\n    # \u7f6e\u70ba nil \uff0c\u4ee3\u8868\u522a\u9664\n    @buckets[index] = nil\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d ###\n  def entry_set\n    result = []\n    @buckets.each { |pair| result << pair unless pair.nil? }\n    result\n  end\n\n  ### \u7372\u53d6\u6240\u6709\u9375 ###\n  def key_set\n    result = []\n    @buckets.each { |pair| result << pair.key unless pair.nil? }\n    result\n  end\n\n  ### \u7372\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  ### \u5217\u5370\u96dc\u6e4a\u8868 ###\n  def print\n    @buckets.each { |pair| puts \"#{pair.key} -> #{pair.val}\" unless pair.nil? }\n  end\nend\n
    array_hash_map.zig
    // \u9375\u503c\u5c0d\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u96dc\u6e4a\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        // \u5efa\u69cb\u5b50\n        pub fn init(self: *Self, allocator: std.mem.Allocator) !void {\n            self.mem_allocator = allocator;\n            // \u521d\u59cb\u5316\u4e00\u500b\u9577\u5ea6\u70ba 100 \u7684\u6876\uff08\u9663\u5217\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\u69cb\u51fd\u5f0f\n        pub fn deinit(self: *Self) void {\n            if (self.bucket != null) self.bucket.?.deinit();\n        }\n\n        // \u96dc\u6e4a\u51fd\u5f0f\n        fn hashFunc(key: usize) usize {\n            var index = key % 100;\n            return index;\n        }\n\n        // \u67e5\u8a62\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        // \u65b0\u589e\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        // \u522a\u9664\u64cd\u4f5c\n        pub fn remove(self: *Self, key: usize) !void {\n            var index = hashFunc(key);\n            // \u7f6e\u70ba null \uff0c\u4ee3\u8868\u522a\u9664\n            self.bucket.?.items[index] = null;\n        }       \n\n        // \u7372\u53d6\u6240\u6709\u9375\u503c\u5c0d\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        // \u7372\u53d6\u6240\u6709\u9375\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        // \u7372\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        // \u5217\u5370\u96dc\u6e4a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_hashing/hash_map/#613","title":"6.1.3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u8207\u64f4\u5bb9","text":"

    \u5f9e\u672c\u8cea\u4e0a\u770b\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u4f5c\u7528\u662f\u5c07\u6240\u6709 key \u69cb\u6210\u7684\u8f38\u5165\u7a7a\u9593\u5c0d\u6620\u5230\u9663\u5217\u6240\u6709\u7d22\u5f15\u69cb\u6210\u7684\u8f38\u51fa\u7a7a\u9593\uff0c\u800c\u8f38\u5165\u7a7a\u9593\u5f80\u5f80\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\u3002\u56e0\u6b64\uff0c\u7406\u8ad6\u4e0a\u4e00\u5b9a\u5b58\u5728\u201c\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u76f8\u540c\u8f38\u51fa\u201d\u7684\u60c5\u6cc1\u3002

    \u5c0d\u65bc\u4e0a\u8ff0\u793a\u4f8b\u4e2d\u7684\u96dc\u6e4a\u51fd\u5f0f\uff0c\u7576\u8f38\u5165\u7684 key \u5f8c\u5169\u4f4d\u76f8\u540c\u6642\uff0c\u96dc\u6e4a\u51fd\u5f0f\u7684\u8f38\u51fa\u7d50\u679c\u4e5f\u76f8\u540c\u3002\u4f8b\u5982\uff0c\u67e5\u8a62\u5b78\u865f\u70ba 12836 \u548c 20336 \u7684\u5169\u500b\u5b78\u751f\u6642\uff0c\u6211\u5011\u5f97\u5230\uff1a

    12836 % 100 = 36\n20336 % 100 = 36\n

    \u5982\u5716 6-3 \u6240\u793a\uff0c\u5169\u500b\u5b78\u865f\u6307\u5411\u4e86\u540c\u4e00\u500b\u59d3\u540d\uff0c\u9019\u986f\u7136\u662f\u4e0d\u5c0d\u7684\u3002\u6211\u5011\u5c07\u9019\u7a2e\u591a\u500b\u8f38\u5165\u5c0d\u61c9\u540c\u4e00\u8f38\u51fa\u7684\u60c5\u6cc1\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\uff08hash collision\uff09\u3002

    \u5716 6-3 \u00a0 \u96dc\u6e4a\u885d\u7a81\u793a\u4f8b

    \u5bb9\u6613\u60f3\u5230\uff0c\u96dc\u6e4a\u8868\u5bb9\u91cf \\(n\\) \u8d8a\u5927\uff0c\u591a\u500b key \u88ab\u5206\u914d\u5230\u540c\u4e00\u500b\u6876\u4e2d\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\uff0c\u885d\u7a81\u5c31\u8d8a\u5c11\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002

    \u5982\u5716 6-4 \u6240\u793a\uff0c\u64f4\u5bb9\u524d\u9375\u503c\u5c0d (136, A) \u548c (236, D) \u767c\u751f\u885d\u7a81\uff0c\u64f4\u5bb9\u5f8c\u885d\u7a81\u6d88\u5931\u3002

    \u5716 6-4 \u00a0 \u96dc\u6e4a\u8868\u64f4\u5bb9

    \u985e\u4f3c\u65bc\u9663\u5217\u64f4\u5bb9\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u9700\u5c07\u6240\u6709\u9375\u503c\u5c0d\u5f9e\u539f\u96dc\u6e4a\u8868\u9077\u79fb\u81f3\u65b0\u96dc\u6e4a\u8868\uff0c\u975e\u5e38\u8017\u6642\uff1b\u4e26\u4e14\u7531\u65bc\u96dc\u6e4a\u8868\u5bb9\u91cf capacity \u6539\u8b8a\uff0c\u6211\u5011\u9700\u8981\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u4f86\u91cd\u65b0\u8a08\u7b97\u6240\u6709\u9375\u503c\u5c0d\u7684\u5132\u5b58\u4f4d\u7f6e\uff0c\u9019\u9032\u4e00\u6b65\u589e\u52a0\u4e86\u64f4\u5bb9\u904e\u7a0b\u7684\u8a08\u7b97\u958b\u92b7\u3002\u70ba\u6b64\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u9810\u7559\u8db3\u5920\u5927\u7684\u96dc\u6e4a\u8868\u5bb9\u91cf\uff0c\u9632\u6b62\u983b\u7e41\u64f4\u5bb9\u3002

    \u8ca0\u8f09\u56e0\u5b50\uff08load factor\uff09\u662f\u96dc\u6e4a\u8868\u7684\u4e00\u500b\u91cd\u8981\u6982\u5ff5\uff0c\u5176\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u7684\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u7528\u65bc\u8861\u91cf\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u4e5f\u5e38\u4f5c\u70ba\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u89f8\u767c\u689d\u4ef6\u3002\u4f8b\u5982\u5728 Java \u4e2d\uff0c\u7576\u8ca0\u8f09\u56e0\u5b50\u8d85\u904e \\(0.75\\) \u6642\uff0c\u7cfb\u7d71\u6703\u5c07\u96dc\u6e4a\u8868\u64f4\u5bb9\u81f3\u539f\u5148\u7684 \\(2\\) \u500d\u3002

    "},{"location":"chapter_hashing/summary/","title":"6.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_hashing/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u8f38\u5165 key \uff0c\u96dc\u6e4a\u8868\u80fd\u5920\u5728 \\(O(1)\\) \u6642\u9593\u5167\u67e5\u8a62\u5230 value \uff0c\u6548\u7387\u975e\u5e38\u9ad8\u3002
    • \u5e38\u898b\u7684\u96dc\u6e4a\u8868\u64cd\u4f5c\u5305\u62ec\u67e5\u8a62\u3001\u65b0\u589e\u9375\u503c\u5c0d\u3001\u522a\u9664\u9375\u503c\u5c0d\u548c\u8d70\u8a2a\u96dc\u6e4a\u8868\u7b49\u3002
    • \u96dc\u6e4a\u51fd\u5f0f\u5c07 key \u5c0d\u6620\u70ba\u9663\u5217\u7d22\u5f15\uff0c\u5f9e\u800c\u8a2a\u554f\u5c0d\u61c9\u6876\u4e26\u7372\u53d6 value \u3002
    • \u5169\u500b\u4e0d\u540c\u7684 key \u53ef\u80fd\u5728\u7d93\u904e\u96dc\u6e4a\u51fd\u5f0f\u5f8c\u5f97\u5230\u76f8\u540c\u7684\u9663\u5217\u7d22\u5f15\uff0c\u5c0e\u81f4\u67e5\u8a62\u7d50\u679c\u51fa\u932f\uff0c\u9019\u7a2e\u73fe\u8c61\u88ab\u7a31\u70ba\u96dc\u6e4a\u885d\u7a81\u3002
    • \u96dc\u6e4a\u8868\u5bb9\u91cf\u8d8a\u5927\uff0c\u96dc\u6e4a\u885d\u7a81\u7684\u6a5f\u7387\u5c31\u8d8a\u4f4e\u3002\u56e0\u6b64\u53ef\u4ee5\u900f\u904e\u64f4\u5bb9\u96dc\u6e4a\u8868\u4f86\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\u3002\u8207\u9663\u5217\u64f4\u5bb9\u985e\u4f3c\uff0c\u96dc\u6e4a\u8868\u64f4\u5bb9\u64cd\u4f5c\u7684\u958b\u92b7\u5f88\u5927\u3002
    • \u8ca0\u8f09\u56e0\u5b50\u5b9a\u7fa9\u70ba\u96dc\u6e4a\u8868\u4e2d\u5143\u7d20\u6578\u91cf\u9664\u4ee5\u6876\u6578\u91cf\uff0c\u53cd\u6620\u4e86\u96dc\u6e4a\u885d\u7a81\u7684\u56b4\u91cd\u7a0b\u5ea6\uff0c\u5e38\u7528\u4f5c\u89f8\u767c\u96dc\u6e4a\u8868\u64f4\u5bb9\u7684\u689d\u4ef6\u3002
    • \u93c8\u5f0f\u4f4d\u5740\u900f\u904e\u5c07\u55ae\u500b\u5143\u7d20\u8f49\u5316\u70ba\u93c8\u7d50\u4e32\u5217\uff0c\u5c07\u6240\u6709\u885d\u7a81\u5143\u7d20\u5132\u5b58\u5728\u540c\u4e00\u500b\u93c8\u7d50\u4e32\u5217\u4e2d\u3002\u7136\u800c\uff0c\u93c8\u7d50\u4e32\u5217\u904e\u9577\u6703\u964d\u4f4e\u67e5\u8a62\u6548\u7387\uff0c\u53ef\u4ee5\u900f\u904e\u9032\u4e00\u6b65\u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u7d05\u9ed1\u6a39\u4f86\u63d0\u9ad8\u6548\u7387\u3002
    • \u958b\u653e\u5b9a\u5740\u900f\u904e\u591a\u6b21\u63a2\u6e2c\u4f86\u8655\u7406\u96dc\u6e4a\u885d\u7a81\u3002\u7dda\u6027\u63a2\u67e5\u4f7f\u7528\u56fa\u5b9a\u6b65\u9577\uff0c\u7f3a\u9ede\u662f\u4e0d\u80fd\u522a\u9664\u5143\u7d20\uff0c\u4e14\u5bb9\u6613\u7522\u751f\u805a\u96c6\u3002\u591a\u6b21\u96dc\u6e4a\u4f7f\u7528\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u9032\u884c\u63a2\u6e2c\uff0c\u76f8\u8f03\u7dda\u6027\u63a2\u67e5\u66f4\u4e0d\u6613\u7522\u751f\u805a\u96c6\uff0c\u4f46\u591a\u500b\u96dc\u6e4a\u51fd\u5f0f\u589e\u52a0\u4e86\u8a08\u7b97\u91cf\u3002
    • \u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u63a1\u53d6\u4e86\u4e0d\u540c\u7684\u96dc\u6e4a\u8868\u5be6\u73fe\u3002\u4f8b\u5982\uff0cJava \u7684 HashMap \u4f7f\u7528\u93c8\u5f0f\u4f4d\u5740\uff0c\u800c Python \u7684 Dict \u63a1\u7528\u958b\u653e\u5b9a\u5740\u3002
    • \u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u6211\u5011\u5e0c\u671b\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5177\u6709\u78ba\u5b9a\u6027\u3001\u9ad8\u6548\u7387\u548c\u5747\u52fb\u5206\u4f48\u7684\u7279\u9ede\u3002\u5728\u5bc6\u78bc\u5b78\u4e2d\uff0c\u96dc\u6e4a\u6f14\u7b97\u6cd5\u9084\u61c9\u8a72\u5177\u5099\u6297\u78b0\u649e\u6027\u548c\u96ea\u5d29\u6548\u61c9\u3002
    • \u96dc\u6e4a\u6f14\u7b97\u6cd5\u901a\u5e38\u63a1\u7528\u5927\u8cea\u6578\u4f5c\u70ba\u6a21\u6578\uff0c\u4ee5\u6700\u5927\u5316\u5730\u4fdd\u8b49\u96dc\u6e4a\u503c\u5747\u52fb\u5206\u4f48\uff0c\u6e1b\u5c11\u96dc\u6e4a\u885d\u7a81\u3002
    • \u5e38\u898b\u7684\u96dc\u6e4a\u6f14\u7b97\u6cd5\u5305\u62ec MD5\u3001SHA-1\u3001SHA-2 \u548c SHA-3 \u7b49\u3002MD5 \u5e38\u7528\u65bc\u6821\u9a57\u6a94\u6848\u5b8c\u6574\u6027\uff0cSHA-2 \u5e38\u7528\u65bc\u5b89\u5168\u61c9\u7528\u8207\u5354\u8b70\u3002
    • \u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u6703\u70ba\u8cc7\u6599\u578b\u5225\u63d0\u4f9b\u5167\u5efa\u96dc\u6e4a\u6f14\u7b97\u6cd5\uff0c\u7528\u65bc\u8a08\u7b97\u96dc\u6e4a\u8868\u4e2d\u7684\u6876\u7d22\u5f15\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u53ea\u6709\u4e0d\u53ef\u8b8a\u7269\u4ef6\u662f\u53ef\u96dc\u6e4a\u7684\u3002
    "},{"location":"chapter_hashing/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f \\(O(n)\\) \uff1f

    \u7576\u96dc\u6e4a\u885d\u7a81\u6bd4\u8f03\u56b4\u91cd\u6642\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u9000\u5316\u81f3 \\(O(n)\\) \u3002\u7576\u96dc\u6e4a\u51fd\u5f0f\u8a2d\u8a08\u5f97\u6bd4\u8f03\u597d\u3001\u5bb9\u91cf\u8a2d\u5b9a\u6bd4\u8f03\u5408\u7406\u3001\u885d\u7a81\u6bd4\u8f03\u5e73\u5747\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002\u6211\u5011\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u96dc\u6e4a\u8868\u6642\uff0c\u901a\u5e38\u8a8d\u70ba\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(1)\\) \u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u4e0d\u4f7f\u7528\u96dc\u6e4a\u51fd\u5f0f \\(f(x) = x\\) \u5462\uff1f\u9019\u6a23\u5c31\u4e0d\u6703\u6709\u885d\u7a81\u4e86\u3002

    \u5728 \\(f(x) = x\\) \u96dc\u6e4a\u51fd\u5f0f\u4e0b\uff0c\u6bcf\u500b\u5143\u7d20\u5c0d\u61c9\u552f\u4e00\u7684\u6876\u7d22\u5f15\uff0c\u9019\u8207\u9663\u5217\u7b49\u50f9\u3002\u7136\u800c\uff0c\u8f38\u5165\u7a7a\u9593\u901a\u5e38\u9060\u5927\u65bc\u8f38\u51fa\u7a7a\u9593\uff08\u9663\u5217\u9577\u5ea6\uff09\uff0c\u56e0\u6b64\u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6\u53d6\u6a21\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96dc\u6e4a\u8868\u7684\u76ee\u6a19\u662f\u5c07\u4e00\u500b\u8f03\u5927\u7684\u72c0\u614b\u7a7a\u9593\u5c0d\u6620\u5230\u4e00\u500b\u8f03\u5c0f\u7684\u7a7a\u9593\uff0c\u4e26\u63d0\u4f9b \\(O(1)\\) \u7684\u67e5\u8a62\u6548\u7387\u3002

    Q\uff1a\u96dc\u6e4a\u8868\u5e95\u5c64\u5be6\u73fe\u662f\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u4e8c\u5143\u6a39\uff0c\u4f46\u70ba\u4ec0\u9ebc\u6548\u7387\u53ef\u4ee5\u6bd4\u5b83\u5011\u66f4\u9ad8\u5462\uff1f

    \u9996\u5148\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u6548\u7387\u8b8a\u9ad8\uff0c\u4f46\u7a7a\u9593\u6548\u7387\u8b8a\u4f4e\u4e86\u3002\u96dc\u6e4a\u8868\u6709\u76f8\u7576\u4e00\u90e8\u5206\u8a18\u61b6\u9ad4\u672a\u4f7f\u7528\u3002

    \u5176\u6b21\uff0c\u53ea\u662f\u5728\u7279\u5b9a\u4f7f\u7528\u5834\u666f\u4e0b\u6642\u9593\u6548\u7387\u8b8a\u9ad8\u4e86\u3002\u5982\u679c\u4e00\u500b\u529f\u80fd\u80fd\u5920\u5728\u76f8\u540c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u4f7f\u7528\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff0c\u90a3\u9ebc\u901a\u5e38\u6bd4\u96dc\u6e4a\u8868\u66f4\u5feb\u3002\u9019\u662f\u56e0\u70ba\u96dc\u6e4a\u51fd\u5f0f\u8a08\u7b97\u9700\u8981\u958b\u92b7\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u7684\u5e38\u6578\u9805\u66f4\u5927\u3002

    \u6700\u5f8c\uff0c\u96dc\u6e4a\u8868\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u80fd\u767c\u751f\u52a3\u5316\u3002\u4f8b\u5982\u5728\u93c8\u5f0f\u4f4d\u5740\u4e2d\uff0c\u6211\u5011\u63a1\u53d6\u5728\u93c8\u7d50\u4e32\u5217\u6216\u7d05\u9ed1\u6a39\u4e2d\u57f7\u884c\u67e5\u8a62\u64cd\u4f5c\uff0c\u4ecd\u7136\u6709\u9000\u5316\u81f3 \\(O(n)\\) \u6642\u9593\u7684\u98a8\u96aa\u3002

    Q\uff1a\u591a\u6b21\u96dc\u6e4a\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\u55ce\uff1f\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u9084\u80fd\u518d\u6b21\u4f7f\u7528\u55ce\uff1f

    \u591a\u6b21\u96dc\u6e4a\u662f\u958b\u653e\u5b9a\u5740\u7684\u4e00\u7a2e\uff0c\u958b\u653e\u5b9a\u5740\u6cd5\u90fd\u6709\u4e0d\u80fd\u76f4\u63a5\u522a\u9664\u5143\u7d20\u7684\u7f3a\u9677\uff0c\u9700\u8981\u900f\u904e\u6a19\u8a18\u522a\u9664\u3002\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u7a7a\u9593\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u3002\u7576\u5c07\u65b0\u5143\u7d20\u63d2\u5165\u96dc\u6e4a\u8868\uff0c\u4e26\u4e14\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u6a19\u8a18\u70ba\u5df2\u522a\u9664\u7684\u4f4d\u7f6e\u6642\uff0c\u8a72\u4f4d\u7f6e\u53ef\u4ee5\u88ab\u65b0\u5143\u7d20\u4f7f\u7528\u3002\u9019\u6a23\u505a\u65e2\u80fd\u4fdd\u6301\u96dc\u6e4a\u8868\u7684\u63a2\u6e2c\u5e8f\u5217\u4e0d\u8b8a\uff0c\u53c8\u80fd\u4fdd\u8b49\u96dc\u6e4a\u8868\u7684\u7a7a\u9593\u4f7f\u7528\u7387\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u7dda\u4e0a\u6027\u63a2\u67e5\u4e2d\uff0c\u67e5\u8a62\u5143\u7d20\u7684\u6642\u5019\u6703\u51fa\u73fe\u96dc\u6e4a\u885d\u7a81\u5462\uff1f

    \u67e5\u8a62\u7684\u6642\u5019\u900f\u904e\u96dc\u6e4a\u51fd\u5f0f\u627e\u5230\u5c0d\u61c9\u7684\u6876\u548c\u9375\u503c\u5c0d\uff0c\u767c\u73fe key \u4e0d\u5339\u914d\uff0c\u9019\u5c31\u4ee3\u8868\u6709\u96dc\u6e4a\u885d\u7a81\u3002\u56e0\u6b64\uff0c\u7dda\u6027\u63a2\u67e5\u6cd5\u6703\u6839\u64da\u9810\u5148\u8a2d\u5b9a\u7684\u6b65\u9577\u4f9d\u6b21\u5411\u4e0b\u67e5\u8a62\uff0c\u76f4\u81f3\u627e\u5230\u6b63\u78ba\u7684\u9375\u503c\u5c0d\u6216\u7121\u6cd5\u627e\u5230\u8df3\u51fa\u70ba\u6b62\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc\u96dc\u6e4a\u8868\u64f4\u5bb9\u80fd\u5920\u7de9\u89e3\u96dc\u6e4a\u885d\u7a81\uff1f

    \u96dc\u6e4a\u51fd\u5f0f\u7684\u6700\u5f8c\u4e00\u6b65\u5f80\u5f80\u662f\u5c0d\u9663\u5217\u9577\u5ea6 \\(n\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\uff0c\u8b93\u8f38\u51fa\u503c\u843d\u5728\u9663\u5217\u7d22\u5f15\u7bc4\u570d\u5167\uff1b\u5728\u64f4\u5bb9\u5f8c\uff0c\u9663\u5217\u9577\u5ea6 \\(n\\) \u767c\u751f\u8b8a\u5316\uff0c\u800c key \u5c0d\u61c9\u7684\u7d22\u5f15\u4e5f\u53ef\u80fd\u767c\u751f\u8b8a\u5316\u3002\u539f\u5148\u843d\u5728\u540c\u4e00\u500b\u6876\u7684\u591a\u500b key \uff0c\u5728\u64f4\u5bb9\u5f8c\u53ef\u80fd\u6703\u88ab\u5206\u914d\u5230\u591a\u500b\u6876\u4e2d\uff0c\u5f9e\u800c\u5be6\u73fe\u96dc\u6e4a\u885d\u7a81\u7684\u7de9\u89e3\u3002

    "},{"location":"chapter_heap/","title":"\u7b2c 8 \u7ae0 \u00a0 \u5806\u7a4d","text":"

    Abstract

    \u5806\u7a4d\u5c31\u50cf\u662f\u5c71\u5dbd\u5cf0\u5dd2\uff0c\u5c64\u758a\u8d77\u4f0f\u3001\u5f62\u614b\u5404\u7570\u3002

    \u5ea7\u5ea7\u5c71\u5cf0\u9ad8\u4f4e\u932f\u843d\uff0c\u800c\u6700\u9ad8\u7684\u5c71\u5cf0\u7e3d\u662f\u6700\u5148\u6620\u5165\u773c\u7c3e\u3002

    "},{"location":"chapter_heap/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 8.1 \u00a0 \u5806\u7a4d
    • 8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c
    • 8.3 \u00a0 Top-k \u554f\u984c
    • 8.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_heap/build_heap/","title":"8.2 \u00a0 \u5efa\u5806\u7a4d\u64cd\u4f5c","text":"

    \u5728\u67d0\u4e9b\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u5e0c\u671b\u4f7f\u7528\u4e00\u500b\u4e32\u5217\u7684\u6240\u6709\u5143\u7d20\u4f86\u69cb\u5efa\u4e00\u500b\u5806\u7a4d\uff0c\u9019\u500b\u904e\u7a0b\u88ab\u7a31\u70ba\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u3002

    "},{"location":"chapter_heap/build_heap/#821","title":"8.2.1 \u00a0 \u85c9\u52a9\u5165\u5806\u7a4d\u64cd\u4f5c\u5be6\u73fe","text":"

    \u6211\u5011\u9996\u5148\u5efa\u7acb\u4e00\u500b\u7a7a\u5806\u7a4d\uff0c\u7136\u5f8c\u8d70\u8a2a\u4e32\u5217\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u5143\u7d20\u57f7\u884c\u201c\u5165\u5806\u7a4d\u64cd\u4f5c\u201d\uff0c\u5373\u5148\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u5806\u7a4d\u7684\u5c3e\u90e8\uff0c\u518d\u5c0d\u8a72\u5143\u7d20\u57f7\u884c\u201c\u5f9e\u5e95\u81f3\u9802\u201d\u5806\u7a4d\u5316\u3002

    \u6bcf\u7576\u4e00\u500b\u5143\u7d20\u5165\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u5c31\u52a0\u4e00\u3002\u7531\u65bc\u7bc0\u9ede\u662f\u5f9e\u9802\u5230\u5e95\u4f9d\u6b21\u88ab\u65b0\u589e\u9032\u4e8c\u5143\u6a39\u7684\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0a\u800c\u4e0b\u201d\u69cb\u5efa\u7684\u3002

    \u8a2d\u5143\u7d20\u6578\u91cf\u70ba \\(n\\) \uff0c\u6bcf\u500b\u5143\u7d20\u7684\u5165\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(\\log{n})\\) \u6642\u9593\uff0c\u56e0\u6b64\u8a72\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    "},{"location":"chapter_heap/build_heap/#822","title":"8.2.2 \u00a0 \u900f\u904e\u8d70\u8a2a\u5806\u7a4d\u5316\u5be6\u73fe","text":"

    \u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5be6\u73fe\u4e00\u7a2e\u66f4\u70ba\u9ad8\u6548\u7684\u5efa\u5806\u7a4d\u65b9\u6cd5\uff0c\u5171\u5206\u70ba\u5169\u6b65\u3002

    1. \u5c07\u4e32\u5217\u6240\u6709\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u5730\u65b0\u589e\u5230\u5806\u7a4d\u4e2d\uff0c\u6b64\u6642\u5806\u7a4d\u7684\u6027\u8cea\u5c1a\u672a\u5f97\u5230\u6eff\u8db3\u3002
    2. \u5012\u5e8f\u8d70\u8a2a\u5806\u7a4d\uff08\u5c64\u5e8f\u8d70\u8a2a\u7684\u5012\u5e8f\uff09\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u500b\u975e\u8449\u7bc0\u9ede\u57f7\u884c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u3002

    \u6bcf\u7576\u5806\u7a4d\u5316\u4e00\u500b\u7bc0\u9ede\u5f8c\uff0c\u4ee5\u8a72\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\u5c31\u5f62\u6210\u4e00\u500b\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\u3002\u800c\u7531\u65bc\u662f\u5012\u5e8f\u8d70\u8a2a\uff0c\u56e0\u6b64\u5806\u7a4d\u662f\u201c\u81ea\u4e0b\u800c\u4e0a\u201d\u69cb\u5efa\u7684\u3002

    \u4e4b\u6240\u4ee5\u9078\u64c7\u5012\u5e8f\u8d70\u8a2a\uff0c\u662f\u56e0\u70ba\u9019\u6a23\u80fd\u5920\u4fdd\u8b49\u7576\u524d\u7bc0\u9ede\u4e4b\u4e0b\u7684\u5b50\u6a39\u5df2\u7d93\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u9019\u6a23\u5806\u7a4d\u5316\u7576\u524d\u7bc0\u9ede\u624d\u662f\u6709\u6548\u7684\u3002

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u7531\u65bc\u8449\u7bc0\u9ede\u6c92\u6709\u5b50\u7bc0\u9ede\uff0c\u56e0\u6b64\u5b83\u5011\u5929\u7136\u5c31\u662f\u5408\u6cd5\u7684\u5b50\u5806\u7a4d\uff0c\u7121\u9808\u5806\u7a4d\u5316\u3002\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\uff0c\u6700\u5f8c\u4e00\u500b\u975e\u8449\u7bc0\u9ede\u662f\u6700\u5f8c\u4e00\u500b\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff0c\u6211\u5011\u5f9e\u5b83\u958b\u59cb\u5012\u5e8f\u8d70\u8a2a\u4e26\u57f7\u884c\u5806\u7a4d\u5316\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def __init__(self, nums: list[int]):\n    \"\"\"\u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\"\"\"\n    # \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    self.max_heap = nums\n    # \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(self.parent(self.size() - 1), -1, -1):\n        self.sift_down(i)\n
    my_heap.cpp
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(vector<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums;\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.java
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<Integer> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new ArrayList<>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = parent(size() - 1); i >= 0; i--) {\n        siftDown(i);\n    }\n}\n
    my_heap.cs
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(IEnumerable<int> nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = new List<int>(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var size = Parent(this.Size() - 1);\n    for (int i = size; i >= 0; i--) {\n        SiftDown(i);\n    }\n}\n
    my_heap.go
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nfunc newMaxHeap(nums []any) *maxHeap {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    h := &maxHeap{data: nums}\n    for i := h.parent(len(h.data) - 1); i >= 0; i-- {\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        h.siftDown(i)\n    }\n    return h\n}\n
    my_heap.swift
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\ninit(nums: [Int]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    maxHeap = nums\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0 ... parent(i: size() - 1)).reversed() {\n        siftDown(i: i)\n    }\n}\n
    my_heap.js
    /* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.#maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.#parent(this.size() - 1); i >= 0; i--) {\n        this.#siftDown(i);\n    }\n}\n
    my_heap.ts
    /* \u5efa\u69cb\u5b50\uff0c\u5efa\u7acb\u7a7a\u5806\u7a4d\u6216\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nconstructor(nums?: number[]) {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    this.maxHeap = nums === undefined ? [] : [...nums];\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = this.parent(this.size() - 1); i >= 0; i--) {\n        this.siftDown(i);\n    }\n}\n
    my_heap.dart
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nMaxHeap(List<int> nums) {\n  // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n  _maxHeap = nums;\n  // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = _parent(size() - 1); i >= 0; i--) {\n    siftDown(i);\n  }\n}\n
    my_heap.rs
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\nfn new(nums: Vec<i32>) -> Self {\n    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    let mut heap = MaxHeap { max_heap: nums };\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=Self::parent(heap.size() - 1)).rev() {\n        heap.sift_down(i);\n    }\n    heap\n}\n
    my_heap.c
    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u5207\u7247\u5efa\u5806\u7a4d */\nMaxHeap *newMaxHeap(int nums[], int size) {\n    // \u6240\u6709\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        siftDown(maxHeap, i);\n    }\n    return maxHeap;\n}\n
    my_heap.kt
    /* \u5927\u9802\u5806\u7a4d */\nclass MaxHeap(nums: MutableList<Int>?) {\n    // \u4f7f\u7528\u4e32\u5217\u800c\u975e\u9663\u5217\uff0c\u9019\u6a23\u7121\u9808\u8003\u616e\u64f4\u5bb9\u554f\u984c\n    private val maxHeap = mutableListOf<Int>()\n\n    /* \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d */\n    init {\n        // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n        maxHeap.addAll(nums!!)\n        // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n        for (i in parent(size() - 1) downTo 0) {\n            siftDown(i)\n        }\n    }\n\n    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    private fun parent(i: Int): Int {\n        return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u4ea4\u63db\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    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    fun size(): Int {\n        return maxHeap.size\n    }\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n        return size() == 0\n    }\n\n    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        return maxHeap[0]\n    }\n\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    fun push(_val: Int) {\n        // \u65b0\u589e\u7bc0\u9ede\n        maxHeap.add(_val)\n        // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n        siftUp(size() - 1)\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n    private fun siftUp(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n            val p = parent(i)\n            // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n            if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, p)\n            // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n            i = p\n        }\n    }\n\n    /* \u5143\u7d20\u51fa\u5806\u7a4d */\n    fun pop(): Int {\n        // \u5224\u7a7a\u8655\u7406\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(0, size() - 1)\n        // \u522a\u9664\u7bc0\u9ede\n        val _val = maxHeap.removeAt(size() - 1)\n        // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n        siftDown(0)\n        // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n        return _val\n    }\n\n    /* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n    private fun siftDown(it: Int) {\n        // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n        var i = it\n        while (true) {\n            // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n            if (ma == i) break\n            // \u4ea4\u63db\u5169\u7bc0\u9ede\n            swap(i, ma)\n            // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n            i = ma\n        }\n    }\n\n    /* \u5217\u5370\u5806\u7a4d\uff08\u4e8c\u5143\u6a39\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
    [class]{MaxHeap}-[func]{__init__}\n
    my_heap.zig
    // \u5efa\u69cb\u5b50\uff0c\u6839\u64da\u8f38\u5165\u4e32\u5217\u5efa\u5806\u7a4d\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    // \u5c07\u4e32\u5217\u5143\u7d20\u539f\u5c01\u4e0d\u52d5\u65b0\u589e\u9032\u5806\u7a4d\n    try self.max_heap.?.appendSlice(nums);\n    // \u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    var i: usize = parent(self.size() - 1) + 1;\n    while (i > 0) : (i -= 1) {\n        try self.siftDown(i - 1);\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/build_heap/#823","title":"8.2.3 \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"

    \u4e0b\u9762\uff0c\u6211\u5011\u4f86\u5617\u8a66\u63a8\u7b97\u7b2c\u4e8c\u7a2e\u5efa\u5806\u7a4d\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002

    • \u5047\u8a2d\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \uff0c\u5247\u8449\u7bc0\u9ede\u6578\u91cf\u70ba \\((n + 1) / 2\\) \uff0c\u5176\u4e2d \\(/\\) \u70ba\u5411\u4e0b\u6574\u9664\u3002\u56e0\u6b64\u9700\u8981\u5806\u7a4d\u5316\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\((n - 1) / 2\\) \u3002
    • \u5728\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u7684\u904e\u7a0b\u4e2d\uff0c\u6bcf\u500b\u7bc0\u9ede\u6700\u591a\u5806\u7a4d\u5316\u5230\u8449\u7bc0\u9ede\uff0c\u56e0\u6b64\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u70ba\u4e8c\u5143\u6a39\u9ad8\u5ea6 \\(\\log n\\) \u3002

    \u5c07\u4e0a\u8ff0\u5169\u8005\u76f8\u4e58\uff0c\u53ef\u5f97\u5230\u5efa\u5806\u7a4d\u904e\u7a0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u4f46\u9019\u500b\u4f30\u7b97\u7d50\u679c\u4e26\u4e0d\u6e96\u78ba\uff0c\u56e0\u70ba\u6211\u5011\u6c92\u6709\u8003\u616e\u5230\u4e8c\u5143\u6a39\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf\u9060\u591a\u65bc\u9802\u5c64\u7bc0\u9ede\u7684\u6027\u8cea\u3002

    \u63a5\u4e0b\u4f86\u6211\u5011\u4f86\u9032\u884c\u66f4\u70ba\u6e96\u78ba\u7684\u8a08\u7b97\u3002\u70ba\u4e86\u964d\u4f4e\u8a08\u7b97\u96e3\u5ea6\uff0c\u5047\u8a2d\u7d66\u5b9a\u4e00\u500b\u7bc0\u9ede\u6578\u91cf\u70ba \\(n\\) \u3001\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff0c\u8a72\u5047\u8a2d\u4e0d\u6703\u5f71\u97ff\u8a08\u7b97\u7d50\u679c\u7684\u6b63\u78ba\u6027\u3002

    \u5716 8-5 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u5404\u5c64\u7bc0\u9ede\u6578\u91cf

    \u5982\u5716 8-5 \u6240\u793a\uff0c\u7bc0\u9ede\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u6700\u5927\u8fed\u4ee3\u6b21\u6578\u7b49\u65bc\u8a72\u7bc0\u9ede\u5230\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u800c\u8a72\u8ddd\u96e2\u6b63\u662f\u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u53ef\u4ee5\u5c0d\u5404\u5c64\u7684\u201c\u7bc0\u9ede\u6578\u91cf \\(\\times\\) \u7bc0\u9ede\u9ad8\u5ea6\u201d\u6c42\u548c\uff0c\u5f97\u5230\u6240\u6709\u7bc0\u9ede\u7684\u5806\u7a4d\u5316\u8fed\u4ee3\u6b21\u6578\u7684\u7e3d\u548c\u3002

    \\[ T(h) = 2^0h + 2^1(h-1) + 2^2(h-2) + \\dots + 2^{(h-1)}\\times1 \\]

    \u5316\u7c21\u4e0a\u5f0f\u9700\u8981\u85c9\u52a9\u4e2d\u5b78\u7684\u6578\u5217\u77e5\u8b58\uff0c\u5148\u5c07 \\(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\u932f\u4f4d\u76f8\u6e1b\u6cd5\uff0c\u7528\u4e0b\u5f0f \\(2 T(h)\\) \u6e1b\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 \\]

    \u89c0\u5bdf\u4e0a\u5f0f\uff0c\u767c\u73fe \\(T(h)\\) \u662f\u4e00\u500b\u7b49\u6bd4\u6578\u5217\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u6c42\u548c\u516c\u5f0f\uff0c\u5f97\u5230\u6642\u9593\u8907\u96dc\u5ea6\u70ba\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} \\]

    \u9032\u4e00\u6b65\uff0c\u9ad8\u5ea6\u70ba \\(h\\) \u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6578\u91cf\u70ba \\(n = 2^{h+1} - 1\\) \uff0c\u6613\u5f97\u8907\u96dc\u5ea6\u70ba \\(O(2^h) = O(n)\\) \u3002\u4ee5\u4e0a\u63a8\u7b97\u8868\u660e\uff0c\u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002

    "},{"location":"chapter_heap/heap/","title":"8.1 \u00a0 \u5806\u7a4d","text":"

    \u5806\u7a4d\uff08heap\uff09\u662f\u4e00\u7a2e\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u4e3b\u8981\u53ef\u5206\u70ba\u5169\u7a2e\u578b\u5225\uff0c\u5982\u5716 8-1 \u6240\u793a\u3002

    • \u5c0f\u9802\u5806\u7a4d\uff08min heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\leq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002
    • \u5927\u9802\u5806\u7a4d\uff08max heap\uff09\uff1a\u4efb\u610f\u7bc0\u9ede\u7684\u503c \\(\\geq\\) \u5176\u5b50\u7bc0\u9ede\u7684\u503c\u3002

    \u5716 8-1 \u00a0 \u5c0f\u9802\u5806\u7a4d\u8207\u5927\u9802\u5806\u7a4d

    \u5806\u7a4d\u4f5c\u70ba\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u6700\u5e95\u5c64\u7bc0\u9ede\u9760\u5de6\u586b\u5145\uff0c\u5176\u4ed6\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u3002
    • \u6211\u5011\u5c07\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u9802\u201d\uff0c\u5c07\u5e95\u5c64\u6700\u9760\u53f3\u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5806\u7a4d\u5e95\u201d\u3002
    • \u5c0d\u65bc\u5927\u9802\u5806\u7a4d\uff08\u5c0f\u9802\u5806\u7a4d\uff09\uff0c\u5806\u7a4d\u9802\u5143\u7d20\uff08\u6839\u7bc0\u9ede\uff09\u7684\u503c\u662f\u6700\u5927\uff08\u6700\u5c0f\uff09\u7684\u3002
    "},{"location":"chapter_heap/heap/#811","title":"8.1.1 \u00a0 \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u9700\u8981\u6307\u51fa\u7684\u662f\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u662f\u512a\u5148\u4f47\u5217\uff08priority queue\uff09\uff0c\u9019\u662f\u4e00\u7a2e\u62bd\u8c61\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u5b9a\u7fa9\u70ba\u5177\u6709\u512a\u5148\u9806\u5e8f\u6392\u5e8f\u7684\u4f47\u5217\u3002

    \u5be6\u969b\u4e0a\uff0c\u5806\u7a4d\u901a\u5e38\u7528\u65bc\u5be6\u73fe\u512a\u5148\u4f47\u5217\uff0c\u5927\u9802\u5806\u7a4d\u76f8\u7576\u65bc\u5143\u7d20\u6309\u5f9e\u5927\u5230\u5c0f\u7684\u9806\u5e8f\u51fa\u5217\u7684\u512a\u5148\u4f47\u5217\u3002\u5f9e\u4f7f\u7528\u89d2\u5ea6\u4f86\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u201c\u512a\u5148\u4f47\u5217\u201d\u548c\u201c\u5806\u7a4d\u201d\u770b\u4f5c\u7b49\u50f9\u7684\u8cc7\u6599\u7d50\u69cb\u3002\u56e0\u6b64\uff0c\u672c\u66f8\u5c0d\u5169\u8005\u4e0d\u505a\u7279\u5225\u5340\u5206\uff0c\u7d71\u4e00\u7a31\u4f5c\u201c\u5806\u7a4d\u201d\u3002

    \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u898b\u8868 8-1 \uff0c\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

    \u8868 8-1 \u00a0 \u5806\u7a4d\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\) pop() \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) peek() \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\uff08\u5c0d\u65bc\u5927 / \u5c0f\u9802\u5806\u7a4d\u5206\u5225\u70ba\u6700\u5927 / \u5c0f\u503c\uff09 \\(O(1)\\) size() \u7372\u53d6\u5806\u7a4d\u7684\u5143\u7d20\u6578\u91cf \\(O(1)\\) isEmpty() \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a \\(O(1)\\)

    \u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u63d0\u4f9b\u7684\u5806\u7a4d\u985e\u5225\uff08\u6216\u512a\u5148\u4f47\u5217\u985e\u5225\uff09\u3002

    \u985e\u4f3c\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u201c\u5f9e\u5c0f\u5230\u5927\u6392\u5217\u201d\u548c\u201c\u5f9e\u5927\u5230\u5c0f\u6392\u5217\u201d\uff0c\u6211\u5011\u53ef\u4ee5\u900f\u904e\u8a2d\u5b9a\u4e00\u500b flag \u6216\u4fee\u6539 Comparator \u5be6\u73fe\u201c\u5c0f\u9802\u5806\u7a4d\u201d\u8207\u201c\u5927\u9802\u5806\u7a4d\u201d\u4e4b\u9593\u7684\u8f49\u63db\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap.py
    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nmin_heap, flag = [], 1\n# \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nmax_heap, flag = [], -1\n\n# Python \u7684 heapq \u6a21\u7d44\u9810\u8a2d\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n# \u8003\u616e\u5c07\u201c\u5143\u7d20\u53d6\u8ca0\u201d\u5f8c\u518d\u5165\u5806\u7a4d\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5c07\u5927\u5c0f\u95dc\u4fc2\u985b\u5012\uff0c\u5f9e\u800c\u5be6\u73fe\u5927\u9802\u5806\u7a4d\n# \u5728\u672c\u793a\u4f8b\u4e2d\uff0cflag = 1 \u6642\u5c0d\u61c9\u5c0f\u9802\u5806\u7a4d\uff0cflag = -1 \u6642\u5c0d\u61c9\u5927\u9802\u5806\u7a4d\n\n# \u5143\u7d20\u5165\u5806\u7a4d\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# \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20\npeek: int = flag * max_heap[0] # 5\n\n# \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\n# \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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# \u7372\u53d6\u5806\u7a4d\u5927\u5c0f\nsize: int = len(max_heap)\n\n# \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a\nis_empty: bool = not max_heap\n\n# \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d\nmin_heap: list[int] = [1, 3, 2, 5, 4]\nheapq.heapify(min_heap)\n
    heap.cpp
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, greater<int>> minHeap;\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\npriority_queue<int, vector<int>, less<int>> maxHeap;\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.push(1);\nmaxHeap.push(3);\nmaxHeap.push(2);\nmaxHeap.push(5);\nmaxHeap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.top(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\u5927\u5230\u5c0f\u7684\u5e8f\u5217\nmaxHeap.pop(); // 5\nmaxHeap.pop(); // 4\nmaxHeap.pop(); // 3\nmaxHeap.pop(); // 2\nmaxHeap.pop(); // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\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\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nQueue<Integer> minHeap = new PriorityQueue<>();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1);\nmaxHeap.offer(3);\nmaxHeap.offer(2);\nmaxHeap.offer(5);\nmaxHeap.offer(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.peek(); // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.size();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = maxHeap.isEmpty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<>(Arrays.asList(1, 3, 2, 5, 4));\n
    heap.cs
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nPriorityQueue<int, int> minHeap = new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\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\u7a4d */\nmaxHeap.Enqueue(1, 1);\nmaxHeap.Enqueue(3, 3);\nmaxHeap.Enqueue(2, 2);\nmaxHeap.Enqueue(5, 5);\nmaxHeap.Enqueue(4, 4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek = maxHeap.Peek();//5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nint size = maxHeap.Count;\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = maxHeap.Count == 0;\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = new PriorityQueue<int, int>([(1, 1), (3, 3), (2, 2), (5, 5), (4, 4)]);\n
    heap.go
    // Go \u8a9e\u8a00\u4e2d\u53ef\u4ee5\u900f\u904e\u5be6\u73fe heap.Interface \u4f86\u69cb\u5efa\u6574\u6578\u5927\u9802\u5806\u7a4d\n// \u5be6\u73fe heap.Interface \u9700\u8981\u540c\u6642\u5be6\u73fe sort.Interface\ntype intHeap []any\n\n// Push heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u63a8\u5165\u5143\u7d20\u5230\u5806\u7a4d\nfunc (h *intHeap) Push(x any) {\n    // Push \u548c Pop \u4f7f\u7528 pointer receiver \u4f5c\u70ba\u53c3\u6578\n    // \u56e0\u70ba\u5b83\u5011\u4e0d\u50c5\u6703\u5c0d\u5207\u7247\u7684\u5167\u5bb9\u9032\u884c\u8abf\u6574\uff0c\u9084\u6703\u4fee\u6539\u5207\u7247\u7684\u9577\u5ea6\u3002\n    *h = append(*h, x.(int))\n}\n\n// Pop heap.Interface \u7684\u65b9\u6cd5\uff0c\u5be6\u73fe\u5f48\u51fa\u5806\u7a4d\u9802\u5143\u7d20\nfunc (h *intHeap) Pop() any {\n    // \u5f85\u51fa\u5806\u7a4d\u5143\u7d20\u5b58\u653e\u5728\u6700\u5f8c\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\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\uff0c\u5247\u9700\u8981\u8abf\u6574\u70ba\u5c0f\u65bc\u865f\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 \u7372\u53d6\u5806\u7a4d\u9802\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\u7a4d */\n    // \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\n    maxHeap := &intHeap{}\n    heap.Init(maxHeap)\n    /* \u5143\u7d20\u5165\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\u65b0\u589e\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    /* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\n    top := maxHeap.Top()\n    fmt.Printf(\"\u5806\u7a4d\u9802\u5143\u7d20\u70ba %d\\n\", top)\n\n    /* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n    // \u547c\u53eb heap.Interface \u7684\u65b9\u6cd5\uff0c\u4f86\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    /* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\n    size := len(*maxHeap)\n    fmt.Printf(\"\u5806\u7a4d\u5143\u7d20\u6578\u91cf\u70ba %d\\n\", size)\n\n    /* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\n    isEmpty := len(*maxHeap) == 0\n    fmt.Printf(\"\u5806\u7a4d\u662f\u5426\u70ba\u7a7a %t\\n\", isEmpty)\n}\n
    heap.swift
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// Swift \u7684 Heap \u578b\u5225\u540c\u6642\u652f\u6301\u6700\u5927\u5806\u7a4d\u548c\u6700\u5c0f\u5806\u7a4d\uff0c\u4e14\u9700\u8981\u5f15\u5165 swift-collections\nvar heap = Heap<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nheap.insert(1)\nheap.insert(3)\nheap.insert(2)\nheap.insert(5)\nheap.insert(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = heap.max()!\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\npeek = heap.removeMax() // 5\npeek = heap.removeMax() // 4\npeek = heap.removeMax() // 3\npeek = heap.removeMax() // 2\npeek = heap.removeMax() // 1\n\n/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = heap.count\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = heap.isEmpty\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet heap2 = Heap([1, 3, 2, 5, 4])\n
    heap.js
    // JavaScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.ts
    // TypeScript \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.dart
    // Dart \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.rs
    use std::collections::BinaryHeap;\nuse std::cmp::Reverse;\n\n/* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nlet mut min_heap = BinaryHeap::<Reverse<i32>>::new();\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\nlet mut max_heap = BinaryHeap::new();\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmax_heap.push(1);\nmax_heap.push(3);\nmax_heap.push(2);\nmax_heap.push(5);\nmax_heap.push(4);\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nlet peek = max_heap.peek().unwrap();  // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nlet size = max_heap.len();\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nlet is_empty = max_heap.is_empty();\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nlet min_heap = BinaryHeap::from(vec![Reverse(1), Reverse(3), Reverse(2), Reverse(5), Reverse(4)]);\n
    heap.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa Heap \u985e\u5225\n
    heap.kt
    /* \u521d\u59cb\u5316\u5806\u7a4d */\n// \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\nvar minHeap = PriorityQueue<Int>()\n// \u521d\u59cb\u5316\u5927\u9802\u5806\u7a4d\uff08\u4f7f\u7528 lambda \u8868\u793a\u5f0f\u4fee\u6539 Comparator \u5373\u53ef\uff09\nval maxHeap = PriorityQueue { a: Int, b: Int -> b - a }\n\n/* \u5143\u7d20\u5165\u5806\u7a4d */\nmaxHeap.offer(1)\nmaxHeap.offer(3)\nmaxHeap.offer(2)\nmaxHeap.offer(5)\nmaxHeap.offer(4)\n\n/* \u7372\u53d6\u5806\u7a4d\u9802\u5143\u7d20 */\nvar peek = maxHeap.peek() // 5\n\n/* \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d */\n// \u51fa\u5806\u7a4d\u5143\u7d20\u6703\u5f62\u6210\u4e00\u500b\u5f9e\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/* \u7372\u53d6\u5806\u7a4d\u5927\u5c0f */\nval size = maxHeap.size\n\n/* \u5224\u65b7\u5806\u7a4d\u662f\u5426\u70ba\u7a7a */\nval isEmpty = maxHeap.isEmpty()\n\n/* \u8f38\u5165\u4e32\u5217\u4e26\u5efa\u5806\u7a4d */\nminHeap = PriorityQueue(mutableListOf(1, 3, 2, 5, 4))\n
    heap.rb
    \n
    heap.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#812","title":"8.1.2 \u00a0 \u5806\u7a4d\u7684\u5be6\u73fe","text":"

    \u4e0b\u6587\u5be6\u73fe\u7684\u662f\u5927\u9802\u5806\u7a4d\u3002\u82e5\u8981\u5c07\u5176\u8f49\u63db\u70ba\u5c0f\u9802\u5806\u7a4d\uff0c\u53ea\u9700\u5c07\u6240\u6709\u5927\u5c0f\u908f\u8f2f\u5224\u65b7\u53d6\u9006\uff08\u4f8b\u5982\uff0c\u5c07 \\(\\geq\\) \u66ff\u63db\u70ba \\(\\leq\\) \uff09\u3002\u611f\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

    "},{"location":"chapter_heap/heap/#1","title":"1. \u00a0 \u5806\u7a4d\u7684\u5132\u5b58\u8207\u8868\u793a","text":"

    \u201c\u4e8c\u5143\u6a39\u201d\u7ae0\u7bc0\u8b1b\u904e\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u7531\u65bc\u5806\u7a4d\u6b63\u662f\u4e00\u7a2e\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u56e0\u6b64\u6211\u5011\u5c07\u63a1\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002

    \u7576\u4f7f\u7528\u9663\u5217\u8868\u793a\u4e8c\u5143\u6a39\u6642\uff0c\u5143\u7d20\u4ee3\u8868\u7bc0\u9ede\u503c\uff0c\u7d22\u5f15\u4ee3\u8868\u7bc0\u9ede\u5728\u4e8c\u5143\u6a39\u4e2d\u7684\u4f4d\u7f6e\u3002\u7bc0\u9ede\u6307\u6a19\u900f\u904e\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u4f86\u5be6\u73fe\u3002

    \u5982\u5716 8-2 \u6240\u793a\uff0c\u7d66\u5b9a\u7d22\u5f15 \\(i\\) \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(2i + 2\\) \uff0c\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\((i - 1) / 2\\)\uff08\u5411\u4e0b\u6574\u9664\uff09\u3002\u7576\u7d22\u5f15\u8d8a\u754c\u6642\uff0c\u8868\u793a\u7a7a\u7bc0\u9ede\u6216\u7bc0\u9ede\u4e0d\u5b58\u5728\u3002

    \u5716 8-2 \u00a0 \u5806\u7a4d\u7684\u8868\u793a\u8207\u5132\u5b58

    \u6211\u5011\u53ef\u4ee5\u5c07\u7d22\u5f15\u5c0d\u6620\u516c\u5f0f\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def left(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 1\n\ndef right(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return 2 * i + 2\n\ndef parent(self, i: int) -> int:\n    \"\"\"\u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n    return (i - 1) // 2  # \u5411\u4e0b\u6574\u9664\n
    my_heap.cpp
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.java
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.cs
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Left(int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Right(int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint Parent(int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.go
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (h *maxHeap) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\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
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc left(i: Int) -> Int {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc right(i: Int) -> Int {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc parent(i: Int) -> Int {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.js
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#left(i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#right(i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n#parent(i) {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.ts
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nleft(i: number): number {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nright(i: number): number {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nparent(i: number): number {\n    return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.dart
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _left(int i) {\n  return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _right(int i) {\n  return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint _parent(int i) {\n  return (i - 1) ~/ 2; // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rs
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn left(i: usize) -> usize {\n    2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn right(i: usize) -> usize {\n    2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfn parent(i: usize) -> usize {\n    (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.c
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint left(MaxHeap *maxHeap, int i) {\n    return 2 * i + 1;\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint right(MaxHeap *maxHeap, int i) {\n    return 2 * i + 2;\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nint parent(MaxHeap *maxHeap, int i) {\n    return (i - 1) / 2; // \u5411\u4e0b\u53d6\u6574\n}\n
    my_heap.kt
    /* \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun left(i: Int): Int {\n    return 2 * i + 1\n}\n\n/* \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun right(i: Int): Int {\n    return 2 * i + 2\n}\n\n/* \u7372\u53d6\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfun parent(i: Int): Int {\n    return (i - 1) / 2 // \u5411\u4e0b\u6574\u9664\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{left}\n\n[class]{MaxHeap}-[func]{right}\n\n[class]{MaxHeap}-[func]{parent}\n
    my_heap.zig
    // \u7372\u53d6\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn left(i: usize) usize {\n    return 2 * i + 1;\n}\n\n// \u7372\u53d6\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\nfn right(i: usize) usize {\n    return 2 * i + 2;\n}\n\n// \u7372\u53d6\u7236\u7bc0\u9ede\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 \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20","text":"

    \u5806\u7a4d\u9802\u5143\u7d20\u5373\u70ba\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u4e5f\u5c31\u662f\u4e32\u5217\u7684\u9996\u500b\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def peek(self) -> int:\n    \"\"\"\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\"\"\"\n    return self.max_heap[0]\n
    my_heap.cpp
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap[0];\n}\n
    my_heap.java
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n    return maxHeap.get(0);\n}\n
    my_heap.cs
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint Peek() {\n    return maxHeap[0];\n}\n
    my_heap.go
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc (h *maxHeap) peek() any {\n    return h.data[0]\n}\n
    my_heap.swift
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunc peek() -> Int {\n    maxHeap[0]\n}\n
    my_heap.js
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek() {\n    return this.#maxHeap[0];\n}\n
    my_heap.ts
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\npeek(): number {\n    return this.maxHeap[0];\n}\n
    my_heap.dart
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek() {\n  return _maxHeap[0];\n}\n
    my_heap.rs
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfn peek(&self) -> Option<i32> {\n    self.max_heap.first().copied()\n}\n
    my_heap.c
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peek(MaxHeap *maxHeap) {\n    return maxHeap->data[0];\n}\n
    my_heap.kt
    /* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfun peek(): Int {\n    return maxHeap[0]\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{peek}\n
    my_heap.zig
    // \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20\nfn peek(self: *Self) T {\n    return self.max_heap.?.items[0];\n}  \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#3","title":"3. \u00a0 \u5143\u7d20\u5165\u5806\u7a4d","text":"

    \u7d66\u5b9a\u5143\u7d20 val \uff0c\u6211\u5011\u9996\u5148\u5c07\u5176\u65b0\u589e\u5230\u5806\u7a4d\u5e95\u3002\u65b0\u589e\u4e4b\u5f8c\uff0c\u7531\u65bc val \u53ef\u80fd\u5927\u65bc\u5806\u7a4d\u4e2d\u5176\u4ed6\u5143\u7d20\uff0c\u5806\u7a4d\u7684\u6210\u7acb\u689d\u4ef6\u53ef\u80fd\u5df2\u88ab\u7834\u58de\uff0c\u56e0\u6b64\u9700\u8981\u4fee\u5fa9\u5f9e\u63d2\u5165\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u9019\u500b\u64cd\u4f5c\u88ab\u7a31\u70ba\u5806\u7a4d\u5316\uff08heapify\uff09\u3002

    \u8003\u616e\u5f9e\u5165\u5806\u7a4d\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u5806\u7a4d\u5316\u3002\u5982\u5716 8-3 \u6240\u793a\uff0c\u6211\u5011\u6bd4\u8f03\u63d2\u5165\u7bc0\u9ede\u8207\u5176\u7236\u7bc0\u9ede\u7684\u503c\uff0c\u5982\u679c\u63d2\u5165\u7bc0\u9ede\u66f4\u5927\uff0c\u5247\u5c07\u5b83\u5011\u4ea4\u63db\u3002\u7136\u5f8c\u7e7c\u7e8c\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u5f9e\u5e95\u81f3\u9802\u4fee\u5fa9\u5806\u7a4d\u4e2d\u7684\u5404\u500b\u7bc0\u9ede\uff0c\u76f4\u81f3\u8d8a\u904e\u6839\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

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

    \u5716 8-3 \u00a0 \u5143\u7d20\u5165\u5806\u7a4d\u6b65\u9a5f

    \u8a2d\u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \uff0c\u5247\u6a39\u7684\u9ad8\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7531\u6b64\u53ef\u77e5\uff0c\u5806\u7a4d\u5316\u64cd\u4f5c\u7684\u8ff4\u5708\u8f2a\u6578\u6700\u591a\u70ba \\(O(\\log n)\\) \uff0c\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def push(self, val: int):\n    \"\"\"\u5143\u7d20\u5165\u5806\u7a4d\"\"\"\n    # \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.append(val)\n    # \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1)\n\ndef sift_up(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p = self.parent(i)\n        # \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 or self.max_heap[i] <= self.max_heap[p]:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p)\n        # \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n
    my_heap.cpp
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.push_back(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap[i], maxHeap[p]);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap.get(i) <= maxHeap.get(p))\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid Push(int val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.Add(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    SiftUp(Size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid SiftUp(int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = Parent(i);\n        // \u82e5\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p])\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc (h *maxHeap) push(val any) {\n    // \u65b0\u589e\u7bc0\u9ede\n    h.data = append(h.data, val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    h.siftUp(len(h.data) - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftUp(i int) {\n    for true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        p := h.parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || h.data[i].(int) <= h.data[p].(int) {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunc push(val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.append(val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(i: size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfunc siftUp(i: Int) {\n    var i = i\n    while true {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = parent(i: i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if p < 0 || maxHeap[i] <= maxHeap[p] {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val) {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.#maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.#siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\n#siftUp(i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.#parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.#maxHeap[i] <= this.#maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u5165\u5806\u7a4d */\npush(val: number): void {\n    // \u65b0\u589e\u7bc0\u9ede\n    this.maxHeap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    this.siftUp(this.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nsiftUp(i: number): void {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        const p = this.parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || this.maxHeap[i] <= this.maxHeap[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(int val) {\n  // \u65b0\u589e\u7bc0\u9ede\n  _maxHeap.add(val);\n  // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n  siftUp(size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(int i) {\n  while (true) {\n    // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n    int p = _parent(i);\n    // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n    if (p < 0 || _maxHeap[i] <= _maxHeap[p]) {\n      break;\n    }\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, p);\n    // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n    i = p;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfn push(&mut self, val: i32) {\n    // \u65b0\u589e\u7bc0\u9ede\n    self.max_heap.push(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    self.sift_up(self.size() - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfn sift_up(&mut self, mut i: usize) {\n    loop {\n        // \u7bc0\u9ede i \u5df2\u7d93\u662f\u5806\u7a4d\u9802\u7bc0\u9ede\u4e86\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if i == 0 {\n            break;\n        }\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        let p = Self::parent(i);\n        // \u7576\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if self.max_heap[i] <= self.max_heap[p] {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nvoid push(MaxHeap *maxHeap, int val) {\n    // \u9810\u8a2d\u60c5\u6cc1\u4e0b\uff0c\u4e0d\u61c9\u8a72\u65b0\u589e\u9019\u9ebc\u591a\u7bc0\u9ede\n    if (maxHeap->size == MAX_SIZE) {\n        printf(\"heap is full!\");\n        return;\n    }\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap->data[maxHeap->size] = val;\n    maxHeap->size++;\n\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(maxHeap, maxHeap->size - 1);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nvoid siftUp(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        int p = parent(maxHeap, i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap->data[i] <= maxHeap->data[p]) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfun push(_val: Int) {\n    // \u65b0\u589e\u7bc0\u9ede\n    maxHeap.add(_val)\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    siftUp(size() - 1)\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316 */\nfun siftUp(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        val p = parent(i)\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 || maxHeap[i] <= maxHeap[p]) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, p)\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p\n    }\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{push}\n\n[class]{MaxHeap}-[func]{sift_up}\n
    my_heap.zig
    // \u5143\u7d20\u5165\u5806\u7a4d\nfn push(self: *Self, val: T) !void {\n    // \u65b0\u589e\u7bc0\u9ede\n    try self.max_heap.?.append(val);\n    // \u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\n    try self.siftUp(self.size() - 1);\n}  \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\nfn siftUp(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u7372\u53d6\u7bc0\u9ede i \u7684\u7236\u7bc0\u9ede\n        var p = parent(i);\n        // \u7576\u201c\u8d8a\u904e\u6839\u7bc0\u9ede\u201d\u6216\u201c\u7bc0\u9ede\u7121\u9808\u4fee\u5fa9\u201d\u6642\uff0c\u7d50\u675f\u5806\u7a4d\u5316\n        if (p < 0 or self.max_heap.?.items[i] <= self.max_heap.?.items[p]) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, p);\n        // \u8ff4\u5708\u5411\u4e0a\u5806\u7a4d\u5316\n        i = p;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#4","title":"4. \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d","text":"

    \u5806\u7a4d\u9802\u5143\u7d20\u662f\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u5373\u4e32\u5217\u9996\u5143\u7d20\u3002\u5982\u679c\u6211\u5011\u76f4\u63a5\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\uff0c\u90a3\u9ebc\u4e8c\u5143\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u7d22\u5f15\u90fd\u6703\u767c\u751f\u8b8a\u5316\uff0c\u9019\u5c07\u4f7f\u5f97\u5f8c\u7e8c\u4f7f\u7528\u5806\u7a4d\u5316\u9032\u884c\u4fee\u5fa9\u8b8a\u5f97\u56f0\u96e3\u3002\u70ba\u4e86\u5118\u91cf\u6e1b\u5c11\u5143\u7d20\u7d22\u5f15\u7684\u8b8a\u52d5\uff0c\u6211\u5011\u63a1\u7528\u4ee5\u4e0b\u64cd\u4f5c\u6b65\u9a5f\u3002

    1. \u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff09\u3002
    2. \u4ea4\u63db\u5b8c\u6210\u5f8c\uff0c\u5c07\u5806\u7a4d\u5e95\u5f9e\u4e32\u5217\u4e2d\u522a\u9664\uff08\u6ce8\u610f\uff0c\u7531\u65bc\u5df2\u7d93\u4ea4\u63db\uff0c\u56e0\u6b64\u5be6\u969b\u4e0a\u522a\u9664\u7684\u662f\u539f\u4f86\u7684\u5806\u7a4d\u9802\u5143\u7d20\uff09\u3002
    3. \u5f9e\u6839\u7bc0\u9ede\u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u3002

    \u5982\u5716 8-4 \u6240\u793a\uff0c\u201c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\u201d\u7684\u64cd\u4f5c\u65b9\u5411\u8207\u201c\u5f9e\u5e95\u81f3\u9802\u5806\u7a4d\u5316\u201d\u76f8\u53cd\uff0c\u6211\u5011\u5c07\u6839\u7bc0\u9ede\u7684\u503c\u8207\u5176\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u503c\u9032\u884c\u6bd4\u8f03\uff0c\u5c07\u6700\u5927\u7684\u5b50\u7bc0\u9ede\u8207\u6839\u7bc0\u9ede\u4ea4\u63db\u3002\u7136\u5f8c\u8ff4\u5708\u57f7\u884c\u6b64\u64cd\u4f5c\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\u6216\u9047\u5230\u7121\u9808\u4ea4\u63db\u7684\u7bc0\u9ede\u6642\u7d50\u675f\u3002

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

    \u5716 8-4 \u00a0 \u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u6b65\u9a5f

    \u8207\u5143\u7d20\u5165\u5806\u7a4d\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u70ba \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig my_heap.py
    def pop(self) -> int:\n    \"\"\"\u5143\u7d20\u51fa\u5806\u7a4d\"\"\"\n    # \u5224\u7a7a\u8655\u7406\n    if self.is_empty():\n        raise IndexError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1)\n    # \u522a\u9664\u7bc0\u9ede\n    val = self.max_heap.pop()\n    # \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0)\n    # \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n\ndef sift_down(self, i: int):\n    \"\"\"\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma)\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n
    my_heap.cpp
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nvoid pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) {\n        throw out_of_range(\"\u5806\u7a4d\u70ba\u7a7a\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap[0], maxHeap[size() - 1]);\n    // \u522a\u9664\u7bc0\u9ede\n    maxHeap.pop_back();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        swap(maxHeap[i], maxHeap[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.java
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty())\n        throw new IndexOutOfBoundsException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.remove(size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.cs
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint Pop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (IsEmpty())\n        throw new IndexOutOfRangeException();\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    Swap(0, Size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap.Last();\n    maxHeap.RemoveAt(Size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    SiftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u201d\u6216\u201c\u8d8a\u904e\u8449\u7bc0\u9ede\u201d\uff0c\u5247\u7d50\u675f\u5806\u7a4d\u5316\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        Swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.go
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc (h *maxHeap) pop() any {\n    // \u5224\u7a7a\u8655\u7406\n    if h.isEmpty() {\n        fmt.Println(\"error\")\n        return nil\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    h.swap(0, h.size()-1)\n    // \u522a\u9664\u7bc0\u9ede\n    val := h.data[len(h.data)-1]\n    h.data = h.data[:len(h.data)-1]\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    h.siftDown(0)\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc (h *maxHeap) siftDown(i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if max == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        h.swap(i, max)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max\n    }\n}\n
    my_heap.swift
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunc pop() -> Int {\n    // \u5224\u7a7a\u8655\u7406\n    if isEmpty() {\n        fatalError(\"\u5806\u7a4d\u70ba\u7a7a\")\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(i: 0, j: size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    let val = maxHeap.remove(at: size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(i: 0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i: i, j: ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
    my_heap.js
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\npop() {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new Error('\u5806\u7a4d\u70ba\u7a7a');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.#swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.#maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.#siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\n#siftDown(i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.#swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.ts
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\npop(): number {\n    // \u5224\u7a7a\u8655\u7406\n    if (this.isEmpty()) throw new RangeError('Heap is empty.');\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    this.swap(0, this.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    const val = this.maxHeap.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    this.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nsiftDown(i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        this.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.dart
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop() {\n  // \u5224\u7a7a\u8655\u7406\n  if (isEmpty()) throw Exception('\u5806\u7a4d\u70ba\u7a7a');\n  // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n  _swap(0, size() - 1);\n  // \u522a\u9664\u7bc0\u9ede\n  int val = _maxHeap.removeLast();\n  // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n  siftDown(0);\n  // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n  return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    _swap(i, ma);\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n
    my_heap.rs
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfn pop(&mut self) -> i32 {\n    // \u5224\u7a7a\u8655\u7406\n    if self.is_empty() {\n        panic!(\"index out of bounds\");\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    let val = self.max_heap.remove(self.size() - 1);\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    self.sift_down(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(&mut self, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    my_heap.c
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nint pop(MaxHeap *maxHeap) {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty(maxHeap)) {\n        printf(\"heap is empty!\");\n        return INT_MAX;\n    }\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(maxHeap, 0, size(maxHeap) - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    int val = maxHeap->data[maxHeap->size - 1];\n    maxHeap->size--;\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(maxHeap, 0);\n\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(MaxHeap *maxHeap, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (max == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(maxHeap, i, max);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = max;\n    }\n}\n
    my_heap.kt
    /* \u5143\u7d20\u51fa\u5806\u7a4d */\nfun pop(): Int {\n    // \u5224\u7a7a\u8655\u7406\n    if (isEmpty()) throw IndexOutOfBoundsException()\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    swap(0, size() - 1)\n    // \u522a\u9664\u7bc0\u9ede\n    val _val = maxHeap.removeAt(size() - 1)\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    siftDown(0)\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return _val\n}\n\n/* \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(it: Int) {\n    // Kotlin\u7684\u51fd\u5f0f\u53c3\u6578\u4e0d\u53ef\u8b8a\uff0c\u56e0\u6b64\u5efa\u7acb\u81e8\u6642\u8b8a\u6578\n    var i = it\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n
    my_heap.rb
    [class]{MaxHeap}-[func]{pop}\n\n[class]{MaxHeap}-[func]{sift_down}\n
    my_heap.zig
    // \u5143\u7d20\u51fa\u5806\u7a4d\nfn pop(self: *Self) !T {\n    // \u5224\u65b7\u8655\u7406\n    if (self.isEmpty()) unreachable;\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    try self.swap(0, self.size() - 1);\n    // \u522a\u9664\u7bc0\u9ede\n    var val = self.max_heap.?.pop();\n    // \u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\n    try self.siftDown(0);\n    // \u8fd4\u56de\u5806\u7a4d\u9802\u5143\u7d20\n    return val;\n} \n\n// \u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\nfn siftDown(self: *Self, i_: usize) !void {\n    var i = i_;\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        try self.swap(i, ma);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_heap/heap/#813","title":"8.1.3 \u00a0 \u5806\u7a4d\u7684\u5e38\u898b\u61c9\u7528","text":"
    • \u512a\u5148\u4f47\u5217\uff1a\u5806\u7a4d\u901a\u5e38\u4f5c\u70ba\u5be6\u73fe\u512a\u5148\u4f47\u5217\u7684\u9996\u9078\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \uff0c\u800c\u5efa\u968a\u64cd\u4f5c\u70ba \\(O(n)\\) \uff0c\u9019\u4e9b\u64cd\u4f5c\u90fd\u975e\u5e38\u9ad8\u6548\u3002
    • \u5806\u7a4d\u6392\u5e8f\uff1a\u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u7528\u5b83\u5011\u5efa\u7acb\u4e00\u500b\u5806\u7a4d\uff0c\u7136\u5f8c\u4e0d\u65b7\u5730\u57f7\u884c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u5f9e\u800c\u5f97\u5230\u6709\u5e8f\u8cc7\u6599\u3002\u7136\u800c\uff0c\u6211\u5011\u901a\u5e38\u6703\u4f7f\u7528\u4e00\u7a2e\u66f4\u512a\u96c5\u7684\u65b9\u5f0f\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\uff0c\u8a73\u898b\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u7ae0\u7bc0\u3002
    • \u7372\u53d6\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\uff1a\u9019\u662f\u4e00\u500b\u7d93\u5178\u7684\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u540c\u6642\u4e5f\u662f\u4e00\u7a2e\u5178\u578b\u61c9\u7528\uff0c\u4f8b\u5982\u9078\u64c7\u71b1\u5ea6\u524d 10 \u7684\u65b0\u805e\u4f5c\u70ba\u5fae\u535a\u71b1\u641c\uff0c\u9078\u53d6\u92b7\u91cf\u524d 10 \u7684\u5546\u54c1\u7b49\u3002
    "},{"location":"chapter_heap/summary/","title":"8.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_heap/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5806\u7a4d\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u5143\u6a39\uff0c\u6839\u64da\u6210\u7acb\u689d\u4ef6\u53ef\u5206\u70ba\u5927\u9802\u5806\u7a4d\u548c\u5c0f\u9802\u5806\u7a4d\u3002\u5927\uff08\u5c0f\uff09\u9802\u5806\u7a4d\u7684\u5806\u7a4d\u9802\u5143\u7d20\u662f\u6700\u5927\uff08\u5c0f\uff09\u7684\u3002
    • \u512a\u5148\u4f47\u5217\u7684\u5b9a\u7fa9\u662f\u5177\u6709\u51fa\u5217\u512a\u5148\u9806\u5e8f\u7684\u4f47\u5217\uff0c\u901a\u5e38\u4f7f\u7528\u5806\u7a4d\u4f86\u5be6\u73fe\u3002
    • \u5806\u7a4d\u7684\u5e38\u7528\u64cd\u4f5c\u53ca\u5176\u5c0d\u61c9\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5305\u62ec\uff1a\u5143\u7d20\u5165\u5806\u7a4d \\(O(\\log n)\\)\u3001\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d \\(O(\\log n)\\) \u548c\u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 \\(O(1)\\) \u7b49\u3002
    • \u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u7528\u9663\u5217\u8868\u793a\uff0c\u56e0\u6b64\u6211\u5011\u901a\u5e38\u4f7f\u7528\u9663\u5217\u4f86\u5132\u5b58\u5806\u7a4d\u3002
    • \u5806\u7a4d\u5316\u64cd\u4f5c\u7528\u65bc\u7dad\u8b77\u5806\u7a4d\u7684\u6027\u8cea\uff0c\u5728\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u90fd\u6703\u7528\u5230\u3002
    • \u8f38\u5165 \\(n\\) \u500b\u5143\u7d20\u4e26\u5efa\u5806\u7a4d\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(n)\\) \uff0c\u975e\u5e38\u9ad8\u6548\u3002
    • Top-k \u662f\u4e00\u500b\u7d93\u5178\u6f14\u7b97\u6cd5\u554f\u984c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u9ad8\u6548\u89e3\u6c7a\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002
    "},{"location":"chapter_heap/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u8cc7\u6599\u7d50\u69cb\u7684\u201c\u5806\u7a4d\u201d\u8207\u8a18\u61b6\u9ad4\u7ba1\u7406\u7684\u201c\u5806\u7a4d\u201d\u662f\u540c\u4e00\u500b\u6982\u5ff5\u55ce\uff1f

    \u5169\u8005\u4e0d\u662f\u540c\u4e00\u500b\u6982\u5ff5\uff0c\u53ea\u662f\u78b0\u5de7\u90fd\u53eb\u201c\u5806\u7a4d\u201d\u3002\u8a08\u7b97\u6a5f\u7cfb\u7d71\u8a18\u61b6\u9ad4\u4e2d\u7684\u5806\u7a4d\u662f\u52d5\u614b\u8a18\u61b6\u9ad4\u5206\u914d\u7684\u4e00\u90e8\u5206\uff0c\u7a0b\u5f0f\u5728\u57f7\u884c\u6642\u53ef\u4ee5\u4f7f\u7528\u5b83\u4f86\u5132\u5b58\u8cc7\u6599\u3002\u7a0b\u5f0f\u53ef\u4ee5\u8acb\u6c42\u4e00\u5b9a\u91cf\u7684\u5806\u7a4d\u8a18\u61b6\u9ad4\uff0c\u7528\u65bc\u5132\u5b58\u5982\u7269\u4ef6\u548c\u9663\u5217\u7b49\u8907\u96dc\u7d50\u69cb\u3002\u7576\u9019\u4e9b\u8cc7\u6599\u4e0d\u518d\u9700\u8981\u6642\uff0c\u7a0b\u5f0f\u9700\u8981\u91cb\u653e\u9019\u4e9b\u8a18\u61b6\u9ad4\uff0c\u4ee5\u9632\u6b62\u8a18\u61b6\u9ad4\u6d41\u5931\u3002\u76f8\u8f03\u65bc\u5806\u758a\u8a18\u61b6\u9ad4\uff0c\u5806\u7a4d\u8a18\u61b6\u9ad4\u7684\u7ba1\u7406\u548c\u4f7f\u7528\u9700\u8981\u66f4\u8b39\u614e\uff0c\u4f7f\u7528\u4e0d\u7576\u53ef\u80fd\u6703\u5c0e\u81f4\u8a18\u61b6\u9ad4\u6d41\u5931\u548c\u91ce\u6307\u6a19\u7b49\u554f\u984c\u3002

    "},{"location":"chapter_heap/top_k/","title":"8.3 \u00a0 Top-k \u554f\u984c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u7121\u5e8f\u9663\u5217 nums \uff0c\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002

    \u5c0d\u65bc\u8a72\u554f\u984c\uff0c\u6211\u5011\u5148\u4ecb\u7d39\u5169\u7a2e\u601d\u8def\u6bd4\u8f03\u76f4\u63a5\u7684\u89e3\u6cd5\uff0c\u518d\u4ecb\u7d39\u6548\u7387\u66f4\u9ad8\u7684\u5806\u7a4d\u89e3\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#831","title":"8.3.1 \u00a0 \u65b9\u6cd5\u4e00\uff1a\u8d70\u8a2a\u9078\u64c7","text":"

    \u6211\u5011\u53ef\u4ee5\u9032\u884c\u5716 8-6 \u6240\u793a\u7684 \\(k\\) \u8f2a\u8d70\u8a2a\uff0c\u5206\u5225\u5728\u6bcf\u8f2a\u4e2d\u63d0\u53d6\u7b2c \\(1\\)\u3001\\(2\\)\u3001\\(\\dots\\)\u3001\\(k\\) \u5927\u7684\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\) \u3002

    \u6b64\u65b9\u6cd5\u53ea\u9069\u7528\u65bc \\(k \\ll n\\) \u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u7576 \\(k\\) \u8207 \\(n\\) \u6bd4\u8f03\u63a5\u8fd1\u6642\uff0c\u5176\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411\u65bc \\(O(n^2)\\) \uff0c\u975e\u5e38\u8017\u6642\u3002

    \u5716 8-6 \u00a0 \u8d70\u8a2a\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    Tip

    \u7576 \\(k = n\\) \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u5230\u5b8c\u6574\u7684\u6709\u5e8f\u5e8f\u5217\uff0c\u6b64\u6642\u7b49\u50f9\u65bc\u201c\u9078\u64c7\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\u3002

    "},{"location":"chapter_heap/top_k/#832","title":"8.3.2 \u00a0 \u65b9\u6cd5\u4e8c\uff1a\u6392\u5e8f","text":"

    \u5982\u5716 8-7 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u5c0d\u9663\u5217 nums \u9032\u884c\u6392\u5e8f\uff0c\u518d\u8fd4\u56de\u6700\u53f3\u908a\u7684 \\(k\\) \u500b\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002

    \u986f\u7136\uff0c\u8a72\u65b9\u6cd5\u201c\u8d85\u984d\u201d\u5b8c\u6210\u4efb\u52d9\u4e86\uff0c\u56e0\u70ba\u6211\u5011\u53ea\u9700\u627e\u51fa\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u5373\u53ef\uff0c\u800c\u4e0d\u9700\u8981\u6392\u5e8f\u5176\u4ed6\u5143\u7d20\u3002

    \u5716 8-7 \u00a0 \u6392\u5e8f\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    "},{"location":"chapter_heap/top_k/#833","title":"8.3.3 \u00a0 \u65b9\u6cd5\u4e09\uff1a\u5806\u7a4d","text":"

    \u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u5806\u7a4d\u66f4\u52a0\u9ad8\u6548\u5730\u89e3\u6c7a Top-k \u554f\u984c\uff0c\u6d41\u7a0b\u5982\u5716 8-8 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u5176\u5806\u7a4d\u9802\u5143\u7d20\u6700\u5c0f\u3002
    2. \u5148\u5c07\u9663\u5217\u7684\u524d \\(k\\) \u500b\u5143\u7d20\u4f9d\u6b21\u5165\u5806\u7a4d\u3002
    3. \u5f9e\u7b2c \\(k + 1\\) \u500b\u5143\u7d20\u958b\u59cb\uff0c\u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\uff0c\u4e26\u5c07\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\u3002
    4. \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u5806\u7a4d\u4e2d\u5132\u5b58\u7684\u5c31\u662f\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 8-8 \u00a0 \u57fa\u65bc\u5806\u7a4d\u5c0b\u627e\u6700\u5927\u7684 k \u500b\u5143\u7d20

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig top_k.py
    def top_k_heap(nums: list[int], k: int) -> list[int]:\n    \"\"\"\u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\"\"\"\n    # \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    heap = []\n    # \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i in range(k):\n        heapq.heappush(heap, nums[i])\n    # \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in range(k, len(nums)):\n        # \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if nums[i] > heap[0]:\n            heapq.heappop(heap)\n            heapq.heappush(heap, nums[i])\n    return heap\n
    top_k.cpp
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\npriority_queue<int, vector<int>, greater<int>> topKHeap(vector<int> &nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    priority_queue<int, vector<int>, greater<int>> heap;\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.push(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.size(); i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nQueue<Integer> topKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    Queue<Integer> heap = new PriorityQueue<Integer>();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.offer(nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nPriorityQueue<int, int> TopKHeap(int[] nums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    PriorityQueue<int, int> heap = new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        heap.Enqueue(nums[i], nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < nums.Length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums []int, k int) *minHeap {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    h := &minHeap{}\n    heap.Init(h)\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for i := 0; i < k; i++ {\n        heap.Push(h, nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i := k; i < len(nums); i++ {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunc topKHeap(nums: [Int], k: Int) -> [Int] {\n    // \u521d\u59cb\u5316\u4e00\u500b\u5c0f\u9802\u5806\u7a4d\uff0c\u4e26\u5c07\u524d k \u500b\u5143\u7d20\u5efa\u5806\u7a4d\n    var heap = Heap(nums.prefix(k))\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for i in nums.indices.dropFirst(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d */\nfunction pushMinHeap(maxHeap, val) {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nfunction getMinHeap(maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return maxHeap.getMaxHeap().map((num) => -num);\n}\n\n/* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums, k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.ts
    /* \u5143\u7d20\u5165\u5806\u7a4d */\nfunction pushMinHeap(maxHeap: MaxHeap, val: number): void {\n    // \u5143\u7d20\u53d6\u53cd\n    maxHeap.push(-val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nfunction popMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.pop();\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nfunction peekMinHeap(maxHeap: MaxHeap): number {\n    // \u5143\u7d20\u53d6\u53cd\n    return -maxHeap.peek();\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfunction topKHeap(nums: number[], k: number): number[] {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    const maxHeap = new MaxHeap([]);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (let i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (let i = k; i < nums.length; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    // \u8fd4\u56de\u5806\u7a4d\u4e2d\u5143\u7d20\n    return getMinHeap(maxHeap);\n}\n
    top_k.dart
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nMinHeap topKHeap(List<int> nums, int k) {\n  // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\uff0c\u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n  MinHeap heap = MinHeap(nums.sublist(0, k));\n  // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n  for (int i = k; i < nums.length; i++) {\n    // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfn top_k_heap(nums: Vec<i32>, k: usize) -> BinaryHeap<Reverse<i32>> {\n    // BinaryHeap \u662f\u5927\u9802\u5806\u7a4d\uff0c\u4f7f\u7528 Reverse \u5c07\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u5be6\u73fe\u5c0f\u9802\u5806\u7a4d\n    let mut heap = BinaryHeap::<Reverse<i32>>::new();\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for &num in nums.iter().take(k) {\n        heap.push(Reverse(num));\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for &num in nums.iter().skip(k) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\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\u7a4d */\nvoid pushMinHeap(MaxHeap *maxHeap, int val) {\n    // \u5143\u7d20\u53d6\u53cd\n    push(maxHeap, -val);\n}\n\n/* \u5143\u7d20\u51fa\u5806\u7a4d */\nint popMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -pop(maxHeap);\n}\n\n/* \u8a2a\u554f\u5806\u7a4d\u9802\u5143\u7d20 */\nint peekMinHeap(MaxHeap *maxHeap) {\n    // \u5143\u7d20\u53d6\u53cd\n    return -peek(maxHeap);\n}\n\n/* \u53d6\u51fa\u5806\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\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\u7a4d\u4e2d\u5143\u7d20 */\nint *getMinHeap(MaxHeap *maxHeap) {\n    // \u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\u4e26\u5b58\u5165 res \u9663\u5217\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\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20\u7684\u51fd\u5f0f\nint *topKHeap(int *nums, int sizeNums, int k) {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    // \u8acb\u6ce8\u610f\uff1a\u6211\u5011\u5c07\u5806\u7a4d\u4e2d\u6240\u6709\u5143\u7d20\u53d6\u53cd\uff0c\u5f9e\u800c\u7528\u5927\u9802\u5806\u7a4d\u4f86\u6a21\u64ec\u5c0f\u9802\u5806\u7a4d\n    int *empty = (int *)malloc(0);\n    MaxHeap *maxHeap = newMaxHeap(empty, 0);\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (int i = 0; i < k; i++) {\n        pushMinHeap(maxHeap, nums[i]);\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (int i = k; i < sizeNums; i++) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > peekMinHeap(maxHeap)) {\n            popMinHeap(maxHeap);\n            pushMinHeap(maxHeap, nums[i]);\n        }\n    }\n    int *res = getMinHeap(maxHeap);\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    delMaxHeap(maxHeap);\n    return res;\n}\n
    top_k.kt
    /* \u57fa\u65bc\u5806\u7a4d\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5927\u7684 k \u500b\u5143\u7d20 */\nfun topKHeap(nums: IntArray, k: Int): Queue<Int> {\n    // \u521d\u59cb\u5316\u5c0f\u9802\u5806\u7a4d\n    val heap = PriorityQueue<Int>()\n    // \u5c07\u9663\u5217\u7684\u524d k \u500b\u5143\u7d20\u5165\u5806\u7a4d\n    for (i in 0..<k) {\n        heap.offer(nums[i])\n    }\n    // \u5f9e\u7b2c k+1 \u500b\u5143\u7d20\u958b\u59cb\uff0c\u4fdd\u6301\u5806\u7a4d\u7684\u9577\u5ea6\u70ba k\n    for (i in k..<nums.size) {\n        // \u82e5\u7576\u524d\u5143\u7d20\u5927\u65bc\u5806\u7a4d\u9802\u5143\u7d20\uff0c\u5247\u5c07\u5806\u7a4d\u9802\u5143\u7d20\u51fa\u5806\u7a4d\u3001\u7576\u524d\u5143\u7d20\u5165\u5806\u7a4d\n        if (nums[i] > heap.peek()) {\n            heap.poll()\n            heap.offer(nums[i])\n        }\n    }\n    return heap\n}\n
    top_k.rb
    [class]{}-[func]{top_k_heap}\n
    top_k.zig
    [class]{}-[func]{topKHeap}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u7e3d\u5171\u57f7\u884c\u4e86 \\(n\\) \u8f2a\u5165\u5806\u7a4d\u548c\u51fa\u5806\u7a4d\uff0c\u5806\u7a4d\u7684\u6700\u5927\u9577\u5ea6\u70ba \\(k\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log k)\\) \u3002\u8a72\u65b9\u6cd5\u7684\u6548\u7387\u5f88\u9ad8\uff0c\u7576 \\(k\\) \u8f03\u5c0f\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \uff1b\u7576 \\(k\\) \u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u4e0d\u6703\u8d85\u904e \\(O(n \\log n)\\) \u3002

    \u53e6\u5916\uff0c\u8a72\u65b9\u6cd5\u9069\u7528\u65bc\u52d5\u614b\u8cc7\u6599\u6d41\u7684\u4f7f\u7528\u5834\u666f\u3002\u5728\u4e0d\u65b7\u52a0\u5165\u8cc7\u6599\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u6301\u7e8c\u7dad\u8b77\u5806\u7a4d\u5167\u7684\u5143\u7d20\uff0c\u5f9e\u800c\u5be6\u73fe\u6700\u5927\u7684 \\(k\\) \u500b\u5143\u7d20\u7684\u52d5\u614b\u66f4\u65b0\u3002

    "},{"location":"chapter_hello_algo/","title":"\u5e8f","text":"

    \u5e7e\u5e74\u524d\uff0c\u6211\u5728\u529b\u6263\u4e0a\u5206\u4eab\u4e86\u201c\u528d\u6307 Offer\u201d\u7cfb\u5217\u984c\u89e3\uff0c\u53d7\u5230\u4e86\u8a31\u591a\u8b80\u8005\u7684\u9f13\u52f5\u548c\u652f\u6301\u3002\u5728\u8207\u8b80\u8005\u4ea4\u6d41\u671f\u9593\uff0c\u6211\u6700\u5e38\u88ab\u554f\u7684\u4e00\u500b\u554f\u984c\u662f\u201c\u5982\u4f55\u5165\u9580\u6f14\u7b97\u6cd5\u201d\u3002\u9010\u6f38\u5730\uff0c\u6211\u5c0d\u9019\u500b\u554f\u984c\u7522\u751f\u4e86\u6fc3\u539a\u7684\u8208\u8da3\u3002

    \u5169\u773c\u4e00\u62b9\u9ed1\u5730\u5237\u984c\u4f3c\u4e4e\u662f\u6700\u53d7\u6b61\u8fce\u7684\u65b9\u6cd5\uff0c\u7c21\u55ae\u3001\u76f4\u63a5\u4e14\u6709\u6548\u3002\u7136\u800c\u5237\u984c\u5c31\u5982\u540c\u73a9\u201c\u6383\u96f7\u201d\u904a\u6232\uff0c\u81ea\u5b78\u80fd\u529b\u5f37\u7684\u4eba\u80fd\u5920\u9806\u5229\u5c07\u5730\u96f7\u9010\u500b\u6392\u6389\uff0c\u800c\u57fa\u790e\u4e0d\u8db3\u7684\u4eba\u5f88\u53ef\u80fd\u88ab\u70b8\u5f97\u6eff\u982d\u662f\u5305\uff0c\u4e26\u5728\u632b\u6298\u4e2d\u6b65\u6b65\u9000\u7e2e\u3002\u901a\u8b80\u6559\u6750\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u505a\u6cd5\uff0c\u4f46\u5c0d\u65bc\u9762\u5411\u6c42\u8077\u7684\u4eba\u4f86\u8aaa\uff0c\u7562\u696d\u8ad6\u6587\u3001\u6295\u905e\u7c21\u6b77\u3001\u6e96\u5099\u7b46\u8a66\u548c\u9762\u8a66\u5df2\u7d93\u6d88\u8017\u4e86\u5927\u90e8\u5206\u7cbe\u529b\uff0c\u5543\u539a\u91cd\u7684\u66f8\u5f80\u5f80\u8b8a\u6210\u4e86\u4e00\u9805\u8271\u9245\u7684\u6311\u6230\u3002

    \u5982\u679c\u4f60\u4e5f\u9762\u81e8\u985e\u4f3c\u7684\u56f0\u64fe\uff0c\u90a3\u9ebc\u5f88\u5e78\u904b\u9019\u672c\u66f8\u201c\u627e\u201d\u5230\u4e86\u4f60\u3002\u672c\u66f8\u662f\u6211\u5c0d\u9019\u500b\u554f\u984c\u7d66\u51fa\u7684\u7b54\u6848\uff0c\u5373\u4f7f\u4e0d\u662f\u6700\u512a\u89e3\uff0c\u4e5f\u81f3\u5c11\u662f\u4e00\u6b21\u7a4d\u6975\u7684\u5617\u8a66\u3002\u672c\u66f8\u96d6\u7136\u4e0d\u8db3\u4ee5\u8b93\u4f60\u76f4\u63a5\u62ff\u5230 Offer\uff0c\u4f46\u6703\u5f15\u5c0e\u4f60\u63a2\u7d22\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u201c\u77e5\u8b58\u5730\u5716\u201d\uff0c\u5e36\u4f60\u77ad\u89e3\u4e0d\u540c\u201c\u5730\u96f7\u201d\u7684\u5f62\u72c0\u3001\u5927\u5c0f\u548c\u5206\u4f48\u4f4d\u7f6e\uff0c\u8b93\u4f60\u638c\u63e1\u5404\u7a2e\u201c\u6392\u96f7\u65b9\u6cd5\u201d\u3002\u6709\u4e86\u9019\u4e9b\u672c\u9818\uff0c\u76f8\u4fe1\u4f60\u53ef\u4ee5\u66f4\u52a0\u81ea\u5982\u5730\u5237\u984c\u548c\u95b1\u8b80\u6587\u737b\uff0c\u9010\u6b65\u69cb\u5efa\u8d77\u5b8c\u6574\u7684\u77e5\u8b58\u9ad4\u7cfb\u3002

    \u6211\u6df1\u6df1\u8d0a\u540c\u8cbb\u66fc\u6559\u6388\u6240\u8a00\uff1a\u201cKnowledge isn't free. You have to pay attention.\u201d\u5f9e\u9019\u500b\u610f\u7fa9\u4e0a\u770b\uff0c\u9019\u672c\u66f8\u4e26\u975e\u5b8c\u5168\u201c\u514d\u8cbb\u201d\u3002\u70ba\u4e86\u4e0d\u8f9c\u8ca0\u4f60\u70ba\u672c\u66f8\u6240\u4ed8\u51fa\u7684\u5bf6\u8cb4\u201c\u6ce8\u610f\u529b\u201d\uff0c\u6211\u6703\u7aed\u76e1\u6240\u80fd\uff0c\u6295\u5165\u6700\u5927\u7684\u201c\u6ce8\u610f\u529b\u201d\u4f86\u5b8c\u6210\u672c\u66f8\u7684\u5275\u4f5c\u3002

    \u672c\u4eba\u81ea\u77e5\u5b78\u758f\u624d\u6dfa\uff0c\u66f8\u4e2d\u5167\u5bb9\u96d6\u7136\u5df2\u7d93\u904e\u4e00\u6bb5\u6642\u9593\u7684\u6253\u78e8\uff0c\u4f46\u4e00\u5b9a\u4ecd\u6709\u8a31\u591a\u932f\u8aa4\uff0c\u61c7\u8acb\u5404\u4f4d\u8001\u5e2b\u548c\u540c\u5b78\u6279\u8a55\u6307\u6b63\u3002

    Hello\uff0c\u6f14\u7b97\u6cd5\uff01

    \u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u7d66\u4e16\u754c\u5e36\u4f86\u4e86\u5de8\u5927\u8b8a\u9769\uff0c\u5b83\u6191\u85c9\u9ad8\u901f\u7684\u8a08\u7b97\u80fd\u529b\u548c\u51fa\u8272\u7684\u53ef\u7a0b\u5f0f\u8a2d\u8a08\u6027\uff0c\u6210\u70ba\u4e86\u57f7\u884c\u6f14\u7b97\u6cd5\u8207\u8655\u7406\u8cc7\u6599\u7684\u7406\u60f3\u5a92\u4ecb\u3002\u7121\u8ad6\u662f\u96fb\u5b50\u904a\u6232\u7684\u903c\u771f\u756b\u9762\u3001\u81ea\u52d5\u99d5\u99db\u7684\u667a\u6167\u6c7a\u7b56\uff0c\u9084\u662f AlphaGo \u7684\u7cbe\u5f69\u68cb\u5c40\u3001ChatGPT \u7684\u81ea\u7136\u4e92\u52d5\uff0c\u9019\u4e9b\u61c9\u7528\u90fd\u662f\u6f14\u7b97\u6cd5\u5728\u8a08\u7b97\u6a5f\u4e0a\u7684\u7cbe\u5999\u6f14\u7e79\u3002

    \u4e8b\u5be6\u4e0a\uff0c\u5728\u8a08\u7b97\u6a5f\u554f\u4e16\u4e4b\u524d\uff0c\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u5c31\u5df2\u7d93\u5b58\u5728\u65bc\u4e16\u754c\u7684\u5404\u500b\u89d2\u843d\u3002\u65e9\u671f\u7684\u6f14\u7b97\u6cd5\u76f8\u5c0d\u7c21\u55ae\uff0c\u4f8b\u5982\u53e4\u4ee3\u7684\u8a08\u6578\u65b9\u6cd5\u548c\u5de5\u5177\u88fd\u4f5c\u6b65\u9a5f\u7b49\u3002\u96a8\u8457\u6587\u660e\u7684\u9032\u6b65\uff0c\u6f14\u7b97\u6cd5\u9010\u6f38\u8b8a\u5f97\u66f4\u52a0\u7cbe\u7d30\u548c\u8907\u96dc\u3002\u5f9e\u5de7\u596a\u5929\u5de5\u7684\u5320\u4eba\u6280\u85dd\u3001\u5230\u89e3\u653e\u751f\u7522\u529b\u7684\u5de5\u696d\u7522\u54c1\u3001\u518d\u5230\u5b87\u5b99\u57f7\u884c\u7684\u79d1\u5b78\u898f\u5f8b\uff0c\u5e7e\u4e4e\u6bcf\u4e00\u4ef6\u5e73\u51e1\u6216\u4ee4\u4eba\u9a5a\u6b4e\u7684\u4e8b\u7269\u80cc\u5f8c\uff0c\u90fd\u96b1\u85cf\u8457\u7cbe\u5999\u7684\u6f14\u7b97\u6cd5\u601d\u60f3\u3002

    \u540c\u6a23\uff0c\u8cc7\u6599\u7d50\u69cb\u7121\u8655\u4e0d\u5728\uff1a\u5927\u5230\u793e\u6703\u7db2\u8def\uff0c\u5c0f\u5230\u5730\u9435\u7dda\u8def\uff0c\u8a31\u591a\u7cfb\u7d71\u90fd\u53ef\u4ee5\u5efa\u6a21\u70ba\u201c\u5716\u201d\uff1b\u5927\u5230\u4e00\u500b\u570b\u5bb6\uff0c\u5c0f\u5230\u4e00\u500b\u5bb6\u5ead\uff0c\u793e\u6703\u7684\u4e3b\u8981\u7d44\u7e54\u5f62\u5f0f\u5448\u73fe\u51fa\u201c\u6a39\u201d\u7684\u7279\u5fb5\uff1b\u51ac\u5929\u7684\u8863\u670d\u5c31\u50cf\u201c\u5806\u758a\u201d\uff0c\u6700\u5148\u7a7f\u4e0a\u7684\u6700\u5f8c\u624d\u80fd\u812b\u4e0b\uff1b\u7fbd\u6bdb\u7403\u7b52\u5247\u5982\u540c\u201c\u4f47\u5217\u201d\uff0c\u4e00\u7aef\u653e\u5165\u3001\u53e6\u4e00\u7aef\u53d6\u51fa\uff1b\u5b57\u5178\u5c31\u50cf\u4e00\u500b\u201c\u96dc\u6e4a\u8868\u201d\uff0c\u80fd\u5920\u5feb\u901f\u67e5\u8a62\u76ee\u6a19\u8a5e\u689d\u3002

    \u672c\u66f8\u65e8\u5728\u900f\u904e\u6e05\u6670\u6613\u61c2\u7684\u52d5\u756b\u5716\u89e3\u548c\u53ef\u57f7\u884c\u7684\u7a0b\u5f0f\u78bc\u793a\u4f8b\uff0c\u4f7f\u8b80\u8005\u7406\u89e3\u6f14\u7b97\u6cd5\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u6838\u5fc3\u6982\u5ff5\uff0c\u4e26\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u4f86\u5be6\u73fe\u5b83\u5011\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u672c\u66f8\u81f4\u529b\u65bc\u63ed\u793a\u6f14\u7b97\u6cd5\u5728\u8907\u96dc\u4e16\u754c\u4e2d\u7684\u751f\u52d5\u9ad4\u73fe\uff0c\u5c55\u73fe\u6f14\u7b97\u6cd5\u4e4b\u7f8e\u3002\u5e0c\u671b\u672c\u66f8\u80fd\u5920\u5e6b\u52a9\u5230\u4f60\uff01

    "},{"location":"chapter_introduction/","title":"\u7b2c 1 \u7ae0 \u00a0 \u521d\u8b58\u6f14\u7b97\u6cd5","text":"

    Abstract

    \u4e00\u4f4d\u5c11\u5973\u7fe9\u7fe9\u8d77\u821e\uff0c\u8207\u8cc7\u6599\u4ea4\u7e54\u5728\u4e00\u8d77\uff0c\u88d9\u896c\u4e0a\u98c4\u63da\u8457\u6f14\u7b97\u6cd5\u7684\u65cb\u5f8b\u3002

    \u5979\u9080\u8acb\u4f60\u5171\u821e\uff0c\u8acb\u7dca\u8ddf\u5979\u7684\u6b65\u4f10\uff0c\u8e0f\u5165\u5145\u6eff\u908f\u8f2f\u8207\u7f8e\u611f\u7684\u6f14\u7b97\u6cd5\u4e16\u754c\u3002

    "},{"location":"chapter_introduction/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728
    • 1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc
    • 1.3 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_introduction/algorithms_are_everywhere/","title":"1.1 \u00a0 \u6f14\u7b97\u6cd5\u7121\u8655\u4e0d\u5728","text":"

    \u7576\u6211\u5011\u807d\u5230\u201c\u6f14\u7b97\u6cd5\u201d\u9019\u500b\u8a5e\u6642\uff0c\u5f88\u81ea\u7136\u5730\u6703\u60f3\u5230\u6578\u5b78\u3002\u7136\u800c\u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u6f14\u7b97\u6cd5\u4e26\u4e0d\u6d89\u53ca\u8907\u96dc\u6578\u5b78\uff0c\u800c\u662f\u66f4\u591a\u5730\u4f9d\u8cf4\u57fa\u672c\u908f\u8f2f\uff0c\u9019\u4e9b\u908f\u8f2f\u5728\u6211\u5011\u7684\u65e5\u5e38\u751f\u6d3b\u4e2d\u8655\u8655\u53ef\u898b\u3002

    \u5728\u6b63\u5f0f\u63a2\u8a0e\u6f14\u7b97\u6cd5\u4e4b\u524d\uff0c\u6709\u4e00\u500b\u6709\u8da3\u7684\u4e8b\u5be6\u503c\u5f97\u5206\u4eab\uff1a\u4f60\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u4e26\u7fd2\u6163\u5c07\u5b83\u5011\u61c9\u7528\u5230\u65e5\u5e38\u751f\u6d3b\u4e2d\u4e86\u3002\u4e0b\u9762\u6211\u5c07\u8209\u5e7e\u500b\u5177\u9ad4\u7684\u4f8b\u5b50\u4f86\u8b49\u5be6\u9019\u4e00\u9ede\u3002

    \u4f8b\u4e00\uff1a\u67e5\u5b57\u5178\u3002\u5728\u5b57\u5178\u88e1\uff0c\u6bcf\u500b\u6f22\u5b57\u90fd\u5c0d\u61c9\u4e00\u500b\u62fc\u97f3\uff0c\u800c\u5b57\u5178\u662f\u6309\u7167\u62fc\u97f3\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\u7684\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u67e5\u8a62\u4e00\u500b\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u5b57\uff0c\u901a\u5e38\u6703\u6309\u7167\u5716 1-1 \u6240\u793a\u7684\u65b9\u5f0f\u5be6\u73fe\u3002

    1. \u7ffb\u958b\u5b57\u5178\u7d04\u4e00\u534a\u7684\u9801\u6578\uff0c\u6aa2\u8996\u8a72\u9801\u7684\u9996\u5b57\u6bcd\u662f\u4ec0\u9ebc\uff0c\u5047\u8a2d\u9996\u5b57\u6bcd\u70ba \\(m\\) \u3002
    2. \u7531\u65bc\u5728\u62fc\u97f3\u5b57\u6bcd\u8868\u4e2d \\(r\\) \u4f4d\u65bc \\(m\\) \u4e4b\u5f8c\uff0c\u6240\u4ee5\u6392\u9664\u5b57\u5178\u524d\u534a\u90e8\u5206\uff0c\u67e5\u8a62\u7bc4\u570d\u7e2e\u5c0f\u5230\u5f8c\u534a\u90e8\u5206\u3002
    3. \u4e0d\u65b7\u91cd\u8907\u6b65\u9a5f 1. \u548c \u6b65\u9a5f 2. \uff0c\u76f4\u81f3\u627e\u5230\u62fc\u97f3\u9996\u5b57\u6bcd\u70ba \\(r\\) \u7684\u9801\u78bc\u70ba\u6b62\u3002
    <1><2><3><4><5>

    \u5716 1-1 \u00a0 \u67e5\u5b57\u5178\u6b65\u9a5f

    \u67e5\u5b57\u5178\u9019\u500b\u5c0f\u5b78\u751f\u5fc5\u5099\u6280\u80fd\uff0c\u5be6\u969b\u4e0a\u5c31\u662f\u8457\u540d\u7684\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u6f14\u7b97\u6cd5\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u628a\u5b57\u5178\u8996\u70ba\u4e00\u500b\u5df2\u6392\u5e8f\u7684\u201c\u9663\u5217\u201d\uff1b\u5f9e\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u4e0a\u8ff0\u67e5\u5b57\u5178\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u770b\u4f5c\u201c\u4e8c\u5206\u641c\u5c0b\u201d\u3002

    \u4f8b\u4e8c\uff1a\u6574\u7406\u64b2\u514b\u3002\u6211\u5011\u5728\u6253\u724c\u6642\uff0c\u6bcf\u5c40\u90fd\u9700\u8981\u6574\u7406\u624b\u4e2d\u7684\u64b2\u514b\u724c\uff0c\u4f7f\u5176\u5f9e\u5c0f\u5230\u5927\u6392\u5217\uff0c\u5be6\u73fe\u6d41\u7a0b\u5982\u5716 1-2 \u6240\u793a\u3002

    1. \u5c07\u64b2\u514b\u724c\u5283\u5206\u70ba\u201c\u6709\u5e8f\u201d\u548c\u201c\u7121\u5e8f\u201d\u5169\u90e8\u5206\uff0c\u4e26\u5047\u8a2d\u521d\u59cb\u72c0\u614b\u4e0b\u6700\u5de6 1 \u5f35\u64b2\u514b\u724c\u5df2\u7d93\u6709\u5e8f\u3002
    2. \u5728\u7121\u5e8f\u90e8\u5206\u62bd\u51fa\u4e00\u5f35\u64b2\u514b\u724c\uff0c\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\u7684\u6b63\u78ba\u4f4d\u7f6e\uff1b\u5b8c\u6210\u5f8c\u6700\u5de6 2 \u5f35\u64b2\u514b\u5df2\u7d93\u6709\u5e8f\u3002
    3. \u4e0d\u65b7\u8ff4\u5708\u6b65\u9a5f 2. \uff0c\u6bcf\u4e00\u8f2a\u5c07\u4e00\u5f35\u64b2\u514b\u724c\u5f9e\u7121\u5e8f\u90e8\u5206\u63d2\u5165\u81f3\u6709\u5e8f\u90e8\u5206\uff0c\u76f4\u81f3\u6240\u6709\u64b2\u514b\u724c\u90fd\u6709\u5e8f\u3002

    \u5716 1-2 \u00a0 \u64b2\u514b\u6392\u5e8f\u6b65\u9a5f

    \u4e0a\u8ff0\u6574\u7406\u64b2\u514b\u724c\u7684\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6f14\u7b97\u6cd5\uff0c\u5b83\u5728\u8655\u7406\u5c0f\u578b\u8cc7\u6599\u96c6\u6642\u975e\u5e38\u9ad8\u6548\u3002\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\u7684\u6392\u5e8f\u5eab\u51fd\u5f0f\u4e2d\u90fd\u6709\u63d2\u5165\u6392\u5e8f\u7684\u8eab\u5f71\u3002

    \u4f8b\u4e09\uff1a\u8ca8\u5e63\u627e\u96f6\u3002\u5047\u8a2d\u6211\u5011\u5728\u8d85\u5e02\u8cfc\u8cb7\u4e86 \\(69\\) \u5143\u7684\u5546\u54c1\uff0c\u7d66\u4e86\u6536\u9280\u54e1 \\(100\\) \u5143\uff0c\u5247\u6536\u9280\u54e1\u9700\u8981\u627e\u6211\u5011 \\(31\\) \u5143\u3002\u4ed6\u6703\u5f88\u81ea\u7136\u5730\u5b8c\u6210\u5982\u5716 1-3 \u6240\u793a\u7684\u601d\u8003\u3002

    1. \u53ef\u9078\u9805\u662f\u6bd4 \\(31\\) \u5143\u9762\u503c\u66f4\u5c0f\u7684\u8ca8\u5e63\uff0c\u5305\u62ec \\(1\\) \u5143\u3001\\(5\\) \u5143\u3001\\(10\\) \u5143\u3001\\(20\\) \u5143\u3002
    2. \u5f9e\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(20\\) \u5143\uff0c\u5269\u9918 \\(31 - 20 = 11\\) \u5143\u3002
    3. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(10\\) \u5143\uff0c\u5269\u9918 \\(11 - 10 = 1\\) \u5143\u3002
    4. \u5f9e\u5269\u9918\u53ef\u9078\u9805\u4e2d\u62ff\u51fa\u6700\u5927\u7684 \\(1\\) \u5143\uff0c\u5269\u9918 \\(1 - 1 = 0\\) \u5143\u3002
    5. \u5b8c\u6210\u627e\u96f6\uff0c\u65b9\u6848\u70ba \\(20 + 10 + 1 = 31\\) \u5143\u3002

    \u5716 1-3 \u00a0 \u8ca8\u5e63\u627e\u96f6\u904e\u7a0b

    \u5728\u4ee5\u4e0a\u6b65\u9a5f\u4e2d\uff0c\u6211\u5011\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\uff08\u5118\u53ef\u80fd\u7528\u5927\u9762\u984d\u7684\u8ca8\u5e63\uff09\uff0c\u6700\u7d42\u5f97\u5230\u4e86\u53ef\u884c\u7684\u627e\u96f6\u65b9\u6848\u3002\u5f9e\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u89d2\u5ea6\u770b\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u201c\u8caa\u5a6a\u201d\u6f14\u7b97\u6cd5\u3002

    \u5c0f\u5230\u70f9\u98ea\u4e00\u9053\u83dc\uff0c\u5927\u5230\u661f\u969b\u822a\u884c\uff0c\u5e7e\u4e4e\u6240\u6709\u554f\u984c\u7684\u89e3\u6c7a\u90fd\u96e2\u4e0d\u958b\u6f14\u7b97\u6cd5\u3002\u8a08\u7b97\u6a5f\u7684\u51fa\u73fe\u4f7f\u5f97\u6211\u5011\u80fd\u5920\u900f\u904e\u7a0b\u5f0f\u8a2d\u8a08\u5c07\u8cc7\u6599\u7d50\u69cb\u5132\u5b58\u5728\u8a18\u61b6\u9ad4\u4e2d\uff0c\u540c\u6642\u7de8\u5beb\u7a0b\u5f0f\u78bc\u547c\u53eb CPU \u548c GPU \u57f7\u884c\u6f14\u7b97\u6cd5\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u6211\u5011\u5c31\u80fd\u628a\u751f\u6d3b\u4e2d\u7684\u554f\u984c\u8f49\u79fb\u5230\u8a08\u7b97\u6a5f\u4e0a\uff0c\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u89e3\u6c7a\u5404\u7a2e\u8907\u96dc\u554f\u984c\u3002

    Tip

    \u5982\u679c\u4f60\u5c0d\u8cc7\u6599\u7d50\u69cb\u3001\u6f14\u7b97\u6cd5\u3001\u9663\u5217\u548c\u4e8c\u5206\u641c\u5c0b\u7b49\u6982\u5ff5\u4ecd\u611f\u5230\u4e00\u77e5\u534a\u89e3\uff0c\u8acb\u7e7c\u7e8c\u5f80\u4e0b\u95b1\u8b80\uff0c\u672c\u66f8\u5c07\u5f15\u5c0e\u4f60\u9081\u5165\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u77e5\u8b58\u6bbf\u5802\u3002

    "},{"location":"chapter_introduction/summary/","title":"1.3 \u00a0 \u5c0f\u7d50","text":"
    • \u6f14\u7b97\u6cd5\u5728\u65e5\u5e38\u751f\u6d3b\u4e2d\u7121\u8655\u4e0d\u5728\uff0c\u4e26\u4e0d\u662f\u9059\u4e0d\u53ef\u53ca\u7684\u9ad8\u6df1\u77e5\u8b58\u3002\u5be6\u969b\u4e0a\uff0c\u6211\u5011\u5df2\u7d93\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u5b78\u6703\u4e86\u8a31\u591a\u6f14\u7b97\u6cd5\uff0c\u7528\u4ee5\u89e3\u6c7a\u751f\u6d3b\u4e2d\u7684\u5927\u5c0f\u554f\u984c\u3002
    • \u67e5\u5b57\u5178\u7684\u539f\u7406\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u76f8\u4e00\u81f4\u3002\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u9ad4\u73fe\u4e86\u5206\u800c\u6cbb\u4e4b\u7684\u91cd\u8981\u6f14\u7b97\u6cd5\u601d\u60f3\u3002
    • \u6574\u7406\u64b2\u514b\u7684\u904e\u7a0b\u8207\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u975e\u5e38\u985e\u4f3c\u3002\u63d2\u5165\u6392\u5e8f\u6f14\u7b97\u6cd5\u9069\u5408\u6392\u5e8f\u5c0f\u578b\u8cc7\u6599\u96c6\u3002
    • \u8ca8\u5e63\u627e\u96f6\u7684\u6b65\u9a5f\u672c\u8cea\u4e0a\u662f\u8caa\u5a6a\u6f14\u7b97\u6cd5\uff0c\u6bcf\u4e00\u6b65\u90fd\u63a1\u53d6\u7576\u524d\u770b\u4f86\u6700\u597d\u7684\u9078\u64c7\u3002
    • \u6f14\u7b97\u6cd5\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u800c\u8cc7\u6599\u7d50\u69cb\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\u3002
    • \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7dca\u5bc6\u76f8\u9023\u3002\u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\uff0c\u800c\u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002
    • \u6211\u5011\u53ef\u4ee5\u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728\uff0c\u7a4d\u6728\u4ee3\u8868\u8cc7\u6599\uff0c\u7a4d\u6728\u7684\u5f62\u72c0\u548c\u9023\u7dda\u65b9\u5f0f\u7b49\u4ee3\u8868\u8cc7\u6599\u7d50\u69cb\uff0c\u62fc\u88dd\u7a4d\u6728\u7684\u6b65\u9a5f\u5247\u5c0d\u61c9\u6f14\u7b97\u6cd5\u3002
    "},{"location":"chapter_introduction/what_is_dsa/","title":"1.2 \u00a0 \u6f14\u7b97\u6cd5\u662f\u4ec0\u9ebc","text":""},{"location":"chapter_introduction/what_is_dsa/#121","title":"1.2.1 \u00a0 \u6f14\u7b97\u6cd5\u5b9a\u7fa9","text":"

    \u6f14\u7b97\u6cd5\uff08algorithm\uff09\u662f\u5728\u6709\u9650\u6642\u9593\u5167\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u7684\u4e00\u7d44\u6307\u4ee4\u6216\u64cd\u4f5c\u6b65\u9a5f\uff0c\u5b83\u5177\u6709\u4ee5\u4e0b\u7279\u6027\u3002

    • \u554f\u984c\u662f\u660e\u78ba\u7684\uff0c\u5305\u542b\u6e05\u6670\u7684\u8f38\u5165\u548c\u8f38\u51fa\u5b9a\u7fa9\u3002
    • \u5177\u6709\u53ef\u884c\u6027\uff0c\u80fd\u5920\u5728\u6709\u9650\u6b65\u9a5f\u3001\u6642\u9593\u548c\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e0b\u5b8c\u6210\u3002
    • \u5404\u6b65\u9a5f\u90fd\u6709\u78ba\u5b9a\u7684\u542b\u7fa9\uff0c\u5728\u76f8\u540c\u7684\u8f38\u5165\u548c\u57f7\u884c\u689d\u4ef6\u4e0b\uff0c\u8f38\u51fa\u59cb\u7d42\u76f8\u540c\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#122","title":"1.2.2 \u00a0 \u8cc7\u6599\u7d50\u69cb\u5b9a\u7fa9","text":"

    \u8cc7\u6599\u7d50\u69cb\uff08data structure\uff09\u662f\u8a08\u7b97\u6a5f\u4e2d\u7d44\u7e54\u548c\u5132\u5b58\u8cc7\u6599\u7684\u65b9\u5f0f\uff0c\u5177\u6709\u4ee5\u4e0b\u8a2d\u8a08\u76ee\u6a19\u3002

    • \u7a7a\u9593\u4f54\u7528\u5118\u91cf\u5c11\uff0c\u4ee5\u7bc0\u7701\u8a08\u7b97\u6a5f\u8a18\u61b6\u9ad4\u3002
    • \u8cc7\u6599\u64cd\u4f5c\u5118\u53ef\u80fd\u5feb\u901f\uff0c\u6db5\u84cb\u8cc7\u6599\u8a2a\u554f\u3001\u65b0\u589e\u3001\u522a\u9664\u3001\u66f4\u65b0\u7b49\u3002
    • \u63d0\u4f9b\u7c21\u6f54\u7684\u8cc7\u6599\u8868\u793a\u548c\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4ee5\u4fbf\u6f14\u7b97\u6cd5\u9ad8\u6548\u57f7\u884c\u3002

    \u8cc7\u6599\u7d50\u69cb\u8a2d\u8a08\u662f\u4e00\u500b\u5145\u6eff\u6b0a\u8861\u7684\u904e\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\u5354\u3002\u4e0b\u9762\u8209\u5169\u500b\u4f8b\u5b50\u3002

    • \u93c8\u7d50\u4e32\u5217\u76f8\u8f03\u65bc\u9663\u5217\uff0c\u5728\u8cc7\u6599\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u4e0a\u66f4\u52a0\u4fbf\u6377\uff0c\u4f46\u72a7\u7272\u4e86\u8cc7\u6599\u8a2a\u554f\u901f\u5ea6\u3002
    • \u5716\u76f8\u8f03\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u63d0\u4f9b\u4e86\u66f4\u8c50\u5bcc\u7684\u908f\u8f2f\u8cc7\u8a0a\uff0c\u4f46\u9700\u8981\u4f54\u7528\u66f4\u5927\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    "},{"location":"chapter_introduction/what_is_dsa/#123","title":"1.2.3 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2","text":"

    \u5982\u5716 1-4 \u6240\u793a\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u9ad8\u5ea6\u76f8\u95dc\u3001\u7dca\u5bc6\u7d50\u5408\uff0c\u5177\u9ad4\u8868\u73fe\u5728\u4ee5\u4e0b\u4e09\u500b\u65b9\u9762\u3002

    • \u8cc7\u6599\u7d50\u69cb\u662f\u6f14\u7b97\u6cd5\u7684\u57fa\u77f3\u3002\u8cc7\u6599\u7d50\u69cb\u70ba\u6f14\u7b97\u6cd5\u63d0\u4f9b\u4e86\u7d50\u69cb\u5316\u5132\u5b58\u7684\u8cc7\u6599\uff0c\u4ee5\u53ca\u64cd\u4f5c\u8cc7\u6599\u7684\u65b9\u6cd5\u3002
    • \u6f14\u7b97\u6cd5\u662f\u8cc7\u6599\u7d50\u69cb\u767c\u63ee\u4f5c\u7528\u7684\u821e\u81fa\u3002\u8cc7\u6599\u7d50\u69cb\u672c\u8eab\u50c5\u5132\u5b58\u8cc7\u6599\u8cc7\u8a0a\uff0c\u7d50\u5408\u6f14\u7b97\u6cd5\u624d\u80fd\u89e3\u6c7a\u7279\u5b9a\u554f\u984c\u3002
    • \u6f14\u7b97\u6cd5\u901a\u5e38\u53ef\u4ee5\u57fa\u65bc\u4e0d\u540c\u7684\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\uff0c\u4f46\u57f7\u884c\u6548\u7387\u53ef\u80fd\u76f8\u5dee\u5f88\u5927\uff0c\u9078\u64c7\u5408\u9069\u7684\u8cc7\u6599\u7d50\u69cb\u662f\u95dc\u9375\u3002

    \u5716 1-4 \u00a0 \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u95dc\u4fc2

    \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7336\u5982\u5716 1-5 \u6240\u793a\u7684\u62fc\u88dd\u7a4d\u6728\u3002\u4e00\u5957\u7a4d\u6728\uff0c\u9664\u4e86\u5305\u542b\u8a31\u591a\u96f6\u4ef6\u4e4b\u5916\uff0c\u9084\u9644\u6709\u8a73\u7d30\u7684\u7d44\u88dd\u8aaa\u660e\u66f8\u3002\u6211\u5011\u6309\u7167\u8aaa\u660e\u66f8\u4e00\u6b65\u6b65\u64cd\u4f5c\uff0c\u5c31\u80fd\u7d44\u88dd\u51fa\u7cbe\u7f8e\u7684\u7a4d\u6728\u6a21\u578b\u3002

    \u5716 1-5 \u00a0 \u62fc\u88dd\u7a4d\u6728

    \u5169\u8005\u7684\u8a73\u7d30\u5c0d\u61c9\u95dc\u4fc2\u5982\u8868 1-1 \u6240\u793a\u3002

    \u8868 1-1 \u00a0 \u5c07\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u985e\u6bd4\u70ba\u62fc\u88dd\u7a4d\u6728

    \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5 \u62fc\u88dd\u7a4d\u6728 \u8f38\u5165\u8cc7\u6599 \u672a\u62fc\u88dd\u7684\u7a4d\u6728 \u8cc7\u6599\u7d50\u69cb \u7a4d\u6728\u7d44\u7e54\u5f62\u5f0f\uff0c\u5305\u62ec\u5f62\u72c0\u3001\u5927\u5c0f\u3001\u9023\u7dda\u65b9\u5f0f\u7b49 \u6f14\u7b97\u6cd5 \u628a\u7a4d\u6728\u62fc\u6210\u76ee\u6a19\u5f62\u614b\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\u6b65\u9a5f \u8f38\u51fa\u8cc7\u6599 \u7a4d\u6728\u6a21\u578b

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u662f\u7368\u7acb\u65bc\u7a0b\u5f0f\u8a9e\u8a00\u7684\u3002\u6b63\u56e0\u5982\u6b64\uff0c\u672c\u66f8\u5f97\u4ee5\u63d0\u4f9b\u57fa\u65bc\u591a\u7a2e\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5be6\u73fe\u3002

    \u7d04\u5b9a\u4fd7\u6210\u7684\u7c21\u7a31

    \u5728\u5be6\u969b\u8a0e\u8ad6\u6642\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u201c\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u201d\u7c21\u7a31\u70ba\u201c\u6f14\u7b97\u6cd5\u201d\u3002\u6bd4\u5982\u773e\u6240\u5468\u77e5\u7684 LeetCode \u6f14\u7b97\u6cd5\u984c\u76ee\uff0c\u5be6\u969b\u4e0a\u540c\u6642\u8003\u67e5\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u5169\u65b9\u9762\u7684\u77e5\u8b58\u3002

    "},{"location":"chapter_preface/","title":"\u7b2c 0 \u7ae0 \u00a0 \u524d\u8a00","text":"

    Abstract

    \u6f14\u7b97\u6cd5\u7336\u5982\u7f8e\u5999\u7684\u4ea4\u97ff\u6a02\uff0c\u6bcf\u4e00\u884c\u7a0b\u5f0f\u78bc\u90fd\u50cf\u97fb\u5f8b\u822c\u6d41\u6dcc\u3002

    \u9858\u9019\u672c\u66f8\u5728\u4f60\u7684\u8166\u6d77\u4e2d\u8f15\u8f15\u97ff\u8d77\uff0c\u7559\u4e0b\u7368\u7279\u800c\u6df1\u523b\u7684\u65cb\u5f8b\u3002

    "},{"location":"chapter_preface/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 0.1 \u00a0 \u95dc\u65bc\u672c\u66f8
    • 0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8
    • 0.3 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_preface/about_the_book/","title":"0.1 \u00a0 \u95dc\u65bc\u672c\u66f8","text":"

    \u672c\u5c08\u6848\u65e8\u5728\u5efa\u7acb\u4e00\u672c\u958b\u6e90\u3001\u514d\u8cbb\u3001\u5c0d\u65b0\u624b\u53cb\u597d\u7684\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5165\u9580\u6559\u7a0b\u3002

    • \u5168\u66f8\u63a1\u7528\u52d5\u756b\u5716\u89e3\uff0c\u7d50\u69cb\u5316\u5730\u8b1b\u89e3\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u5167\u5bb9\u6e05\u6670\u6613\u61c2\uff0c\u5b78\u7fd2\u66f2\u7dda\u5e73\u6ed1\u3002
    • \u6f14\u7b97\u6cd5\u6e90\u7a0b\u5f0f\u78bc\u7686\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u652f\u6301 Python\u3001C++\u3001Java\u3001C#\u3001Go\u3001Swift\u3001JavaScript\u3001TypeScript\u3001Dart\u3001Rust\u3001C \u548c Zig \u7b49\u8a9e\u8a00\u3002
    • \u9f13\u52f5\u8b80\u8005\u5728\u7dda\u4e0a\u7ae0\u7bc0\u8a55\u8ad6\u5340\u4e92\u5e6b\u4e92\u52a9\u3001\u5171\u540c\u9032\u6b65\uff0c\u63d0\u554f\u8207\u8a55\u8ad6\u901a\u5e38\u53ef\u5728\u5169\u65e5\u5167\u5f97\u5230\u56de\u8986\u3002
    "},{"location":"chapter_preface/about_the_book/#011","title":"0.1.1 \u00a0 \u8b80\u8005\u7269\u4ef6","text":"

    \u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\uff0c\u5f9e\u672a\u63a5\u89f8\u904e\u6f14\u7b97\u6cd5\uff0c\u6216\u8005\u5df2\u7d93\u6709\u4e00\u4e9b\u5237\u984c\u7d93\u9a57\uff0c\u5c0d\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u6709\u6a21\u7cca\u7684\u8a8d\u8b58\uff0c\u5728\u6703\u8207\u4e0d\u6703\u4e4b\u9593\u53cd\u8986\u6a6b\u8df3\uff0c\u90a3\u9ebc\u672c\u66f8\u6b63\u662f\u70ba\u4f60\u91cf\u8eab\u5b9a\u88fd\u7684\uff01

    \u5982\u679c\u4f60\u5df2\u7d93\u7a4d\u7d2f\u4e00\u5b9a\u7684\u5237\u984c\u91cf\uff0c\u719f\u6089\u5927\u90e8\u5206\u984c\u578b\uff0c\u90a3\u9ebc\u672c\u66f8\u53ef\u52a9\u4f60\u56de\u9867\u8207\u68b3\u7406\u6f14\u7b97\u6cd5\u77e5\u8b58\u9ad4\u7cfb\uff0c\u5009\u5eab\u6e90\u7a0b\u5f0f\u78bc\u53ef\u4ee5\u7576\u4f5c\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u6216\u201c\u6f14\u7b97\u6cd5\u5b57\u5178\u201d\u4f86\u4f7f\u7528\u3002

    \u82e5\u4f60\u662f\u6f14\u7b97\u6cd5\u201c\u5927\u795e\u201d\uff0c\u6211\u5011\u671f\u5f85\u6536\u5230\u4f60\u7684\u5bf6\u8cb4\u5efa\u8b70\uff0c\u6216\u8005\u4e00\u8d77\u53c3\u8207\u5275\u4f5c\u3002

    \u524d\u7f6e\u689d\u4ef6

    \u4f60\u9700\u8981\u81f3\u5c11\u5177\u5099\u4efb\u4e00\u8a9e\u8a00\u7684\u7a0b\u5f0f\u8a2d\u8a08\u57fa\u790e\uff0c\u80fd\u5920\u95b1\u8b80\u548c\u7de8\u5beb\u7c21\u55ae\u7a0b\u5f0f\u78bc\u3002

    "},{"location":"chapter_preface/about_the_book/#012","title":"0.1.2 \u00a0 \u5167\u5bb9\u7d50\u69cb","text":"

    \u672c\u66f8\u7684\u4e3b\u8981\u5167\u5bb9\u5982\u5716 0-1 \u6240\u793a\u3002

    • \u8907\u96dc\u5ea6\u5206\u6790\uff1a\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u7684\u8a55\u50f9\u7dad\u5ea6\u8207\u65b9\u6cd5\u3002\u6642\u9593\u8907\u96dc\u5ea6\u548c\u7a7a\u9593\u8907\u96dc\u5ea6\u7684\u63a8\u7b97\u65b9\u6cd5\u3001\u5e38\u898b\u578b\u5225\u3001\u793a\u4f8b\u7b49\u3002
    • \u8cc7\u6599\u7d50\u69cb\uff1a\u57fa\u672c\u8cc7\u6599\u578b\u5225\u548c\u8cc7\u6599\u7d50\u69cb\u7684\u5206\u985e\u65b9\u6cd5\u3002\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u5806\u758a\u3001\u4f47\u5217\u3001\u96dc\u6e4a\u8868\u3001\u6a39\u3001\u5806\u7a4d\u3001\u5716\u7b49\u8cc7\u6599\u7d50\u69cb\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u5e38\u7528\u64cd\u4f5c\u3001\u5e38\u898b\u578b\u5225\u3001\u5178\u578b\u61c9\u7528\u3001\u5be6\u73fe\u65b9\u6cd5\u7b49\u3002
    • \u6f14\u7b97\u6cd5\uff1a\u641c\u5c0b\u3001\u6392\u5e8f\u3001\u5206\u6cbb\u3001\u56de\u6eaf\u3001\u52d5\u614b\u898f\u5283\u3001\u8caa\u5a6a\u7b49\u6f14\u7b97\u6cd5\u7684\u5b9a\u7fa9\u3001\u512a\u7f3a\u9ede\u3001\u6548\u7387\u3001\u61c9\u7528\u5834\u666f\u3001\u89e3\u984c\u6b65\u9a5f\u548c\u793a\u4f8b\u554f\u984c\u7b49\u3002

    \u5716 0-1 \u00a0 \u672c\u66f8\u4e3b\u8981\u5167\u5bb9

    "},{"location":"chapter_preface/about_the_book/#013","title":"0.1.3 \u00a0 \u81f4\u8b1d","text":"

    \u672c\u66f8\u5728\u958b\u6e90\u793e\u7fa4\u773e\u591a\u8ca2\u737b\u8005\u7684\u5171\u540c\u52aa\u529b\u4e0b\u4e0d\u65b7\u5b8c\u5584\u3002\u611f\u8b1d\u6bcf\u4e00\u4f4d\u6295\u5165\u6642\u9593\u8207\u7cbe\u529b\u7684\u64b0\u7a3f\u4eba\uff0c\u4ed6\u5011\u662f\uff08\u6309\u7167 GitHub \u81ea\u52d5\u751f\u6210\u7684\u9806\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\u66f8\u7684\u7a0b\u5f0f\u78bc\u5be9\u95b1\u5de5\u4f5c\u7531 codingonion\u3001curtishd\u3001Gonglja\u3001gvenusleo\u3001hpstory\u3001justin-tse\u3001krahets\u3001night-cruise\u3001nuomi1 \u548c Reanon \u5b8c\u6210\uff08\u6309\u7167\u9996\u5b57\u6bcd\u9806\u5e8f\u6392\u5217\uff09\u3002\u611f\u8b1d\u4ed6\u5011\u4ed8\u51fa\u7684\u6642\u9593\u8207\u7cbe\u529b\uff0c\u6b63\u662f\u4ed6\u5011\u78ba\u4fdd\u4e86\u5404\u8a9e\u8a00\u7a0b\u5f0f\u78bc\u7684\u898f\u7bc4\u8207\u7d71\u4e00\u3002

    \u5728\u672c\u66f8\u7684\u5275\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5f97\u5230\u4e86\u8a31\u591a\u4eba\u7684\u5e6b\u52a9\u3002

    • \u611f\u8b1d\u6211\u5728\u516c\u53f8\u7684\u5c0e\u5e2b\u674e\u6c50\u535a\u58eb\uff0c\u5728\u4e00\u6b21\u66a2\u8ac7\u4e2d\u4f60\u9f13\u52f5\u6211\u201c\u5feb\u884c\u52d5\u8d77\u4f86\u201d\uff0c\u5805\u5b9a\u4e86\u6211\u5beb\u9019\u672c\u66f8\u7684\u6c7a\u5fc3\uff1b
    • \u611f\u8b1d\u6211\u7684\u5973\u670b\u53cb\u6ce1\u6ce1\u4f5c\u70ba\u672c\u66f8\u7684\u9996\u4f4d\u8b80\u8005\uff0c\u5f9e\u6f14\u7b97\u6cd5\u5c0f\u767d\u7684\u89d2\u5ea6\u63d0\u51fa\u8a31\u591a\u5bf6\u8cb4\u5efa\u8b70\uff0c\u4f7f\u5f97\u672c\u66f8\u66f4\u9069\u5408\u65b0\u624b\u95b1\u8b80\uff1b
    • \u611f\u8b1d\u9a30\u5bf6\u3001\u7426\u5bf6\u3001\u98db\u5bf6\u70ba\u672c\u66f8\u8d77\u4e86\u4e00\u500b\u5bcc\u6709\u5275\u610f\u7684\u540d\u5b57\uff0c\u559a\u8d77\u5927\u5bb6\u5beb\u4e0b\u7b2c\u4e00\u884c\u7a0b\u5f0f\u78bc\u201cHello World!\u201d\u7684\u7f8e\u597d\u56de\u61b6\uff1b
    • \u611f\u8b1d\u6821\u9293\u5728\u667a\u6167\u8ca1\u7522\u6b0a\u65b9\u9762\u63d0\u4f9b\u7684\u5c08\u696d\u5e6b\u52a9\uff0c\u9019\u5c0d\u672c\u958b\u6e90\u66f8\u7684\u5b8c\u5584\u8d77\u5230\u4e86\u91cd\u8981\u4f5c\u7528\uff1b
    • \u611f\u8b1d\u8607\u6f7c\u70ba\u672c\u66f8\u8a2d\u8a08\u4e86\u7cbe\u7f8e\u7684\u5c01\u9762\u548c logo \uff0c\u4e26\u5728\u6211\u7684\u5f37\u8feb\u75c7\u7684\u9a45\u4f7f\u4e0b\u591a\u6b21\u8010\u5fc3\u4fee\u6539\uff1b
    • \u611f\u8b1d @squidfunk \u63d0\u4f9b\u7684\u6392\u7248\u5efa\u8b70\uff0c\u4ee5\u53ca\u4ed6\u958b\u767c\u7684\u958b\u6e90\u6587\u4ef6\u4e3b\u984c Material-for-MkDocs \u3002

    \u5728\u5beb\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u95b1\u8b80\u4e86\u8a31\u591a\u95dc\u65bc\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u6559\u6750\u548c\u6587\u7ae0\u3002\u9019\u4e9b\u4f5c\u54c1\u70ba\u672c\u66f8\u63d0\u4f9b\u4e86\u512a\u79c0\u7684\u7bc4\u672c\uff0c\u78ba\u4fdd\u4e86\u672c\u66f8\u5167\u5bb9\u7684\u6e96\u78ba\u6027\u8207\u54c1\u8cea\u3002\u5728\u6b64\u611f\u8b1d\u6240\u6709\u8001\u5e2b\u548c\u524d\u8f29\u7684\u5091\u51fa\u8ca2\u737b\uff01

    \u672c\u66f8\u5021\u5c0e\u624b\u8166\u4e26\u7528\u7684\u5b78\u7fd2\u65b9\u5f0f\uff0c\u5728\u9019\u4e00\u9ede\u4e0a\u6211\u6df1\u53d7\u300a\u52d5\u624b\u5b78\u6df1\u5ea6\u5b78\u7fd2\u300b\u7684\u555f\u767c\u3002\u5728\u6b64\u5411\u5404\u4f4d\u8b80\u8005\u5f37\u70c8\u63a8\u85a6\u9019\u672c\u512a\u79c0\u7684\u8457\u4f5c\u3002

    \u8877\u5fc3\u611f\u8b1d\u6211\u7684\u7236\u6bcd\uff0c\u6b63\u662f\u4f60\u5011\u4e00\u76f4\u4ee5\u4f86\u7684\u652f\u6301\u8207\u9f13\u52f5\uff0c\u8b93\u6211\u6709\u6a5f\u6703\u505a\u9019\u4ef6\u5bcc\u6709\u8da3\u5473\u7684\u4e8b\u3002

    "},{"location":"chapter_preface/suggestions/","title":"0.2 \u00a0 \u5982\u4f55\u4f7f\u7528\u672c\u66f8","text":"

    Tip

    \u70ba\u4e86\u7372\u5f97\u6700\u4f73\u7684\u95b1\u8b80\u9ad4\u9a57\uff0c\u5efa\u8b70\u4f60\u901a\u8b80\u672c\u7bc0\u5167\u5bb9\u3002

    "},{"location":"chapter_preface/suggestions/#021","title":"0.2.1 \u00a0 \u884c\u6587\u98a8\u683c\u7d04\u5b9a","text":"
    • \u6a19\u984c\u5f8c\u6a19\u8a3b * \u7684\u662f\u9078\u8b80\u7ae0\u7bc0\uff0c\u5167\u5bb9\u76f8\u5c0d\u56f0\u96e3\u3002\u5982\u679c\u4f60\u7684\u6642\u9593\u6709\u9650\uff0c\u53ef\u4ee5\u5148\u8df3\u904e\u3002
    • \u5c08\u696d\u8853\u8a9e\u6703\u4f7f\u7528\u9ed1\u9ad4\uff08\u7d19\u8cea\u7248\u548c PDF \u7248\uff09\u6216\u65b0\u589e\u4e0b\u5283\u7dda\uff08\u7db2\u9801\u7248\uff09\uff0c\u4f8b\u5982\u9663\u5217\uff08array\uff09\u3002\u5efa\u8b70\u8a18\u4f4f\u5b83\u5011\uff0c\u4ee5\u4fbf\u95b1\u8b80\u6587\u737b\u3002
    • \u91cd\u9ede\u5167\u5bb9\u548c\u7e3d\u7d50\u6027\u8a9e\u53e5\u6703 \u52a0\u7c97\uff0c\u9019\u985e\u6587\u5b57\u503c\u5f97\u7279\u5225\u95dc\u6ce8\u3002
    • \u6709\u7279\u6307\u542b\u7fa9\u7684\u8a5e\u53e5\u6703\u4f7f\u7528\u201c\u5f15\u865f\u201d\u6a19\u8a3b\uff0c\u4ee5\u907f\u514d\u6b67\u7fa9\u3002
    • \u7576\u6d89\u53ca\u7a0b\u5f0f\u8a9e\u8a00\u4e4b\u9593\u4e0d\u4e00\u81f4\u7684\u540d\u8a5e\u6642\uff0c\u672c\u66f8\u5747\u4ee5 Python \u70ba\u6e96\uff0c\u4f8b\u5982\u4f7f\u7528 None \u4f86\u8868\u793a\u201c\u7a7a\u201d\u3002
    • \u672c\u66f8\u90e8\u5206\u653e\u68c4\u4e86\u7a0b\u5f0f\u8a9e\u8a00\u7684\u8a3b\u91cb\u898f\u7bc4\uff0c\u4ee5\u63db\u53d6\u66f4\u52a0\u7dca\u6e4a\u7684\u5167\u5bb9\u6392\u7248\u3002\u8a3b\u91cb\u4e3b\u8981\u5206\u70ba\u4e09\u7a2e\u985e\u578b\uff1a\u6a19\u984c\u8a3b\u91cb\u3001\u5167\u5bb9\u8a3b\u91cb\u3001\u591a\u884c\u8a3b\u91cb\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    \"\"\"\u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\"\"\"\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n\"\"\"\n\u591a\u884c\n\u8a3b\u91cb\n\"\"\"\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    /* \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 */\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n/**\n * \u591a\u884c\n * \u8a3b\u91cb\n */\n
    ### \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49 ###\n\n# \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n# \u591a\u884c\n# \u8a3b\u91cb\n
    // \u6a19\u984c\u8a3b\u91cb\uff0c\u7528\u65bc\u6a19\u8a3b\u51fd\u5f0f\u3001\u985e\u5225\u3001\u6e2c\u8a66\u6a23\u4f8b\u7b49\n\n// \u5167\u5bb9\u8a3b\u91cb\uff0c\u7528\u65bc\u8a73\u89e3\u7a0b\u5f0f\u78bc\n\n// \u591a\u884c\n// \u8a3b\u91cb\n
    "},{"location":"chapter_preface/suggestions/#022","title":"0.2.2 \u00a0 \u5728\u52d5\u756b\u5716\u89e3\u4e2d\u9ad8\u6548\u5b78\u7fd2","text":"

    \u76f8\u8f03\u65bc\u6587\u5b57\uff0c\u5f71\u7247\u548c\u5716\u7247\u5177\u6709\u66f4\u9ad8\u7684\u8cc7\u8a0a\u5bc6\u5ea6\u548c\u7d50\u69cb\u5316\u7a0b\u5ea6\uff0c\u66f4\u6613\u65bc\u7406\u89e3\u3002\u5728\u672c\u66f8\u4e2d\uff0c\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u5c07\u4e3b\u8981\u900f\u904e\u52d5\u756b\u4ee5\u5716\u89e3\u5f62\u5f0f\u5c55\u793a\uff0c\u800c\u6587\u5b57\u5247\u4f5c\u70ba\u89e3\u91cb\u8207\u88dc\u5145\u3002

    \u5982\u679c\u4f60\u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u767c\u73fe\u67d0\u6bb5\u5167\u5bb9\u63d0\u4f9b\u77ad\u5982\u5716 0-2 \u6240\u793a\u7684\u52d5\u756b\u5716\u89e3\uff0c\u8acb\u4ee5\u5716\u70ba\u4e3b\u3001\u4ee5\u6587\u5b57\u70ba\u8f14\uff0c\u7d9c\u5408\u5169\u8005\u4f86\u7406\u89e3\u5167\u5bb9\u3002

    \u5716 0-2 \u00a0 \u52d5\u756b\u5716\u89e3\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#023","title":"0.2.3 \u00a0 \u5728\u7a0b\u5f0f\u78bc\u5be6\u8e10\u4e2d\u52a0\u6df1\u7406\u89e3","text":"

    \u672c\u66f8\u7684\u914d\u5957\u7a0b\u5f0f\u78bc\u8a17\u7ba1\u5728 GitHub \u5009\u5eab\u3002\u5982\u5716 0-3 \u6240\u793a\uff0c\u6e90\u7a0b\u5f0f\u78bc\u9644\u6709\u6e2c\u8a66\u6a23\u4f8b\uff0c\u53ef\u4e00\u9375\u57f7\u884c\u3002

    \u5982\u679c\u6642\u9593\u5141\u8a31\uff0c\u5efa\u8b70\u4f60\u53c3\u7167\u7a0b\u5f0f\u78bc\u81ea\u884c\u6572\u4e00\u904d\u3002\u5982\u679c\u5b78\u7fd2\u6642\u9593\u6709\u9650\uff0c\u8acb\u81f3\u5c11\u901a\u8b80\u4e26\u57f7\u884c\u6240\u6709\u7a0b\u5f0f\u78bc\u3002

    \u8207\u95b1\u8b80\u7a0b\u5f0f\u78bc\u76f8\u6bd4\uff0c\u7de8\u5beb\u7a0b\u5f0f\u78bc\u7684\u904e\u7a0b\u5f80\u5f80\u80fd\u5e36\u4f86\u66f4\u591a\u6536\u7a6b\u3002\u52d5\u624b\u5b78\uff0c\u624d\u662f\u771f\u7684\u5b78\u3002

    \u5716 0-3 \u00a0 \u57f7\u884c\u7a0b\u5f0f\u78bc\u793a\u4f8b

    \u57f7\u884c\u7a0b\u5f0f\u78bc\u7684\u524d\u7f6e\u5de5\u4f5c\u4e3b\u8981\u5206\u70ba\u4e09\u6b65\u3002

    \u7b2c\u4e00\u6b65\uff1a\u5b89\u88dd\u672c\u5730\u7a0b\u5f0f\u8a2d\u8a08\u74b0\u5883\u3002\u8acb\u53c3\u7167\u9644\u9304\u6240\u793a\u7684\u6559\u7a0b\u9032\u884c\u5b89\u88dd\uff0c\u5982\u679c\u5df2\u5b89\u88dd\uff0c\u5247\u53ef\u8df3\u904e\u6b64\u6b65\u9a5f\u3002

    \u7b2c\u4e8c\u6b65\uff1a\u514b\u9686\u6216\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u5009\u5eab\u3002\u524d\u5f80 GitHub \u5009\u5eab\u3002\u5982\u679c\u5df2\u7d93\u5b89\u88dd Git \uff0c\u53ef\u4ee5\u900f\u904e\u4ee5\u4e0b\u547d\u4ee4\u514b\u9686\u672c\u5009\u5eab\uff1a

    git clone https://github.com/krahets/hello-algo.git\n

    \u7576\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5716 0-4 \u6240\u793a\u7684\u4f4d\u7f6e\uff0c\u9ede\u9078\u201cDownload ZIP\u201d\u6309\u9215\u76f4\u63a5\u4e0b\u8f09\u7a0b\u5f0f\u78bc\u58d3\u7e2e\u5305\uff0c\u7136\u5f8c\u5728\u672c\u5730\u89e3\u58d3\u5373\u53ef\u3002

    \u5716 0-4 \u00a0 \u514b\u9686\u5009\u5eab\u8207\u4e0b\u8f09\u7a0b\u5f0f\u78bc

    \u7b2c\u4e09\u6b65\uff1a\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 0-5 \u6240\u793a\uff0c\u5c0d\u65bc\u9802\u90e8\u6a19\u6709\u6a94\u6848\u540d\u7a31\u7684\u7a0b\u5f0f\u78bc\u584a\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u5009\u5eab\u7684 codes \u6a94\u6848\u593e\u5167\u627e\u5230\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u3002\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848\u53ef\u4e00\u9375\u57f7\u884c\uff0c\u5c07\u5e6b\u52a9\u4f60\u7bc0\u7701\u4e0d\u5fc5\u8981\u7684\u9664\u932f\u6642\u9593\uff0c\u8b93\u4f60\u80fd\u5920\u5c08\u6ce8\u65bc\u5b78\u7fd2\u5167\u5bb9\u3002

    \u5716 0-5 \u00a0 \u7a0b\u5f0f\u78bc\u584a\u8207\u5c0d\u61c9\u7684\u6e90\u7a0b\u5f0f\u78bc\u6a94\u6848

    \u9664\u4e86\u672c\u5730\u57f7\u884c\u7a0b\u5f0f\u78bc\uff0c\u7db2\u9801\u7248\u9084\u652f\u6301 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c\uff08\u57fa\u65bc pythontutor \u5be6\u73fe\uff09\u3002\u5982\u5716 0-6 \u6240\u793a\uff0c\u4f60\u53ef\u4ee5\u9ede\u9078\u7a0b\u5f0f\u78bc\u584a\u4e0b\u65b9\u7684\u201c\u8996\u89ba\u5316\u57f7\u884c\u201d\u4f86\u5c55\u958b\u6aa2\u8996\uff0c\u89c0\u5bdf\u6f14\u7b97\u6cd5\u7a0b\u5f0f\u78bc\u7684\u57f7\u884c\u904e\u7a0b\uff1b\u4e5f\u53ef\u4ee5\u9ede\u9078\u201c\u5168\u5c4f\u89c0\u770b\u201d\uff0c\u4ee5\u7372\u5f97\u66f4\u597d\u7684\u95b1\u89bd\u9ad4\u9a57\u3002

    \u5716 0-6 \u00a0 Python \u7a0b\u5f0f\u78bc\u7684\u8996\u89ba\u5316\u57f7\u884c

    "},{"location":"chapter_preface/suggestions/#024","title":"0.2.4 \u00a0 \u5728\u63d0\u554f\u8a0e\u8ad6\u4e2d\u5171\u540c\u6210\u9577","text":"

    \u5728\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u8acb\u4e0d\u8981\u8f15\u6613\u8df3\u904e\u90a3\u4e9b\u6c92\u5b78\u660e\u767d\u7684\u77e5\u8b58\u9ede\u3002\u6b61\u8fce\u5728\u8a55\u8ad6\u5340\u63d0\u51fa\u4f60\u7684\u554f\u984c\uff0c\u6211\u548c\u5c0f\u5925\u4f34\u5011\u5c07\u7aed\u8aa0\u70ba\u4f60\u89e3\u7b54\uff0c\u4e00\u822c\u60c5\u6cc1\u4e0b\u53ef\u5728\u5169\u5929\u5167\u56de\u8986\u3002

    \u5982\u5716 0-7 \u6240\u793a\uff0c\u7db2\u9801\u7248\u6bcf\u500b\u7ae0\u7bc0\u7684\u5e95\u90e8\u90fd\u914d\u6709\u8a55\u8ad6\u5340\u3002\u5e0c\u671b\u4f60\u80fd\u591a\u95dc\u6ce8\u8a55\u8ad6\u5340\u7684\u5167\u5bb9\u3002\u4e00\u65b9\u9762\uff0c\u4f60\u53ef\u4ee5\u77ad\u89e3\u5927\u5bb6\u9047\u5230\u7684\u554f\u984c\uff0c\u5f9e\u800c\u67e5\u6f0f\u88dc\u7f3a\uff0c\u6fc0\u767c\u66f4\u6df1\u5165\u7684\u601d\u8003\u3002\u53e6\u4e00\u65b9\u9762\uff0c\u671f\u5f85\u4f60\u80fd\u6177\u6168\u5730\u56de\u7b54\u5176\u4ed6\u5c0f\u5925\u4f34\u7684\u554f\u984c\uff0c\u5206\u4eab\u4f60\u7684\u898b\u89e3\uff0c\u5e6b\u52a9\u4ed6\u4eba\u9032\u6b65\u3002

    \u5716 0-7 \u00a0 \u8a55\u8ad6\u5340\u793a\u4f8b

    "},{"location":"chapter_preface/suggestions/#025","title":"0.2.5 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda","text":"

    \u5f9e\u7e3d\u9ad4\u4e0a\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u5b78\u7fd2\u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u7684\u904e\u7a0b\u5283\u5206\u70ba\u4e09\u500b\u968e\u6bb5\u3002

    1. \u968e\u6bb5\u4e00\uff1a\u6f14\u7b97\u6cd5\u5165\u9580\u3002\u6211\u5011\u9700\u8981\u719f\u6089\u5404\u7a2e\u8cc7\u6599\u7d50\u69cb\u7684\u7279\u9ede\u548c\u7528\u6cd5\uff0c\u5b78\u7fd2\u4e0d\u540c\u6f14\u7b97\u6cd5\u7684\u539f\u7406\u3001\u6d41\u7a0b\u3001\u7528\u9014\u548c\u6548\u7387\u7b49\u65b9\u9762\u7684\u5167\u5bb9\u3002
    2. \u968e\u6bb5\u4e8c\uff1a\u5237\u6f14\u7b97\u6cd5\u984c\u3002\u5efa\u8b70\u5f9e\u71b1\u9580\u984c\u76ee\u958b\u5237\uff0c\u5148\u7a4d\u7d2f\u81f3\u5c11 100 \u9053\u984c\u76ee\uff0c\u719f\u6089\u4e3b\u6d41\u7684\u6f14\u7b97\u6cd5\u554f\u984c\u3002\u521d\u6b21\u5237\u984c\u6642\uff0c\u201c\u77e5\u8b58\u907a\u5fd8\u201d\u53ef\u80fd\u662f\u4e00\u500b\u6311\u6230\uff0c\u4f46\u8acb\u653e\u5fc3\uff0c\u9019\u662f\u5f88\u6b63\u5e38\u7684\u3002\u6211\u5011\u53ef\u4ee5\u6309\u7167\u201c\u827e\u8cd3\u6d69\u65af\u907a\u5fd8\u66f2\u7dda\u201d\u4f86\u8907\u7fd2\u984c\u76ee\uff0c\u901a\u5e38\u5728\u9032\u884c 3\uff5e5 \u8f2a\u7684\u91cd\u8907\u5f8c\uff0c\u5c31\u80fd\u5c07\u5176\u7262\u8a18\u5728\u5fc3\u3002\u63a8\u85a6\u7684\u984c\u55ae\u548c\u5237\u984c\u8a08\u5283\u8acb\u898b\u6b64 GitHub \u5009\u5eab\u3002
    3. \u968e\u6bb5\u4e09\uff1a\u642d\u5efa\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5b78\u7fd2\u65b9\u9762\uff0c\u6211\u5011\u53ef\u4ee5\u95b1\u8b80\u6f14\u7b97\u6cd5\u5c08\u6b04\u6587\u7ae0\u3001\u89e3\u984c\u6846\u67b6\u548c\u6f14\u7b97\u6cd5\u6559\u6750\uff0c\u4ee5\u4e0d\u65b7\u8c50\u5bcc\u77e5\u8b58\u9ad4\u7cfb\u3002\u5728\u5237\u984c\u65b9\u9762\uff0c\u53ef\u4ee5\u5617\u8a66\u63a1\u7528\u9032\u968e\u5237\u984c\u7b56\u7565\uff0c\u5982\u6309\u5c08\u984c\u5206\u985e\u3001\u4e00\u984c\u591a\u89e3\u3001\u4e00\u89e3\u591a\u984c\u7b49\uff0c\u76f8\u95dc\u7684\u5237\u984c\u5fc3\u5f97\u53ef\u4ee5\u5728\u5404\u500b\u793e\u7fa4\u627e\u5230\u3002

    \u5982\u5716 0-8 \u6240\u793a\uff0c\u672c\u66f8\u5167\u5bb9\u4e3b\u8981\u6db5\u84cb\u201c\u968e\u6bb5\u4e00\u201d\uff0c\u65e8\u5728\u5e6b\u52a9\u4f60\u66f4\u9ad8\u6548\u5730\u5c55\u958b\u968e\u6bb5\u4e8c\u548c\u968e\u6bb5\u4e09\u7684\u5b78\u7fd2\u3002

    \u5716 0-8 \u00a0 \u6f14\u7b97\u6cd5\u5b78\u7fd2\u8def\u7dda

    "},{"location":"chapter_preface/summary/","title":"0.3 \u00a0 \u5c0f\u7d50","text":"
    • \u672c\u66f8\u7684\u4e3b\u8981\u53d7\u773e\u662f\u6f14\u7b97\u6cd5\u521d\u5b78\u8005\u3002\u5982\u679c\u4f60\u5df2\u6709\u4e00\u5b9a\u57fa\u790e\uff0c\u672c\u66f8\u80fd\u5e6b\u52a9\u4f60\u7cfb\u7d71\u56de\u9867\u6f14\u7b97\u6cd5\u77e5\u8b58\uff0c\u66f8\u4e2d\u6e90\u7a0b\u5f0f\u78bc\u4e5f\u53ef\u4f5c\u70ba\u201c\u5237\u984c\u5de5\u5177\u5eab\u201d\u4f7f\u7528\u3002
    • \u66f8\u4e2d\u5167\u5bb9\u4e3b\u8981\u5305\u62ec\u8907\u96dc\u5ea6\u5206\u6790\u3001\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e09\u90e8\u5206\uff0c\u6db5\u84cb\u4e86\u8a72\u9818\u57df\u7684\u5927\u90e8\u5206\u4e3b\u984c\u3002
    • \u5c0d\u65bc\u6f14\u7b97\u6cd5\u65b0\u624b\uff0c\u5728\u521d\u5b78\u968e\u6bb5\u95b1\u8b80\u4e00\u672c\u5165\u9580\u66f8\u81f3\u95dc\u91cd\u8981\uff0c\u53ef\u4ee5\u5c11\u8d70\u8a31\u591a\u5f4e\u8def\u3002
    • \u66f8\u4e2d\u7684\u52d5\u756b\u5716\u89e3\u901a\u5e38\u7528\u65bc\u4ecb\u7d39\u91cd\u9ede\u548c\u96e3\u9ede\u77e5\u8b58\u3002\u95b1\u8b80\u672c\u66f8\u6642\uff0c\u61c9\u7d66\u4e88\u9019\u4e9b\u5167\u5bb9\u66f4\u591a\u95dc\u6ce8\u3002
    • \u5be6\u8e10\u4e43\u5b78\u7fd2\u7a0b\u5f0f\u8a2d\u8a08\u4e4b\u6700\u4f73\u9014\u5f91\u3002\u5f37\u70c8\u5efa\u8b70\u57f7\u884c\u6e90\u7a0b\u5f0f\u78bc\u4e26\u89aa\u81ea\u6572\u7a0b\u5f0f\u78bc\u3002
    • \u672c\u66f8\u7db2\u9801\u7248\u7684\u6bcf\u500b\u7ae0\u7bc0\u90fd\u8a2d\u6709\u8a55\u8ad6\u5340\uff0c\u6b61\u8fce\u96a8\u6642\u5206\u4eab\u4f60\u7684\u7591\u60d1\u8207\u898b\u89e3\u3002
    "},{"location":"chapter_reference/","title":"\u53c3\u8003\u6587\u737b","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] \u56b4\u851a\u654f. \u8cc7\u6599\u7d50\u69cb\uff08C \u8a9e\u8a00\u7248\uff09.

    [5] \u9127\u4fca\u8f1d. \u8cc7\u6599\u7d50\u69cb\uff08C++ \u8a9e\u8a00\u7248\uff0c\u7b2c\u4e09\u7248\uff09.

    [6] \u99ac\u514b \u827e\u502b \u7dad\u65af\u8457\uff0c\u9673\u8d8a\u8b6f. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\u7b97\u6cd5\u5206\u6790\uff1aJava\u8a9e\u8a00\u63cf\u8ff0\uff08\u7b2c\u4e09\u7248\uff09.

    [7] \u7a0b\u5091. \u5927\u8a71\u8cc7\u6599\u7d50\u69cb.

    [8] \u738b\u722d. \u8cc7\u6599\u7d50\u69cb\u8207\u6f14\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\u5c0b","text":"

    Abstract

    \u641c\u5c0b\u662f\u4e00\u5834\u672a\u77e5\u7684\u5192\u96aa\uff0c\u6211\u5011\u6216\u8a31\u9700\u8981\u8d70\u904d\u795e\u79d8\u7a7a\u9593\u7684\u6bcf\u500b\u89d2\u843d\uff0c\u53c8\u6216\u8a31\u53ef\u4ee5\u5feb\u901f\u9396\u5b9a\u76ee\u6a19\u3002

    \u5728\u9019\u5834\u5c0b\u8993\u4e4b\u65c5\u4e2d\uff0c\u6bcf\u4e00\u6b21\u63a2\u7d22\u90fd\u53ef\u80fd\u5f97\u5230\u4e00\u500b\u672a\u66fe\u6599\u60f3\u7684\u7b54\u6848\u3002

    "},{"location":"chapter_searching/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b
    • 10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede
    • 10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c
    • 10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565
    • 10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5
    • 10.6 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_searching/binary_search/","title":"10.1 \u00a0 \u4e8c\u5206\u641c\u5c0b","text":"

    \u4e8c\u5206\u641c\u5c0b\uff08binary search\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u9ad8\u6548\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002\u5b83\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\u641c\u5c0b\u7bc4\u570d\uff0c\u76f4\u81f3\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u70ba\u6b62\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5143\u7d20\u6309\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u6392\u5217\u4e14\u4e0d\u91cd\u8907\u3002\u8acb\u67e5\u8a62\u4e26\u8fd4\u56de\u5143\u7d20 target \u5728\u8a72\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002\u793a\u4f8b\u5982\u5716 10-1 \u6240\u793a\u3002

    \u5716 10-1 \u00a0 \u4e8c\u5206\u641c\u5c0b\u793a\u4f8b\u8cc7\u6599

    \u5982\u5716 10-2 \u6240\u793a\uff0c\u6211\u5011\u5148\u521d\u59cb\u5316\u6307\u6a19 \\(i = 0\\) \u548c \\(j = n - 1\\) \uff0c\u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u548c\u5c3e\u5143\u7d20\uff0c\u4ee3\u8868\u641c\u5c0b\u5340\u9593 \\([0, n - 1]\\) \u3002\u8acb\u6ce8\u610f\uff0c\u4e2d\u62ec\u865f\u8868\u793a\u9589\u5340\u9593\uff0c\u5176\u5305\u542b\u908a\u754c\u503c\u672c\u8eab\u3002

    \u63a5\u4e0b\u4f86\uff0c\u8ff4\u5708\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m = \\lfloor {(i + j) / 2} \\rfloor\\) \uff0c\u5176\u4e2d \\(\\lfloor \\: \\rfloor\\) \u8868\u793a\u5411\u4e0b\u53d6\u6574\u64cd\u4f5c\u3002
    2. \u5224\u65b7 nums[m] \u548c target \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u4e09\u7a2e\u60c5\u6cc1\u3002
      1. \u7576 nums[m] < target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([m + 1, j]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(i = m + 1\\) \u3002
      2. \u7576 nums[m] > target \u6642\uff0c\u8aaa\u660e target \u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u57f7\u884c \\(j = m - 1\\) \u3002
      3. \u7576 nums[m] = target \u6642\uff0c\u8aaa\u660e\u627e\u5230 target \uff0c\u56e0\u6b64\u8fd4\u56de\u7d22\u5f15 \\(m\\) \u3002

    \u82e5\u9663\u5217\u4e0d\u5305\u542b\u76ee\u6a19\u5143\u7d20\uff0c\u641c\u5c0b\u5340\u9593\u6700\u7d42\u6703\u7e2e\u5c0f\u70ba\u7a7a\u3002\u6b64\u6642\u8fd4\u56de \\(-1\\) \u3002

    <1><2><3><4><5><6><7>

    \u5716 10-2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u6d41\u7a0b

    \u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc \\(i\\) \u548c \\(j\\) \u90fd\u662f int \u578b\u5225\uff0c\u56e0\u6b64 \\(i + j\\) \u53ef\u80fd\u6703\u8d85\u51fa int \u578b\u5225\u7684\u53d6\u503c\u7bc4\u570d\u3002\u70ba\u4e86\u907f\u514d\u5927\u6578\u8d8a\u754c\uff0c\u6211\u5011\u901a\u5e38\u63a1\u7528\u516c\u5f0f \\(m = \\lfloor {i + (j - i) / 2} \\rfloor\\) \u4f86\u8a08\u7b97\u4e2d\u9ede\u3002

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j = 0, len(nums) - 1\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j:\n        # \u7406\u8ad6\u4e0a Python \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.size() - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint BinarySearch(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = nums.Length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    i, j := 0, len(nums)-1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    for i <= j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunc binarySearch(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = nums.startIndex\n    var j = nums.endIndex - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums, target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\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\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else return m; // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfunction binarySearch(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let i = 0,\n        j = nums.length - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  int i = 0, j = nums.length - 1;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n      j = m - 1;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfn binary_search(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    let mut i = 0;\n    let mut j = nums.len() as i32 - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nint binarySearch(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    int i = 0, j = len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 */\nfun binarySearch(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i = 0\n    var j = nums.size - 1\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09 ###\ndef binary_search(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n  i, j = 0, nums.length - 1\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n  while i <= j\n    # \u7406\u8ad6\u4e0a Ruby \u7684\u6578\u5b57\u53ef\u4ee5\u7121\u9650\u5927\uff08\u53d6\u6c7a\u65bc\u8a18\u61b6\u9ad4\u5927\u5c0f\uff09\uff0c\u7121\u9808\u8003\u616e\u5927\u6578\u8d8a\u754c\u554f\u984c\n    m = (i + j) / 2   # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u641c\u5c0b\uff08\u96d9\u9589\u5340\u9593\uff09\nfn binarySearch(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1] \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20\n    var i: usize = 0;\n    var j: usize = nums.items.len - 1;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i > j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff1a\u5728\u4e8c\u5206\u8ff4\u5708\u4e2d\uff0c\u5340\u9593\u6bcf\u8f2a\u7e2e\u5c0f\u4e00\u534a\uff0c\u56e0\u6b64\u8ff4\u5708\u6b21\u6578\u70ba \\(\\log_2 n\\) \u3002

    \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7a7a\u9593\u3002

    "},{"location":"chapter_searching/binary_search/#1011","title":"10.1.1 \u00a0 \u5340\u9593\u8868\u793a\u65b9\u6cd5","text":"

    \u9664\u4e86\u4e0a\u8ff0\u96d9\u9589\u5340\u9593\u5916\uff0c\u5e38\u898b\u7684\u5340\u9593\u8868\u793a\u9084\u6709\u201c\u5de6\u9589\u53f3\u958b\u201d\u5340\u9593\uff0c\u5b9a\u7fa9\u70ba \\([0, n)\\) \uff0c\u5373\u5de6\u908a\u754c\u5305\u542b\u81ea\u8eab\uff0c\u53f3\u908a\u754c\u4e0d\u5305\u542b\u81ea\u8eab\u3002\u5728\u8a72\u8868\u793a\u4e0b\uff0c\u5340\u9593 \\([i, j)\\) \u5728 \\(i = j\\) \u6642\u70ba\u7a7a\u3002

    \u6211\u5011\u53ef\u4ee5\u57fa\u65bc\u8a72\u8868\u793a\u5be6\u73fe\u5177\u6709\u76f8\u540c\u529f\u80fd\u7684\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search.py
    def binary_search_lcro(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\"\"\"\n    # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j = 0, len(nums)\n    # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n        elif nums[m] > target:\n            j = m  # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n        else:\n            return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    return -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n
    binary_search.cpp
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(vector<int> &nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.size();\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.java
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.cs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint BinarySearchLCRO(int[] nums, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = nums.Length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2;   // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else                       // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.go
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    i, j := 0, len(nums)\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    for i < j {\n        m := i + (j-i)/2      // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.swift
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunc binarySearchLCRO(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = nums.startIndex\n    var j = nums.endIndex\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        } else if nums[m] > target { // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        } else { // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.js
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums, target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\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\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target)\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n        else return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.ts
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfunction binarySearchLCRO(nums: number[], target: number): number {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let i = 0,\n        j = nums.length;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        const m = Math.floor(i + (j - i) / 2);\n        if (nums[m] < target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums[m] > target) {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    return -1; // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n}\n
    binary_search.dart
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(List<int> nums, int target) {\n  // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  int i = 0, j = nums.length;\n  // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while (i < j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n      i = m + 1;\n    } else if (nums[m] > target) {\n      // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n      j = m;\n    } else {\n      // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n      return m;\n    }\n  }\n  // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n  return -1;\n}\n
    binary_search.rs
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfn binary_search_lcro(nums: &[i32], target: i32) -> i32 {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    let mut i = 0;\n    let mut j = nums.len() as i32;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while i < j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if nums[m as usize] > target {\n            // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.c
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nint binarySearchLCRO(int *nums, int len, int target) {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    int i = 0, j = len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target)    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        else // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m;\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    binary_search.kt
    /* \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 */\nfun binarySearchLCRO(nums: IntArray, target: Int): Int {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i = 0\n    var j = nums.size\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i < j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1\n        else if (nums[m] > target) // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m\n        else  // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return m\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1\n}\n
    binary_search.rb
    ### \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09 ###\ndef binary_search_lcro(nums, target)\n  # \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n  i, j = 0, nums.length\n\n  # \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n  while i < j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n    else\n      return m  # \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n    end\n  end\n\n  -1  # \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\nend\n
    binary_search.zig
    // \u4e8c\u5206\u641c\u5c0b\uff08\u5de6\u9589\u53f3\u958b\u5340\u9593\uff09\nfn binarySearchLCRO(comptime T: type, nums: std.ArrayList(T), target: T) T {\n    // \u521d\u59cb\u5316\u5de6\u9589\u53f3\u958b\u5340\u9593 [0, n) \uff0c\u5373 i, j \u5206\u5225\u6307\u5411\u9663\u5217\u9996\u5143\u7d20\u3001\u5c3e\u5143\u7d20+1\n    var i: usize = 0;\n    var j: usize = nums.items.len;\n    // \u8ff4\u5708\uff0c\u7576\u641c\u5c0b\u5340\u9593\u70ba\u7a7a\u6642\u8df3\u51fa\uff08\u7576 i = j \u6642\u70ba\u7a7a\uff09\n    while (i <= j) {\n        var m = i + (j - i) / 2;                // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums.items[m] < target) {           // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [m+1, j) \u4e2d\n            i = m + 1;\n        } else if (nums.items[m] > target) {    // \u6b64\u60c5\u6cc1\u8aaa\u660e target \u5728\u5340\u9593 [i, m) \u4e2d\n            j = m;\n        } else {                                // \u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de\u5176\u7d22\u5f15\n            return @intCast(m);\n        }\n    }\n    // \u672a\u627e\u5230\u76ee\u6a19\u5143\u7d20\uff0c\u8fd4\u56de -1\n    return -1;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u5982\u5716 10-3 \u6240\u793a\uff0c\u5728\u5169\u7a2e\u5340\u9593\u8868\u793a\u4e0b\uff0c\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u521d\u59cb\u5316\u3001\u8ff4\u5708\u689d\u4ef6\u548c\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\u7686\u6709\u6240\u4e0d\u540c\u3002

    \u7531\u65bc\u201c\u96d9\u9589\u5340\u9593\u201d\u8868\u793a\u4e2d\u7684\u5de6\u53f3\u908a\u754c\u90fd\u88ab\u5b9a\u7fa9\u70ba\u9589\u5340\u9593\uff0c\u56e0\u6b64\u900f\u904e\u6307\u6a19 \\(i\\) \u548c\u6307\u6a19 \\(j\\) \u7e2e\u5c0f\u5340\u9593\u7684\u64cd\u4f5c\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u9019\u6a23\u66f4\u4e0d\u5bb9\u6613\u51fa\u932f\uff0c\u56e0\u6b64\u4e00\u822c\u5efa\u8b70\u63a1\u7528\u201c\u96d9\u9589\u5340\u9593\u201d\u7684\u5beb\u6cd5\u3002

    \u5716 10-3 \u00a0 \u5169\u7a2e\u5340\u9593\u5b9a\u7fa9

    "},{"location":"chapter_searching/binary_search/#1012","title":"10.1.2 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u4e8c\u5206\u641c\u5c0b\u5728\u6642\u9593\u548c\u7a7a\u9593\u65b9\u9762\u90fd\u6709\u8f03\u597d\u7684\u6548\u80fd\u3002

    • \u4e8c\u5206\u641c\u5c0b\u7684\u6642\u9593\u6548\u7387\u9ad8\u3002\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\uff0c\u5c0d\u6578\u968e\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5177\u6709\u986f\u8457\u512a\u52e2\u3002\u4f8b\u5982\uff0c\u7576\u8cc7\u6599\u5927\u5c0f \\(n = 2^{20}\\) \u6642\uff0c\u7dda\u6027\u67e5\u8a62\u9700\u8981 \\(2^{20} = 1048576\\) \u8f2a\u8ff4\u5708\uff0c\u800c\u4e8c\u5206\u641c\u5c0b\u50c5\u9700 \\(\\log_2 2^{20} = 20\\) \u8f2a\u8ff4\u5708\u3002
    • \u4e8c\u5206\u641c\u5c0b\u7121\u9808\u984d\u5916\u7a7a\u9593\u3002\u76f8\u8f03\u65bc\u9700\u8981\u85c9\u52a9\u984d\u5916\u7a7a\u9593\u7684\u641c\u5c0b\u6f14\u7b97\u6cd5\uff08\u4f8b\u5982\u96dc\u6e4a\u67e5\u8a62\uff09\uff0c\u4e8c\u5206\u641c\u5c0b\u66f4\u52a0\u7bc0\u7701\u7a7a\u9593\u3002

    \u7136\u800c\uff0c\u4e8c\u5206\u641c\u5c0b\u4e26\u975e\u9069\u7528\u65bc\u6240\u6709\u60c5\u6cc1\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u6709\u5e8f\u8cc7\u6599\u3002\u82e5\u8f38\u5165\u8cc7\u6599\u7121\u5e8f\uff0c\u70ba\u4e86\u4f7f\u7528\u4e8c\u5206\u641c\u5c0b\u800c\u5c08\u9580\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u4e0d\u511f\u5931\u3002\u56e0\u70ba\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u901a\u5e38\u70ba \\(O(n \\log n)\\) \uff0c\u6bd4\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u90fd\u66f4\u9ad8\u3002\u5c0d\u65bc\u983b\u7e41\u63d2\u5165\u5143\u7d20\u7684\u5834\u666f\uff0c\u70ba\u4fdd\u6301\u9663\u5217\u6709\u5e8f\u6027\uff0c\u9700\u8981\u5c07\u5143\u7d20\u63d2\u5165\u5230\u7279\u5b9a\u4f4d\u7f6e\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u4e5f\u662f\u975e\u5e38\u6602\u8cb4\u7684\u3002
    • \u4e8c\u5206\u641c\u5c0b\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u8df3\u8e8d\u5f0f\uff08\u975e\u9023\u7e8c\u5730\uff09\u8a2a\u554f\u5143\u7d20\uff0c\u800c\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\u57f7\u884c\u8df3\u8e8d\u5f0f\u8a2a\u554f\u7684\u6548\u7387\u8f03\u4f4e\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u61c9\u7528\u5728\u93c8\u7d50\u4e32\u5217\u6216\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u5c0f\u8cc7\u6599\u91cf\u4e0b\uff0c\u7dda\u6027\u67e5\u8a62\u6548\u80fd\u66f4\u4f73\u3002\u7dda\u4e0a\u6027\u67e5\u8a62\u4e2d\uff0c\u6bcf\u8f2a\u53ea\u9700 1 \u6b21\u5224\u65b7\u64cd\u4f5c\uff1b\u800c\u5728\u4e8c\u5206\u641c\u5c0b\u4e2d\uff0c\u9700\u8981 1 \u6b21\u52a0\u6cd5\u30011 \u6b21\u9664\u6cd5\u30011 ~ 3 \u6b21\u5224\u65b7\u64cd\u4f5c\u30011 \u6b21\u52a0\u6cd5\uff08\u6e1b\u6cd5\uff09\uff0c\u5171 4 ~ 6 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u56e0\u6b64\uff0c\u7576\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5c0f\u6642\uff0c\u7dda\u6027\u67e5\u8a62\u53cd\u800c\u6bd4\u4e8c\u5206\u641c\u5c0b\u66f4\u5feb\u3002
    "},{"location":"chapter_searching/binary_search_edge/","title":"10.3 \u00a0 \u4e8c\u5206\u641c\u5c0b\u908a\u754c","text":""},{"location":"chapter_searching/binary_search_edge/#1031","title":"10.3.1 \u00a0 \u67e5\u8a62\u5de6\u908a\u754c","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \uff0c\u5176\u4e2d\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\u3002\u8acb\u8fd4\u56de\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b\u5143\u7d20 target \u7684\u7d22\u5f15\u3002\u82e5\u9663\u5217\u4e2d\u4e0d\u5305\u542b\u8a72\u5143\u7d20\uff0c\u5247\u8fd4\u56de \\(-1\\) \u3002

    \u56de\u61b6\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u7684\u65b9\u6cd5\uff0c\u641c\u5c0b\u5b8c\u6210\u5f8c \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target \uff0c\u56e0\u6b64\u67e5\u8a62\u63d2\u5165\u9ede\u672c\u8cea\u4e0a\u662f\u5728\u67e5\u8a62\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002

    \u8003\u616e\u900f\u904e\u67e5\u8a62\u63d2\u5165\u9ede\u7684\u51fd\u5f0f\u5be6\u73fe\u67e5\u8a62\u5de6\u908a\u754c\u3002\u8acb\u6ce8\u610f\uff0c\u9663\u5217\u4e2d\u53ef\u80fd\u4e0d\u5305\u542b target \uff0c\u9019\u7a2e\u60c5\u6cc1\u53ef\u80fd\u5c0e\u81f4\u4ee5\u4e0b\u5169\u7a2e\u7d50\u679c\u3002

    • \u63d2\u5165\u9ede\u7684\u7d22\u5f15 \\(i\\) \u8d8a\u754c\u3002
    • \u5143\u7d20 nums[i] \u8207 target \u4e0d\u76f8\u7b49\u3002

    \u7576\u9047\u5230\u4ee5\u4e0a\u5169\u7a2e\u60c5\u6cc1\u6642\uff0c\u76f4\u63a5\u8fd4\u56de \\(-1\\) \u5373\u53ef\u3002\u7a0b\u5f0f\u78bc\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target\"\"\"\n    # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(vector<int> &nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint BinarySearchLeftEdge(int[] nums, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums []int, target int) int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunc binarySearchLeftEdge(nums: [Int], target: Int) -> Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums, target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfunction binarySearchLeftEdge(nums: Array<number>, target: number): number {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(List<int> nums, int target) {\n  // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfn binary_search_left_edge(nums: &[i32], target: i32) -> i32 {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nint binarySearchLeftEdge(int *nums, int numSize, int target) {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target */\nfun binarySearchLeftEdge(nums: IntArray, target: Int): Int {\n    // \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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\u641c\u5c0b\u6700\u5de6\u4e00\u500b target ###\ndef binary_search_left_edge(nums, target)\n  # \u7b49\u50f9\u65bc\u67e5\u8a62 target \u7684\u63d2\u5165\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#1032","title":"10.3.2 \u00a0 \u67e5\u8a62\u53f3\u908a\u754c","text":"

    \u90a3\u9ebc\u5982\u4f55\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u5462\uff1f\u6700\u76f4\u63a5\u7684\u65b9\u5f0f\u662f\u4fee\u6539\u7a0b\u5f0f\u78bc\uff0c\u66ff\u63db\u5728 nums[m] == target \u60c5\u6cc1\u4e0b\u7684\u6307\u6a19\u6536\u7e2e\u64cd\u4f5c\u3002\u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u3002

    \u4e0b\u9762\u6211\u5011\u4ecb\u7d39\u5169\u7a2e\u66f4\u52a0\u53d6\u5de7\u7684\u65b9\u6cd5\u3002

    "},{"location":"chapter_searching/binary_search_edge/#1","title":"1. \u00a0 \u8907\u7528\u67e5\u8a62\u5de6\u908a\u754c","text":"

    \u5be6\u969b\u4e0a\uff0c\u6211\u5011\u53ef\u4ee5\u5229\u7528\u67e5\u8a62\u6700\u5de6\u5143\u7d20\u7684\u51fd\u5f0f\u4f86\u67e5\u8a62\u6700\u53f3\u5143\u7d20\uff0c\u5177\u9ad4\u65b9\u6cd5\u70ba\uff1a\u5c07\u67e5\u8a62\u6700\u53f3\u4e00\u500b target \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\u3002

    \u5982\u5716 10-7 \u6240\u793a\uff0c\u67e5\u8a62\u5b8c\u6210\u5f8c\uff0c\u6307\u6a19 \\(i\\) \u6307\u5411\u6700\u5de6\u4e00\u500b target + 1\uff08\u5982\u679c\u5b58\u5728\uff09\uff0c\u800c \\(j\\) \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0c\u56e0\u6b64\u8fd4\u56de \\(j\\) \u5373\u53ef\u3002

    \u5716 10-7 \u00a0 \u5c07\u67e5\u8a62\u53f3\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5de6\u908a\u754c

    \u8acb\u6ce8\u610f\uff0c\u8fd4\u56de\u7684\u63d2\u5165\u9ede\u662f \\(i\\) \uff0c\u56e0\u6b64\u9700\u8981\u5c07\u5176\u6e1b \\(1\\) \uff0c\u5f9e\u800c\u7372\u5f97 \\(j\\) \uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_edge.py
    def binary_search_right_edge(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u6700\u53f3\u4e00\u500b target\"\"\"\n    # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i = binary_search_insertion(nums, target + 1)\n    # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(vector<int> &nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint BinarySearchRightEdge(int[] nums, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binary_search_insertion.BinarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums []int, target int) int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    i := binarySearchInsertion(nums, target+1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunc binarySearchRightEdge(nums: [Int], target: Int) -> Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binarySearchInsertion(nums: nums, target: target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums, target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfunction binarySearchRightEdge(nums: Array<number>, target: number): number {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    const i = binarySearchInsertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(List<int> nums, int target) {\n  // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  int i = binarySearchInsertion(nums, target + 1);\n  // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfn binary_search_right_edge(nums: &[i32], target: i32) -> i32 {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    let i = binary_search_insertion(nums, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nint binarySearchRightEdge(int *nums, int numSize, int target) {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    int i = binarySearchInsertion(nums, numSize, target + 1);\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target */\nfun binarySearchRightEdge(nums: IntArray, target: Int): Int {\n    // \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n    val i = binarySearchInsertion(nums, target + 1)\n    // j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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\u641c\u5c0b\u6700\u53f3\u4e00\u500b target ###\ndef binary_search_right_edge(nums, target)\n  # \u8f49\u5316\u70ba\u67e5\u8a62\u6700\u5de6\u4e00\u500b target + 1\n  i = binary_search_insertion(nums, target + 1)\n\n  # j \u6307\u5411\u6700\u53f3\u4e00\u500b target \uff0ci \u6307\u5411\u9996\u500b\u5927\u65bc 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_edge/#2","title":"2. \u00a0 \u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20","text":"

    \u6211\u5011\u77e5\u9053\uff0c\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u6700\u7d42 \\(i\\) \u548c \\(j\\) \u6703\u5206\u5225\u6307\u5411\u9996\u500b\u5927\u65bc\u3001\u5c0f\u65bc target \u7684\u5143\u7d20\u3002

    \u56e0\u6b64\uff0c\u5982\u5716 10-8 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u69cb\u9020\u4e00\u500b\u9663\u5217\u4e2d\u4e0d\u5b58\u5728\u7684\u5143\u7d20\uff0c\u7528\u65bc\u67e5\u8a62\u5de6\u53f3\u908a\u754c\u3002

    • \u67e5\u8a62\u6700\u5de6\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target - 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(i\\) \u3002
    • \u67e5\u8a62\u6700\u53f3\u4e00\u500b target \uff1a\u53ef\u4ee5\u8f49\u5316\u70ba\u67e5\u8a62 target + 0.5 \uff0c\u4e26\u8fd4\u56de\u6307\u6a19 \\(j\\) \u3002

    \u5716 10-8 \u00a0 \u5c07\u67e5\u8a62\u908a\u754c\u8f49\u5316\u70ba\u67e5\u8a62\u5143\u7d20

    \u7a0b\u5f0f\u78bc\u5728\u6b64\u7701\u7565\uff0c\u4ee5\u4e0b\u5169\u9ede\u503c\u5f97\u6ce8\u610f\u3002

    • \u7d66\u5b9a\u9663\u5217\u4e0d\u5305\u542b\u5c0f\u6578\uff0c\u9019\u610f\u5473\u8457\u6211\u5011\u7121\u9808\u95dc\u5fc3\u5982\u4f55\u8655\u7406\u76f8\u7b49\u7684\u60c5\u6cc1\u3002
    • \u56e0\u70ba\u8a72\u65b9\u6cd5\u5f15\u5165\u4e86\u5c0f\u6578\uff0c\u6240\u4ee5\u9700\u8981\u5c07\u51fd\u5f0f\u4e2d\u7684\u8b8a\u6578 target \u6539\u70ba\u6d6e\u9ede\u6578\u578b\u5225\uff08Python \u7121\u9808\u6539\u52d5\uff09\u3002
    "},{"location":"chapter_searching/binary_search_insertion/","title":"10.2 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede","text":"

    \u4e8c\u5206\u641c\u5c0b\u4e0d\u50c5\u53ef\u7528\u65bc\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\uff0c\u9084\u53ef\u7528\u65bc\u89e3\u6c7a\u8a31\u591a\u8b8a\u7a2e\u554f\u984c\uff0c\u6bd4\u5982\u641c\u5c0b\u76ee\u6a19\u5143\u7d20\u7684\u63d2\u5165\u4f4d\u7f6e\u3002

    "},{"location":"chapter_searching/binary_search_insertion/#1021","title":"10.2.1 \u00a0 \u7121\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u6709\u5e8f\u9663\u5217 nums \u548c\u4e00\u500b\u5143\u7d20 target \uff0c\u9663\u5217\u4e0d\u5b58\u5728\u91cd\u8907\u5143\u7d20\u3002\u73fe\u5c07 target \u63d2\u5165\u9663\u5217 nums \u4e2d\uff0c\u4e26\u4fdd\u6301\u5176\u6709\u5e8f\u6027\u3002\u82e5\u9663\u5217\u4e2d\u5df2\u5b58\u5728\u5143\u7d20 target \uff0c\u5247\u63d2\u5165\u5230\u5176\u5de6\u65b9\u3002\u8acb\u8fd4\u56de\u63d2\u5165\u5f8c target \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15\u3002\u793a\u4f8b\u5982\u5716 10-4 \u6240\u793a\u3002

    \u5716 10-4 \u00a0 \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\u793a\u4f8b\u8cc7\u6599

    \u5982\u679c\u60f3\u8907\u7528\u4e0a\u4e00\u7bc0\u7684\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\uff0c\u5247\u9700\u8981\u56de\u7b54\u4ee5\u4e0b\u5169\u500b\u554f\u984c\u3002

    \u554f\u984c\u4e00\uff1a\u7576\u9663\u5217\u4e2d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u662f\u5426\u662f\u8a72\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u984c\u76ee\u8981\u6c42\u5c07 target \u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u5de6\u908a\uff0c\u9019\u610f\u5473\u8457\u65b0\u63d2\u5165\u7684 target \u66ff\u63db\u4e86\u539f\u4f86 target \u7684\u4f4d\u7f6e\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u7576\u9663\u5217\u5305\u542b target \u6642\uff0c\u63d2\u5165\u9ede\u7684\u7d22\u5f15\u5c31\u662f\u8a72 target \u7684\u7d22\u5f15\u3002

    \u554f\u984c\u4e8c\uff1a\u7576\u9663\u5217\u4e2d\u4e0d\u5b58\u5728 target \u6642\uff0c\u63d2\u5165\u9ede\u662f\u54ea\u500b\u5143\u7d20\u7684\u7d22\u5f15\uff1f

    \u9032\u4e00\u6b65\u601d\u8003\u4e8c\u5206\u641c\u5c0b\u904e\u7a0b\uff1a\u7576 nums[m] < target \u6642 \\(i\\) \u79fb\u52d5\uff0c\u9019\u610f\u5473\u8457\u6307\u6a19 \\(i\\) \u5728\u5411\u5927\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002\u540c\u7406\uff0c\u6307\u6a19 \\(j\\) \u59cb\u7d42\u5728\u5411\u5c0f\u65bc\u7b49\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u56e0\u6b64\u4e8c\u5206\u7d50\u675f\u6642\u4e00\u5b9a\u6709\uff1a\\(i\\) \u6307\u5411\u9996\u500b\u5927\u65bc target \u7684\u5143\u7d20\uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u3002\u6613\u5f97\u7576\u9663\u5217\u4e0d\u5305\u542b target \u6642\uff0c\u63d2\u5165\u7d22\u5f15\u70ba \\(i\\) \u3002\u7a0b\u5f0f\u78bc\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\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertionSimple(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n            return m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertionSimple(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [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 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertionSimple(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    }\n  }\n  // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m;\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertionSimple(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m; // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertionSimple(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            return m // \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n        }\n    }\n    // \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u7121\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion_simple(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      return m  # \u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede m\n    end\n  end\n\n  i # \u672a\u627e\u5230 target \uff0c\u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertionSimple}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_searching/binary_search_insertion/#1022","title":"10.2.2 \u00a0 \u5b58\u5728\u91cd\u8907\u5143\u7d20\u7684\u60c5\u6cc1","text":"

    Question

    \u5728\u4e0a\u4e00\u984c\u7684\u57fa\u790e\u4e0a\uff0c\u898f\u5b9a\u9663\u5217\u53ef\u80fd\u5305\u542b\u91cd\u8907\u5143\u7d20\uff0c\u5176\u9918\u4e0d\u8b8a\u3002

    \u5047\u8a2d\u9663\u5217\u4e2d\u5b58\u5728\u591a\u500b target \uff0c\u5247\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u53ea\u80fd\u8fd4\u56de\u5176\u4e2d\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u800c\u7121\u6cd5\u78ba\u5b9a\u8a72\u5143\u7d20\u7684\u5de6\u908a\u548c\u53f3\u908a\u9084\u6709\u591a\u5c11 target\u3002

    \u984c\u76ee\u8981\u6c42\u5c07\u76ee\u6a19\u5143\u7d20\u63d2\u5165\u5230\u6700\u5de6\u908a\uff0c\u6240\u4ee5\u6211\u5011\u9700\u8981\u67e5\u8a62\u9663\u5217\u4e2d\u6700\u5de6\u4e00\u500b target \u7684\u7d22\u5f15\u3002\u521d\u6b65\u8003\u616e\u900f\u904e\u5716 10-5 \u6240\u793a\u7684\u6b65\u9a5f\u5be6\u73fe\u3002

    1. \u57f7\u884c\u4e8c\u5206\u641c\u5c0b\uff0c\u5f97\u5230\u4efb\u610f\u4e00\u500b target \u7684\u7d22\u5f15\uff0c\u8a18\u70ba \\(k\\) \u3002
    2. \u5f9e\u7d22\u5f15 \\(k\\) \u958b\u59cb\uff0c\u5411\u5de6\u9032\u884c\u7dda\u6027\u8d70\u8a2a\uff0c\u7576\u627e\u5230\u6700\u5de6\u908a\u7684 target \u6642\u8fd4\u56de\u3002

    \u5716 10-5 \u00a0 \u7dda\u6027\u67e5\u8a62\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede

    \u6b64\u65b9\u6cd5\u96d6\u7136\u53ef\u7528\uff0c\u4f46\u5176\u5305\u542b\u7dda\u6027\u67e5\u8a62\uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u7576\u9663\u5217\u4e2d\u5b58\u5728\u5f88\u591a\u91cd\u8907\u7684 target \u6642\uff0c\u8a72\u65b9\u6cd5\u6548\u7387\u5f88\u4f4e\u3002

    \u73fe\u8003\u616e\u62d3\u5c55\u4e8c\u5206\u641c\u5c0b\u7a0b\u5f0f\u78bc\u3002\u5982\u5716 10-6 \u6240\u793a\uff0c\u6574\u9ad4\u6d41\u7a0b\u4fdd\u6301\u4e0d\u8b8a\uff0c\u6bcf\u8f2a\u5148\u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 \\(m\\) \uff0c\u518d\u5224\u65b7 target \u548c nums[m] \u7684\u5927\u5c0f\u95dc\u4fc2\uff0c\u5206\u70ba\u4ee5\u4e0b\u5e7e\u7a2e\u60c5\u6cc1\u3002

    • \u7576 nums[m] < target \u6216 nums[m] > target \u6642\uff0c\u8aaa\u660e\u9084\u6c92\u6709\u627e\u5230 target \uff0c\u56e0\u6b64\u63a1\u7528\u666e\u901a\u4e8c\u5206\u641c\u5c0b\u7684\u7e2e\u5c0f\u5340\u9593\u64cd\u4f5c\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5411 target \u9760\u8fd1\u3002
    • \u7576 nums[m] == target \u6642\uff0c\u8aaa\u660e\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 \\([i, m - 1]\\) \u4e2d\uff0c\u56e0\u6b64\u63a1\u7528 \\(j = m - 1\\) \u4f86\u7e2e\u5c0f\u5340\u9593\uff0c\u5f9e\u800c\u4f7f\u6307\u6a19 \\(j\\) \u5411\u5c0f\u65bc target \u7684\u5143\u7d20\u9760\u8fd1\u3002

    \u8ff4\u5708\u5b8c\u6210\u5f8c\uff0c\\(i\\) \u6307\u5411\u6700\u5de6\u908a\u7684 target \uff0c\\(j\\) \u6307\u5411\u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\uff0c\u56e0\u6b64\u7d22\u5f15 \\(i\\) \u5c31\u662f\u63d2\u5165\u9ede\u3002

    <1><2><3><4><5><6><7><8>

    \u5716 10-6 \u00a0 \u4e8c\u5206\u641c\u5c0b\u91cd\u8907\u5143\u7d20\u7684\u63d2\u5165\u9ede\u7684\u6b65\u9a5f

    \u89c0\u5bdf\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\uff0c\u5224\u65b7\u5206\u652f nums[m] > target \u548c nums[m] == target \u7684\u64cd\u4f5c\u76f8\u540c\uff0c\u56e0\u6b64\u5169\u8005\u53ef\u4ee5\u5408\u4f75\u3002

    \u5373\u4fbf\u5982\u6b64\uff0c\u6211\u5011\u4ecd\u7136\u53ef\u4ee5\u5c07\u5224\u65b7\u689d\u4ef6\u4fdd\u6301\u5c55\u958b\uff0c\u56e0\u70ba\u5176\u908f\u8f2f\u66f4\u52a0\u6e05\u6670\u3001\u53ef\u8b80\u6027\u66f4\u597d\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_insertion.py
    def binary_search_insertion(nums: list[int], target: int) -> int:\n    \"\"\"\u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09\"\"\"\n    i, j = 0, len(nums) - 1  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j:\n        m = (i + j) // 2  # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target:\n            i = m + 1  # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        elif nums[m] > target:\n            j = m - 1  # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        else:\n            j = m - 1  # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    # \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n
    binary_search_insertion.cpp
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(vector<int> &nums, int target) {\n    int i = 0, j = nums.size() - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.java
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.cs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint BinarySearchInsertion(int[] nums, int target) {\n    int i = 0, j = nums.Length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.go
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums []int, target int) int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    i, j := 0, len(nums)-1\n    for i <= j {\n        // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        m := i + (j-i)/2\n        if nums[m] < target {\n            // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n            i = m + 1\n        } else if nums[m] > target {\n            // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        } else {\n            // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n            j = m - 1\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.swift
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunc binarySearchInsertion(nums: [Int], target: Int) -> Int {\n    // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [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 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m] < target {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m] > target {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.js
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums, target) {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.ts
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfunction binarySearchInsertion(nums: Array<number>, target: number): number {\n    let i = 0,\n        j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        const m = Math.floor(i + (j - i) / 2); // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m, \u4f7f\u7528 Math.floor() \u5411\u4e0b\u53d6\u6574\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.dart
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(List<int> nums, int target) {\n  int i = 0, j = nums.length - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  while (i <= j) {\n    int m = i + (j - i) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    if (nums[m] < target) {\n      i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    } else if (nums[m] > target) {\n      j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    } else {\n      j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    }\n  }\n  // \u8fd4\u56de\u63d2\u5165\u9ede i\n  return i;\n}\n
    binary_search_insertion.rs
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\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\u96d9\u9589\u5340\u9593 [0, n-1]\n    while i <= j {\n        let m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if nums[m as usize] < target {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if nums[m as usize] > target {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    i\n}\n
    binary_search_insertion.c
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nint binarySearchInsertion(int *nums, int numSize, int target) {\n    int i = 0, j = numSize - 1; // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        int m = i + (j - i) / 2; // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1; // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1; // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1; // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i;\n}\n
    binary_search_insertion.kt
    /* \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 */\nfun binarySearchInsertion(nums: IntArray, target: Int): Int {\n    var i = 0\n    var j = nums.size - 1 // \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n    while (i <= j) {\n        val m = i + (j - i) / 2 // \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n        if (nums[m] < target) {\n            i = m + 1 // target \u5728\u5340\u9593 [m+1, j] \u4e2d\n        } else if (nums[m] > target) {\n            j = m - 1 // target \u5728\u5340\u9593 [i, m-1] \u4e2d\n        } else {\n            j = m - 1 // \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n        }\n    }\n    // \u8fd4\u56de\u63d2\u5165\u9ede i\n    return i\n}\n
    binary_search_insertion.rb
    ### \u4e8c\u5206\u641c\u5c0b\u63d2\u5165\u9ede\uff08\u5b58\u5728\u91cd\u8907\u5143\u7d20\uff09 ###\ndef binary_search_insertion(nums, target)\n  # \u521d\u59cb\u5316\u96d9\u9589\u5340\u9593 [0, n-1]\n  i, j = 0, nums.length - 1\n\n  while i <= j\n    # \u8a08\u7b97\u4e2d\u9ede\u7d22\u5f15 m\n    m = (i + j) / 2\n\n    if nums[m] < target\n      i = m + 1 # target \u5728\u5340\u9593 [m+1, j] \u4e2d\n    elsif nums[m] > target\n      j = m - 1 # target \u5728\u5340\u9593 [i, m-1] \u4e2d\n    else\n      j = m - 1 # \u9996\u500b\u5c0f\u65bc target \u7684\u5143\u7d20\u5728\u5340\u9593 [i, m-1] \u4e2d\n    end\n  end\n\n  i # \u8fd4\u56de\u63d2\u5165\u9ede i\nend\n
    binary_search_insertion.zig
    [class]{}-[func]{binarySearchInsertion}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \u672c\u7bc0\u7684\u7a0b\u5f0f\u78bc\u90fd\u662f\u201c\u96d9\u9589\u5340\u9593\u201d\u5beb\u6cd5\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u5be6\u73fe\u201c\u5de6\u9589\u53f3\u958b\u201d\u5beb\u6cd5\u3002

    \u7e3d\u7684\u4f86\u770b\uff0c\u4e8c\u5206\u641c\u5c0b\u7121\u975e\u5c31\u662f\u7d66\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u5206\u5225\u8a2d\u5b9a\u641c\u5c0b\u76ee\u6a19\uff0c\u76ee\u6a19\u53ef\u80fd\u662f\u4e00\u500b\u5177\u9ad4\u7684\u5143\u7d20\uff08\u4f8b\u5982 target \uff09\uff0c\u4e5f\u53ef\u80fd\u662f\u4e00\u500b\u5143\u7d20\u7bc4\u570d\uff08\u4f8b\u5982\u5c0f\u65bc target \u7684\u5143\u7d20\uff09\u3002

    \u5728\u4e0d\u65b7\u7684\u8ff4\u5708\u4e8c\u5206\u4e2d\uff0c\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u90fd\u9010\u6f38\u903c\u8fd1\u9810\u5148\u8a2d\u5b9a\u7684\u76ee\u6a19\u3002\u6700\u7d42\uff0c\u5b83\u5011\u6216\u662f\u6210\u529f\u627e\u5230\u7b54\u6848\uff0c\u6216\u662f\u8d8a\u904e\u908a\u754c\u5f8c\u505c\u6b62\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/","title":"10.4 \u00a0 \u96dc\u6e4a\u6700\u4f73\u5316\u7b56\u7565","text":"

    \u5728\u6f14\u7b97\u6cd5\u984c\u4e2d\uff0c\u6211\u5011\u5e38\u900f\u904e\u5c07\u7dda\u6027\u67e5\u8a62\u66ff\u63db\u70ba\u96dc\u6e4a\u67e5\u8a62\u4f86\u964d\u4f4e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u3002\u6211\u5011\u85c9\u52a9\u4e00\u500b\u6f14\u7b97\u6cd5\u984c\u4f86\u52a0\u6df1\u7406\u89e3\u3002

    Question

    \u7d66\u5b9a\u4e00\u500b\u6574\u6578\u9663\u5217 nums \u548c\u4e00\u500b\u76ee\u6a19\u5143\u7d20 target \uff0c\u8acb\u5728\u9663\u5217\u4e2d\u641c\u7d22\u201c\u548c\u201d\u70ba target \u7684\u5169\u500b\u5143\u7d20\uff0c\u4e26\u8fd4\u56de\u5b83\u5011\u7684\u9663\u5217\u7d22\u5f15\u3002\u8fd4\u56de\u4efb\u610f\u4e00\u500b\u89e3\u5373\u53ef\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1041","title":"10.4.1 \u00a0 \u7dda\u6027\u67e5\u8a62\uff1a\u4ee5\u6642\u9593\u63db\u7a7a\u9593","text":"

    \u8003\u616e\u76f4\u63a5\u8d70\u8a2a\u6240\u6709\u53ef\u80fd\u7684\u7d44\u5408\u3002\u5982\u5716 10-9 \u6240\u793a\uff0c\u6211\u5011\u958b\u555f\u4e00\u500b\u5169\u5c64\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u5224\u65b7\u5169\u500b\u6574\u6578\u7684\u548c\u662f\u5426\u70ba target \uff0c\u82e5\u662f\uff0c\u5247\u8fd4\u56de\u5b83\u5011\u7684\u7d22\u5f15\u3002

    \u5716 10-9 \u00a0 \u7dda\u6027\u67e5\u8a62\u6c42\u89e3\u5169\u6578\u4e4b\u548c

    \u7a0b\u5f0f\u78bc\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\u5217\u8209\"\"\"\n    # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nvector<int> twoSumBruteForce(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nint[] twoSumBruteForce(int[] nums, int target) {\n    int size = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nint[] TwoSumBruteForce(int[] nums, int target) {\n    int size = nums.Length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunc twoSumBruteForce(nums []int, target int) []int {\n    size := len(nums)\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n^2)\n    for i := 0; i < size-1; i++ {\n        for j := i + 1; i < 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\u5217\u8209 */\nfunc twoSumBruteForce(nums: [Int], target: Int) -> [Int] {\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunction twoSumBruteForce(nums, target) {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nfunction twoSumBruteForce(nums: number[], target: number): number[] {\n    const n = nums.length;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\nList<int> twoSumBruteForce(List<int> nums, int target) {\n  int size = nums.length;\n  // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\npub fn two_sum_brute_force(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    let size = nums.len();\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 */\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\u5217\u8209 */\nfun twoSumBruteForce(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209 ###\ndef two_sum_brute_force(nums, target)\n  # \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u5217\u8209\nfn twoSumBruteForce(nums: []i32, target: i32) ?[2]i32 {\n    var size: usize = nums.len;\n    var i: usize = 0;\n    // \u5169\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6b64\u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \uff0c\u5728\u5927\u8cc7\u6599\u91cf\u4e0b\u975e\u5e38\u8017\u6642\u3002

    "},{"location":"chapter_searching/replace_linear_by_hashing/#1042","title":"10.4.2 \u00a0 \u96dc\u6e4a\u67e5\u8a62\uff1a\u4ee5\u7a7a\u9593\u63db\u6642\u9593","text":"

    \u8003\u616e\u85c9\u52a9\u4e00\u500b\u96dc\u6e4a\u8868\uff0c\u9375\u503c\u5c0d\u5206\u5225\u70ba\u9663\u5217\u5143\u7d20\u548c\u5143\u7d20\u7d22\u5f15\u3002\u8ff4\u5708\u8d70\u8a2a\u9663\u5217\uff0c\u6bcf\u8f2a\u57f7\u884c\u5716 10-10 \u6240\u793a\u7684\u6b65\u9a5f\u3002

    1. \u5224\u65b7\u6578\u5b57 target - nums[i] \u662f\u5426\u5728\u96dc\u6e4a\u8868\u4e2d\uff0c\u82e5\u662f\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\u9019\u5169\u500b\u5143\u7d20\u7684\u7d22\u5f15\u3002
    2. \u5c07\u9375\u503c\u5c0d nums[i] \u548c\u7d22\u5f15 i \u65b0\u589e\u9032\u96dc\u6e4a\u8868\u3002
    <1><2><3>

    \u5716 10-10 \u00a0 \u8f14\u52a9\u96dc\u6e4a\u8868\u6c42\u89e3\u5169\u6578\u4e4b\u548c

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff0c\u50c5\u9700\u55ae\u5c64\u8ff4\u5708\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\u8f14\u52a9\u96dc\u6e4a\u8868\"\"\"\n    # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    dic = {}\n    # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nvector<int> twoSumHashTable(vector<int> &nums, int target) {\n    int size = nums.size();\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    unordered_map<int, int> dic;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] twoSumHashTable(int[] nums, int target) {\n    int size = nums.length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Map<Integer, Integer> dic = new HashMap<>();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nint[] TwoSumHashTable(int[] nums, int target) {\n    int size = nums.Length;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    Dictionary<int, int> dic = [];\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums []int, target int) []int {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    hashTable := map[int]int{}\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunc twoSumHashTable(nums: [Int], target: Int) -> [Int] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic: [Int: Int] = [:]\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums, target) {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m = {};\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfunction twoSumHashTable(nums: number[], target: number): number[] {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let m: Map<number, number> = new Map();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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 \u8f14\u52a9\u96dc\u6e4a\u8868 */\nList<int> twoSumHashTable(List<int> nums, int target) {\n  int size = nums.length;\n  // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  Map<int, int> dic = HashMap();\n  // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 */\npub fn two_sum_hash_table(nums: &Vec<i32>, target: i32) -> Option<Vec<i32>> {\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    let mut dic = HashMap::new();\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    /* \u96dc\u6e4a\u8868 */\ntypedef struct {\n    int key;\n    int val;\n    UT_hash_handle hh; // \u57fa\u65bc uthash.h \u5be6\u73fe\n} HashTable;\n\n/* \u96dc\u6e4a\u8868\u67e5\u8a62 */\nHashTable *find(HashTable *h, int key) {\n    HashTable *tmp;\n    HASH_FIND_INT(h, &key, tmp);\n    return tmp;\n}\n\n/* \u96dc\u6e4a\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\u8f14\u52a9\u96dc\u6e4a\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\u8f14\u52a9\u96dc\u6e4a\u8868 */\nfun twoSumHashTable(nums: IntArray, target: Int): IntArray {\n    val size = nums.size\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    val dic = HashMap<Int, Int>()\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868 ###\ndef two_sum_hash_table(nums, target)\n  # \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n  dic = {}\n  # \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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\u8f14\u52a9\u96dc\u6e4a\u8868\nfn twoSumHashTable(nums: []i32, target: i32) !?[2]i32 {\n    var size: usize = nums.len;\n    // \u8f14\u52a9\u96dc\u6e4a\u8868\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba O(n)\n    var dic = std.AutoHashMap(i32, i32).init(std.heap.page_allocator);\n    defer dic.deinit();\n    var i: usize = 0;\n    // \u55ae\u5c64\u8ff4\u5708\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u70ba 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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u6b64\u65b9\u6cd5\u900f\u904e\u96dc\u6e4a\u67e5\u8a62\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n^2)\\) \u964d\u81f3 \\(O(n)\\) \uff0c\u5927\u5e45\u63d0\u5347\u57f7\u884c\u6548\u7387\u3002

    \u7531\u65bc\u9700\u8981\u7dad\u8b77\u4e00\u500b\u984d\u5916\u7684\u96dc\u6e4a\u8868\uff0c\u56e0\u6b64\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \u3002\u5118\u7ba1\u5982\u6b64\uff0c\u8a72\u65b9\u6cd5\u7684\u6574\u9ad4\u6642\u7a7a\u6548\u7387\u66f4\u70ba\u5747\u8861\uff0c\u56e0\u6b64\u5b83\u662f\u672c\u984c\u7684\u6700\u512a\u89e3\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/","title":"10.5 \u00a0 \u91cd\u8b58\u641c\u5c0b\u6f14\u7b97\u6cd5","text":"

    \u641c\u5c0b\u6f14\u7b97\u6cd5\uff08searching algorithm\uff09\u7528\u65bc\u5728\u8cc7\u6599\u7d50\u69cb\uff08\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u6216\u5716\uff09\u4e2d\u641c\u7d22\u4e00\u500b\u6216\u4e00\u7d44\u6eff\u8db3\u7279\u5b9a\u689d\u4ef6\u7684\u5143\u7d20\u3002

    \u641c\u5c0b\u6f14\u7b97\u6cd5\u53ef\u6839\u64da\u5be6\u73fe\u601d\u8def\u5206\u70ba\u4ee5\u4e0b\u5169\u985e\u3002

    • \u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\uff0c\u4f8b\u5982\u9663\u5217\u3001\u93c8\u7d50\u4e32\u5217\u3001\u6a39\u548c\u5716\u7684\u8d70\u8a2a\u7b49\u3002
    • \u5229\u7528\u8cc7\u6599\u7d44\u7e54\u7d50\u69cb\u6216\u8cc7\u6599\u5305\u542b\u7684\u5148\u9a57\u8cc7\u8a0a\uff0c\u5be6\u73fe\u9ad8\u6548\u5143\u7d20\u67e5\u8a62\uff0c\u4f8b\u5982\u4e8c\u5206\u641c\u5c0b\u3001\u96dc\u6e4a\u67e5\u8a62\u548c\u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7b49\u3002

    \u4e0d\u96e3\u767c\u73fe\uff0c\u9019\u4e9b\u77e5\u8b58\u9ede\u90fd\u5df2\u5728\u524d\u9762\u7684\u7ae0\u7bc0\u4e2d\u4ecb\u7d39\u904e\uff0c\u56e0\u6b64\u641c\u5c0b\u6f14\u7b97\u6cd5\u5c0d\u65bc\u6211\u5011\u4f86\u8aaa\u4e26\u4e0d\u964c\u751f\u3002\u5728\u672c\u7bc0\u4e2d\uff0c\u6211\u5011\u5c07\u5f9e\u66f4\u52a0\u7cfb\u7d71\u7684\u8996\u89d2\u5207\u5165\uff0c\u91cd\u65b0\u5be9\u8996\u641c\u5c0b\u6f14\u7b97\u6cd5\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1051","title":"10.5.1 \u00a0 \u66b4\u529b\u641c\u5c0b","text":"

    \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u7684\u6bcf\u500b\u5143\u7d20\u4f86\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    • \u201c\u7dda\u6027\u641c\u5c0b\u201d\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u7b49\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u5b83\u5f9e\u8cc7\u6599\u7d50\u69cb\u7684\u4e00\u7aef\u958b\u59cb\uff0c\u9010\u500b\u8a2a\u554f\u5143\u7d20\uff0c\u76f4\u5230\u627e\u5230\u76ee\u6a19\u5143\u7d20\u6216\u5230\u9054\u53e6\u4e00\u7aef\u4ecd\u6c92\u6709\u627e\u5230\u76ee\u6a19\u5143\u7d20\u70ba\u6b62\u3002
    • \u201c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u548c\u201c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u201d\u662f\u5716\u548c\u6a39\u7684\u5169\u7a2e\u8d70\u8a2a\u7b56\u7565\u3002\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\u9010\u5c64\u641c\u5c0b\uff0c\u7531\u8fd1\u53ca\u9060\u5730\u8a2a\u554f\u5404\u500b\u7bc0\u9ede\u3002\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u5f9e\u521d\u59cb\u7bc0\u9ede\u958b\u59cb\uff0c\u6cbf\u8457\u4e00\u689d\u8def\u5f91\u8d70\u5230\u982d\uff0c\u518d\u56de\u6eaf\u4e26\u5617\u8a66\u5176\u4ed6\u8def\u5f91\uff0c\u76f4\u5230\u8d70\u8a2a\u5b8c\u6574\u500b\u8cc7\u6599\u7d50\u69cb\u3002

    \u66b4\u529b\u641c\u5c0b\u7684\u512a\u9ede\u662f\u7c21\u55ae\u4e14\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u505a\u9810\u8655\u7406\u548c\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\u3002

    \u7136\u800c\uff0c\u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u5176\u4e2d \\(n\\) \u70ba\u5143\u7d20\u6578\u91cf\uff0c\u56e0\u6b64\u5728\u8cc7\u6599\u91cf\u8f03\u5927\u7684\u60c5\u6cc1\u4e0b\u6548\u80fd\u8f03\u5dee\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1052","title":"10.5.2 \u00a0 \u81ea\u9069\u61c9\u641c\u5c0b","text":"

    \u81ea\u9069\u61c9\u641c\u5c0b\u5229\u7528\u8cc7\u6599\u7684\u7279\u6709\u5c6c\u6027\uff08\u4f8b\u5982\u6709\u5e8f\u6027\uff09\u4f86\u6700\u4f73\u5316\u641c\u5c0b\u904e\u7a0b\uff0c\u5f9e\u800c\u66f4\u9ad8\u6548\u5730\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    • \u201c\u4e8c\u5206\u641c\u5c0b\u201d\u5229\u7528\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u5be6\u73fe\u9ad8\u6548\u67e5\u8a62\uff0c\u50c5\u9069\u7528\u65bc\u9663\u5217\u3002
    • \u201c\u96dc\u6e4a\u67e5\u8a62\u201d\u5229\u7528\u96dc\u6e4a\u8868\u5c07\u641c\u5c0b\u8cc7\u6599\u548c\u76ee\u6a19\u8cc7\u6599\u5efa\u7acb\u70ba\u9375\u503c\u5c0d\u5c0d\u6620\uff0c\u5f9e\u800c\u5be6\u73fe\u67e5\u8a62\u64cd\u4f5c\u3002
    • \u201c\u6a39\u67e5\u8a62\u201d\u5728\u7279\u5b9a\u7684\u6a39\u7d50\u69cb\uff08\u4f8b\u5982\u4e8c\u5143\u641c\u5c0b\u6a39\uff09\u4e2d\uff0c\u57fa\u65bc\u6bd4\u8f03\u7bc0\u9ede\u503c\u4f86\u5feb\u901f\u6392\u9664\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002

    \u6b64\u985e\u6f14\u7b97\u6cd5\u7684\u512a\u9ede\u662f\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \u3002

    \u7136\u800c\uff0c\u4f7f\u7528\u9019\u4e9b\u6f14\u7b97\u6cd5\u5f80\u5f80\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\u3002\u4f8b\u5982\uff0c\u4e8c\u5206\u641c\u5c0b\u9700\u8981\u9810\u5148\u5c0d\u9663\u5217\u9032\u884c\u6392\u5e8f\uff0c\u96dc\u6e4a\u67e5\u8a62\u548c\u6a39\u67e5\u8a62\u90fd\u9700\u8981\u85c9\u52a9\u984d\u5916\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u7dad\u8b77\u9019\u4e9b\u8cc7\u6599\u7d50\u69cb\u4e5f\u9700\u8981\u984d\u5916\u7684\u6642\u9593\u548c\u7a7a\u9593\u958b\u92b7\u3002

    Tip

    \u81ea\u9069\u61c9\u641c\u5c0b\u6f14\u7b97\u6cd5\u5e38\u88ab\u7a31\u70ba\u67e5\u8a62\u6f14\u7b97\u6cd5\uff0c\u4e3b\u8981\u7528\u65bc\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u6aa2\u7d22\u76ee\u6a19\u5143\u7d20\u3002

    "},{"location":"chapter_searching/searching_algorithm_revisited/#1053","title":"10.5.3 \u00a0 \u641c\u5c0b\u65b9\u6cd5\u9078\u53d6","text":"

    \u7d66\u5b9a\u5927\u5c0f\u70ba \\(n\\) \u7684\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u7dda\u6027\u641c\u5c0b\u3001\u4e8c\u5206\u641c\u5c0b\u3001\u6a39\u67e5\u8a62\u3001\u96dc\u6e4a\u67e5\u8a62\u7b49\u591a\u7a2e\u65b9\u6cd5\u5f9e\u4e2d\u641c\u7d22\u76ee\u6a19\u5143\u7d20\u3002\u5404\u500b\u65b9\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u5982\u5716 10-11 \u6240\u793a\u3002

    \u5716 10-11 \u00a0 \u591a\u7a2e\u641c\u5c0b\u7b56\u7565

    \u4e0a\u8ff0\u5e7e\u7a2e\u65b9\u6cd5\u7684\u64cd\u4f5c\u6548\u7387\u8207\u7279\u6027\u5982\u8868 10-1 \u6240\u793a\u3002

    \u8868 10-1 \u00a0 \u67e5\u8a62\u6f14\u7b97\u6cd5\u6548\u7387\u5c0d\u6bd4

    \u7dda\u6027\u641c\u5c0b \u4e8c\u5206\u641c\u5c0b \u6a39\u67e5\u8a62 \u96dc\u6e4a\u67e5\u8a62 \u67e5\u8a62\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)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(n)\\) \\(O(\\log n)\\) \\(O(1)\\) \u984d\u5916\u7a7a\u9593 \\(O(1)\\) \\(O(1)\\) \\(O(n)\\) \\(O(n)\\) \u8cc7\u6599\u9810\u8655\u7406 / \u6392\u5e8f \\(O(n \\log n)\\) \u5efa\u6a39 \\(O(n \\log n)\\) \u5efa\u96dc\u6e4a\u8868 \\(O(n)\\) \u8cc7\u6599\u662f\u5426\u6709\u5e8f \u7121\u5e8f \u6709\u5e8f \u6709\u5e8f \u7121\u5e8f

    \u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u9078\u64c7\u9084\u53d6\u6c7a\u65bc\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u8207\u66f4\u65b0\u983b\u7387\u7b49\u3002

    \u7dda\u6027\u641c\u5c0b

    • \u901a\u7528\u6027\u8f03\u597d\uff0c\u7121\u9808\u4efb\u4f55\u8cc7\u6599\u9810\u8655\u7406\u64cd\u4f5c\u3002\u5047\u5982\u6211\u5011\u50c5\u9700\u67e5\u8a62\u4e00\u6b21\u8cc7\u6599\uff0c\u90a3\u9ebc\u5176\u4ed6\u4e09\u7a2e\u65b9\u6cd5\u7684\u8cc7\u6599\u9810\u8655\u7406\u7684\u6642\u9593\u6bd4\u7dda\u6027\u641c\u5c0b\u7684\u6642\u9593\u9084\u8981\u66f4\u9577\u3002
    • \u9069\u7528\u65bc\u9ad4\u91cf\u8f03\u5c0f\u7684\u8cc7\u6599\uff0c\u6b64\u60c5\u6cc1\u4e0b\u6642\u9593\u8907\u96dc\u5ea6\u5c0d\u6548\u7387\u5f71\u97ff\u8f03\u5c0f\u3002
    • \u9069\u7528\u65bc\u8cc7\u6599\u66f4\u65b0\u983b\u7387\u8f03\u9ad8\u7684\u5834\u666f\uff0c\u56e0\u70ba\u8a72\u65b9\u6cd5\u4e0d\u9700\u8981\u5c0d\u8cc7\u6599\u9032\u884c\u4efb\u4f55\u984d\u5916\u7dad\u8b77\u3002

    \u4e8c\u5206\u641c\u5c0b

    • \u9069\u7528\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u6548\u7387\u8868\u73fe\u7a69\u5b9a\uff0c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \u3002
    • \u8cc7\u6599\u91cf\u4e0d\u80fd\u904e\u5927\uff0c\u56e0\u70ba\u5132\u5b58\u9663\u5217\u9700\u8981\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u3002
    • \u4e0d\u9069\u7528\u65bc\u9ad8\u983b\u589e\u522a\u8cc7\u6599\u7684\u5834\u666f\uff0c\u56e0\u70ba\u7dad\u8b77\u6709\u5e8f\u9663\u5217\u7684\u958b\u92b7\u8f03\u5927\u3002

    \u96dc\u6e4a\u67e5\u8a62

    • \u9069\u5408\u5c0d\u67e5\u8a62\u6548\u80fd\u8981\u6c42\u5f88\u9ad8\u7684\u5834\u666f\uff0c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\) \u3002
    • \u4e0d\u9069\u5408\u9700\u8981\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u7121\u6cd5\u7dad\u8b77\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u3002
    • \u5c0d\u96dc\u6e4a\u51fd\u5f0f\u548c\u96dc\u6e4a\u885d\u7a81\u8655\u7406\u7b56\u7565\u7684\u4f9d\u8cf4\u6027\u8f03\u9ad8\uff0c\u5177\u6709\u8f03\u5927\u7684\u6548\u80fd\u52a3\u5316\u98a8\u96aa\u3002
    • \u4e0d\u9069\u5408\u8cc7\u6599\u91cf\u904e\u5927\u7684\u60c5\u6cc1\uff0c\u56e0\u70ba\u96dc\u6e4a\u8868\u9700\u8981\u984d\u5916\u7a7a\u9593\u4f86\u6700\u5927\u7a0b\u5ea6\u5730\u6e1b\u5c11\u885d\u7a81\uff0c\u5f9e\u800c\u63d0\u4f9b\u826f\u597d\u7684\u67e5\u8a62\u6548\u80fd\u3002

    \u6a39\u67e5\u8a62

    • \u9069\u7528\u65bc\u6d77\u91cf\u8cc7\u6599\uff0c\u56e0\u70ba\u6a39\u7bc0\u9ede\u5728\u8a18\u61b6\u9ad4\u4e2d\u662f\u5206\u6563\u5132\u5b58\u7684\u3002
    • \u9069\u5408\u9700\u8981\u7dad\u8b77\u6709\u5e8f\u8cc7\u6599\u6216\u7bc4\u570d\u67e5\u8a62\u7684\u5834\u666f\u3002
    • \u5728\u6301\u7e8c\u589e\u522a\u7bc0\u9ede\u7684\u904e\u7a0b\u4e2d\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u7522\u751f\u50be\u659c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • \u82e5\u4f7f\u7528 AVL \u6a39\u6216\u7d05\u9ed1\u6a39\uff0c\u5247\u5404\u9805\u64cd\u4f5c\u53ef\u5728 \\(O(\\log n)\\) \u6548\u7387\u4e0b\u7a69\u5b9a\u57f7\u884c\uff0c\u4f46\u7dad\u8b77\u6a39\u5e73\u8861\u7684\u64cd\u4f5c\u6703\u589e\u52a0\u984d\u5916\u7684\u958b\u92b7\u3002
    "},{"location":"chapter_searching/summary/","title":"10.6 \u00a0 \u5c0f\u7d50","text":"
    • \u4e8c\u5206\u641c\u5c0b\u4f9d\u8cf4\u8cc7\u6599\u7684\u6709\u5e8f\u6027\uff0c\u900f\u904e\u8ff4\u5708\u9010\u6b65\u7e2e\u6e1b\u4e00\u534a\u641c\u5c0b\u5340\u9593\u4f86\u9032\u884c\u67e5\u8a62\u3002\u5b83\u8981\u6c42\u8f38\u5165\u8cc7\u6599\u6709\u5e8f\uff0c\u4e14\u50c5\u9069\u7528\u65bc\u9663\u5217\u6216\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u8cc7\u6599\u7d50\u69cb\u3002
    • \u66b4\u529b\u641c\u5c0b\u900f\u904e\u8d70\u8a2a\u8cc7\u6599\u7d50\u69cb\u4f86\u5b9a\u4f4d\u8cc7\u6599\u3002\u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\uff0c\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u548c\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u9069\u7528\u65bc\u5716\u548c\u6a39\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u901a\u7528\u6027\u597d\uff0c\u7121\u9808\u5c0d\u8cc7\u6599\u9032\u884c\u9810\u8655\u7406\uff0c\u4f46\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u8f03\u9ad8\u3002
    • \u96dc\u6e4a\u67e5\u8a62\u3001\u6a39\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u5c6c\u65bc\u9ad8\u6548\u641c\u5c0b\u65b9\u6cd5\uff0c\u53ef\u5728\u7279\u5b9a\u8cc7\u6599\u7d50\u69cb\u4e2d\u5feb\u901f\u5b9a\u4f4d\u76ee\u6a19\u5143\u7d20\u3002\u6b64\u985e\u6f14\u7b97\u6cd5\u6548\u7387\u9ad8\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(\\log n)\\) \u751a\u81f3 \\(O(1)\\) \uff0c\u4f46\u901a\u5e38\u9700\u8981\u85c9\u52a9\u984d\u5916\u8cc7\u6599\u7d50\u69cb\u3002
    • \u5be6\u969b\u4e2d\uff0c\u6211\u5011\u9700\u8981\u5c0d\u8cc7\u6599\u9ad4\u91cf\u3001\u641c\u5c0b\u6548\u80fd\u8981\u6c42\u3001\u8cc7\u6599\u67e5\u8a62\u548c\u66f4\u65b0\u983b\u7387\u7b49\u56e0\u7d20\u9032\u884c\u5177\u9ad4\u5206\u6790\uff0c\u5f9e\u800c\u9078\u64c7\u5408\u9069\u7684\u641c\u5c0b\u65b9\u6cd5\u3002
    • \u7dda\u6027\u641c\u5c0b\u9069\u7528\u65bc\u5c0f\u578b\u6216\u983b\u7e41\u66f4\u65b0\u7684\u8cc7\u6599\uff1b\u4e8c\u5206\u641c\u5c0b\u9069\u7528\u65bc\u5927\u578b\u3001\u6392\u5e8f\u7684\u8cc7\u6599\uff1b\u96dc\u6e4a\u67e5\u8a62\u9069\u7528\u65bc\u5c0d\u67e5\u8a62\u6548\u7387\u8981\u6c42\u8f03\u9ad8\u4e14\u7121\u9808\u7bc4\u570d\u67e5\u8a62\u7684\u8cc7\u6599\uff1b\u6a39\u67e5\u8a62\u9069\u7528\u65bc\u9700\u8981\u7dad\u8b77\u9806\u5e8f\u548c\u652f\u6301\u7bc4\u570d\u67e5\u8a62\u7684\u5927\u578b\u52d5\u614b\u8cc7\u6599\u3002
    • \u7528\u96dc\u6e4a\u67e5\u8a62\u66ff\u63db\u7dda\u6027\u67e5\u8a62\u662f\u4e00\u7a2e\u5e38\u7528\u7684\u6700\u4f73\u5316\u57f7\u884c\u6642\u9593\u7684\u7b56\u7565\uff0c\u53ef\u5c07\u6642\u9593\u8907\u96dc\u5ea6\u5f9e \\(O(n)\\) \u964d\u81f3 \\(O(1)\\) \u3002
    "},{"location":"chapter_sorting/","title":"\u7b2c 11 \u7ae0 \u00a0 \u6392\u5e8f","text":"

    Abstract

    \u6392\u5e8f\u7336\u5982\u4e00\u628a\u5c07\u6df7\u4e82\u8b8a\u70ba\u79e9\u5e8f\u7684\u9b54\u6cd5\u9470\u5319\uff0c\u4f7f\u6211\u5011\u80fd\u4ee5\u66f4\u9ad8\u6548\u7684\u65b9\u5f0f\u7406\u89e3\u8207\u8655\u7406\u8cc7\u6599\u3002

    \u7121\u8ad6\u662f\u7c21\u55ae\u7684\u5347\u5e8f\uff0c\u9084\u662f\u8907\u96dc\u7684\u5206\u985e\u6392\u5217\uff0c\u6392\u5e8f\u90fd\u5411\u6211\u5011\u5c55\u793a\u4e86\u8cc7\u6599\u7684\u548c\u8ae7\u7f8e\u611f\u3002

    "},{"location":"chapter_sorting/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5
    • 11.2 \u00a0 \u9078\u64c7\u6392\u5e8f
    • 11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f
    • 11.4 \u00a0 \u63d2\u5165\u6392\u5e8f
    • 11.5 \u00a0 \u5feb\u901f\u6392\u5e8f
    • 11.6 \u00a0 \u5408\u4f75\u6392\u5e8f
    • 11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f
    • 11.8 \u00a0 \u6876\u6392\u5e8f
    • 11.9 \u00a0 \u8a08\u6578\u6392\u5e8f
    • 11.10 \u00a0 \u57fa\u6578\u6392\u5e8f
    • 11.11 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_sorting/bubble_sort/","title":"11.3 \u00a0 \u6ce1\u6cab\u6392\u5e8f","text":"

    \u6ce1\u6cab\u6392\u5e8f\uff08bubble sort\uff09\u900f\u904e\u9023\u7e8c\u5730\u6bd4\u8f03\u8207\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u5be6\u73fe\u6392\u5e8f\u3002\u9019\u500b\u904e\u7a0b\u5c31\u50cf\u6c23\u6ce1\u5f9e\u5e95\u90e8\u5347\u5230\u9802\u90e8\u4e00\u6a23\uff0c\u56e0\u6b64\u5f97\u540d\u6ce1\u6cab\u6392\u5e8f\u3002

    \u5982\u5716 11-4 \u6240\u793a\uff0c\u5192\u6ce1\u904e\u7a0b\u53ef\u4ee5\u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u4f86\u6a21\u64ec\uff1a\u5f9e\u9663\u5217\u6700\u5de6\u7aef\u958b\u59cb\u5411\u53f3\u8d70\u8a2a\uff0c\u4f9d\u6b21\u6bd4\u8f03\u76f8\u9130\u5143\u7d20\u5927\u5c0f\uff0c\u5982\u679c\u201c\u5de6\u5143\u7d20 > \u53f3\u5143\u7d20\u201d\u5c31\u4ea4\u63db\u4e8c\u8005\u3002\u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u7684\u5143\u7d20\u6703\u88ab\u79fb\u52d5\u5230\u9663\u5217\u7684\u6700\u53f3\u7aef\u3002

    <1><2><3><4><5><6><7>

    \u5716 11-4 \u00a0 \u5229\u7528\u5143\u7d20\u4ea4\u63db\u64cd\u4f5c\u6a21\u64ec\u5192\u6ce1

    "},{"location":"chapter_sorting/bubble_sort/#1131","title":"11.3.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6b65\u9a5f\u5982\u5716 11-5 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5c0d \\(n\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    2. \u63a5\u4e0b\u4f86\uff0c\u5c0d\u5269\u9918 \\(n - 1\\) \u500b\u5143\u7d20\u57f7\u884c\u201c\u5192\u6ce1\u201d\uff0c\u5c07\u7b2c\u4e8c\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    3. \u4ee5\u6b64\u985e\u63a8\uff0c\u7d93\u904e \\(n - 1\\) \u8f2a\u201c\u5192\u6ce1\u201d\u5f8c\uff0c\u524d \\(n - 1\\) \u5927\u7684\u5143\u7d20\u90fd\u88ab\u4ea4\u63db\u81f3\u6b63\u78ba\u4f4d\u7f6e\u3002
    4. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5c0f\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002

    \u5716 11-5 \u00a0 \u6ce1\u6cab\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n
    bubble_sort.cpp
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.java
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid BubbleSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n            }\n        }\n    }\n}\n
    bubble_sort.go
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n            }\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunc bubbleSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n            }\n        }\n    }\n}\n
    bubble_sort.js
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfunction bubbleSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfn bubble_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 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.c
    /* \u6ce1\u6cab\u6392\u5e8f */\nvoid bubbleSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\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
    /* \u6ce1\u6cab\u6392\u5e8f */\nfun bubbleSort(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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
    [class]{}-[func]{bubble_sort}\n
    bubble_sort.zig
    // \u6ce1\u6cab\u6392\u5e8f\nfn bubbleSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                var tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n            }\n        }\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1132","title":"11.3.2 \u00a0 \u6548\u7387\u6700\u4f73\u5316","text":"

    \u6211\u5011\u767c\u73fe\uff0c\u5982\u679c\u67d0\u8f2a\u201c\u5192\u6ce1\u201d\u4e2d\u6c92\u6709\u57f7\u884c\u4efb\u4f55\u4ea4\u63db\u64cd\u4f5c\uff0c\u8aaa\u660e\u9663\u5217\u5df2\u7d93\u5b8c\u6210\u6392\u5e8f\uff0c\u53ef\u76f4\u63a5\u8fd4\u56de\u7d50\u679c\u3002\u56e0\u6b64\uff0c\u53ef\u4ee5\u589e\u52a0\u4e00\u500b\u6a19\u8a8c\u4f4d flag \u4f86\u76e3\u6e2c\u9019\u7a2e\u60c5\u6cc1\uff0c\u4e00\u65e6\u51fa\u73fe\u5c31\u7acb\u5373\u8fd4\u56de\u3002

    \u7d93\u904e\u6700\u4f73\u5316\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u548c\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4ecd\u70ba \\(O(n^2)\\) \uff1b\u4f46\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u53ef\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig bubble_sort.py
    def bubble_sort_with_flag(nums: list[int]):\n    \"\"\"\u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in range(n - 1, 0, -1):\n        flag = False  # \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        # \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in range(i):\n            if nums[j] > nums[j + 1]:\n                # \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j + 1] = nums[j + 1], nums[j]\n                flag = True  # \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n        if not flag:\n            break  # \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n
    bubble_sort.cpp
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.size() - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                // \u9019\u88e1\u4f7f\u7528\u4e86 std::swap() \u51fd\u5f0f\n                swap(nums[j], nums[j + 1]);\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.java
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nvoid bubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.length - 1; i > 0; i--) {\n        boolean flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                int tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag)\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.cs
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid BubbleSortWithFlag(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = nums.Length - 1; i > 0; i--) {\n        bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (int j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                (nums[j + 1], nums[j]) = (nums[j], nums[j + 1]);\n                flag = true;  // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break;     // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.go
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i := len(nums) - 1; i > 0; i-- {\n        flag := false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j := 0; j < i; j++ {\n            if nums[j] > nums[j+1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums[j], nums[j+1] = nums[j+1], nums[j]\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if flag == false { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.swift
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunc bubbleSortWithFlag(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in nums.indices.dropFirst().reversed() {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        for j in 0 ..< i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                nums.swapAt(j, j + 1)\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag { // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n            break\n        }\n    }\n}\n
    bubble_sort.js
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.ts
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nfunction bubbleSortWithFlag(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (let i = nums.length - 1; i > 0; i--) {\n        let flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (let j = 0; j < i; j++) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.dart
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n  for (int i = nums.length - 1; i > 0; i--) {\n    bool flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n    // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n    for (int j = 0; j < i; j++) {\n      if (nums[j] > nums[j + 1]) {\n        // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n        int tmp = nums[j];\n        nums[j] = nums[j + 1];\n        nums[j + 1] = tmp;\n        flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n      }\n    }\n    if (!flag) break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n  }\n}\n
    bubble_sort.rs
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfn bubble_sort_with_flag(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for i in (1..nums.len()).rev() {\n        let mut flag = false; // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for j in 0..i {\n            if nums[j] > nums[j + 1] {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                let tmp = nums[j];\n                nums[j] = nums[j + 1];\n                nums[j + 1] = tmp;\n                flag = true; // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if !flag {\n            break; // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n        };\n    }\n}\n
    bubble_sort.c
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09*/\nvoid bubbleSortWithFlag(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (int i = size - 1; i > 0; i--) {\n        bool flag = false;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\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
    /* \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09 */\nfun bubbleSortWithFlag(nums: IntArray) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    for (i in nums.size - 1 downTo 1) {\n        var flag = false // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        for (j in 0..<i) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 nums[j + 1]\n                val temp = nums[j]\n                nums[j] = nums[j + 1]\n                nums[j + 1] = temp\n                flag = true // \u8a18\u9304\u4ea4\u63db\u5143\u7d20\n            }\n        }\n        if (!flag) break // \u6b64\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    bubble_sort.rb
    [class]{}-[func]{bubble_sort_with_flag}\n
    bubble_sort.zig
    // \u6ce1\u6cab\u6392\u5e8f\uff08\u6a19\u8a8c\u6700\u4f73\u5316\uff09\nfn bubbleSortWithFlag(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [0, i]\n    var i: usize = nums.len - 1;\n    while (i > 0) : (i -= 1) {\n        var flag = false;   // \u521d\u59cb\u5316\u6a19\u8a8c\u4f4d\n        var j: usize = 0;\n        // \u5167\u8ff4\u5708\uff1a\u5c07\u672a\u6392\u5e8f\u5340\u9593 [0, i] \u4e2d\u7684\u6700\u5927\u5143\u7d20\u4ea4\u63db\u81f3\u8a72\u5340\u9593\u7684\u6700\u53f3\u7aef\n        while (j < i) : (j += 1) {\n            if (nums[j] > nums[j + 1]) {\n                // \u4ea4\u63db nums[j] \u8207 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\u8f2a\u201c\u5192\u6ce1\u201d\u672a\u4ea4\u63db\u4efb\u4f55\u5143\u7d20\uff0c\u76f4\u63a5\u8df3\u51fa\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bubble_sort/#1133","title":"11.3.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5404\u8f2a\u201c\u5192\u6ce1\u201d\u8d70\u8a2a\u7684\u9663\u5217\u9577\u5ea6\u4f9d\u6b21\u70ba \\(n - 1\\)\u3001\\(n - 2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u7e3d\u548c\u70ba \\((n - 1) n / 2\\) \u3002\u5728\u5f15\u5165 flag \u6700\u4f73\u5316\u5f8c\uff0c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054\u5230 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5728\u201c\u5192\u6ce1\u201d\u4e2d\u9047\u5230\u76f8\u7b49\u5143\u7d20\u4e0d\u4ea4\u63db\u3002
    "},{"location":"chapter_sorting/bucket_sort/","title":"11.8 \u00a0 \u6876\u6392\u5e8f","text":"

    \u524d\u8ff0\u5e7e\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u90fd\u5c6c\u65bc\u201c\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u900f\u904e\u6bd4\u8f03\u5143\u7d20\u9593\u7684\u5927\u5c0f\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u6b64\u985e\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7121\u6cd5\u8d85\u8d8a \\(O(n \\log n)\\) \u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u63a2\u8a0e\u5e7e\u7a2e\u201c\u975e\u6bd4\u8f03\u6392\u5e8f\u6f14\u7b97\u6cd5\u201d\uff0c\u5b83\u5011\u7684\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u9054\u5230\u7dda\u6027\u968e\u3002

    \u6876\u6392\u5e8f\uff08bucket sort\uff09\u662f\u5206\u6cbb\u7b56\u7565\u7684\u4e00\u500b\u5178\u578b\u61c9\u7528\u3002\u5b83\u900f\u904e\u8a2d\u5b9a\u4e00\u4e9b\u5177\u6709\u5927\u5c0f\u9806\u5e8f\u7684\u6876\uff0c\u6bcf\u500b\u6876\u5c0d\u61c9\u4e00\u500b\u6578\u64da\u7bc4\u570d\uff0c\u5c07\u8cc7\u6599\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff1b\u7136\u5f8c\uff0c\u5728\u6bcf\u500b\u6876\u5167\u90e8\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff1b\u6700\u7d42\u6309\u7167\u6876\u7684\u9806\u5e8f\u5c07\u6240\u6709\u8cc7\u6599\u5408\u4f75\u3002

    "},{"location":"chapter_sorting/bucket_sort/#1181","title":"11.8.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8003\u616e\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\uff0c\u5176\u5143\u7d20\u662f\u7bc4\u570d \\([0, 1)\\) \u5167\u7684\u6d6e\u9ede\u6578\u3002\u6876\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-13 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316 \\(k\\) \u500b\u6876\uff0c\u5c07 \\(n\\) \u500b\u5143\u7d20\u5206\u914d\u5230 \\(k\\) \u500b\u6876\u4e2d\u3002
    2. \u5c0d\u6bcf\u500b\u6876\u5206\u5225\u57f7\u884c\u6392\u5e8f\uff08\u9019\u88e1\u63a1\u7528\u7a0b\u5f0f\u8a9e\u8a00\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff09\u3002
    3. \u6309\u7167\u6876\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u5408\u4f75\u7d50\u679c\u3002

    \u5716 11-13 \u00a0 \u6876\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

    \u7a0b\u5f0f\u78bc\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    k = len(nums) // 2\n    buckets = [[] for _ in range(k)]\n    # 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums:\n        # \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i = int(num * k)\n        # \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    # 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in buckets:\n        # \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    # 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    int k = nums.size() / 2;\n    vector<vector<float>> buckets(k);\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = num * k;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 bucket_idx\n        buckets[i].push_back(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (vector<float> &bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort(bucket.begin(), bucket.end());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (float num : nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int) (num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets.get(i).add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (List<Float> bucket : buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        Collections.sort(bucket);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    foreach (float num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        int i = (int)(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].Add(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    foreach (List<float> bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.Sort();\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for _, num := range nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        i := int(num * float64(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i] = append(buckets[i], num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i := 0; i < k; i++ {\n        // \u4f7f\u7528\u5167\u5efa\u5207\u7247\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        sort.Float64s(buckets[i])\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.count / 2\n    var buckets = (0 ..< k).map { _ in [Double]() }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for num in nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = Int(num * Double(k))\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].append(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for i in buckets.indices {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        buckets[i].sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (const num of nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        const i = Math.floor(num * k);\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (const bucket of buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort((a, b) => a - b);\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n  int k = nums.length ~/ 2;\n  List<List<double>> buckets = List.generate(k, (index) => []);\n\n  // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n  for (double _num in nums) {\n    // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 _num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n    int i = (_num * k).toInt();\n    // \u5c07 _num \u65b0\u589e\u9032\u6876 bucket_idx\n    buckets[i].add(_num);\n  }\n  // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n  for (List<double> bucket in buckets) {\n    bucket.sort();\n  }\n  // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\u5143\u7d20\n    let k = nums.len() / 2;\n    let mut buckets = vec![vec![]; k];\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for &mut num in &mut *nums {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        let i = (num * k as f64) as usize;\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].push(num);\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for bucket in &mut buckets {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort_by(|a, b| a.partial_cmp(b).unwrap());\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\u679c\n    let mut i = 0;\n    for bucket in &mut buckets {\n        for &mut num in bucket {\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 \u500b\u6876\n    int *sizes = malloc(k * sizeof(int));          // \u8a18\u9304\u6bcf\u500b\u6876\u7684\u5927\u5c0f\n    float **buckets = malloc(k * sizeof(float *)); // \u52d5\u614b\u9663\u5217\u7684\u9663\u5217\uff08\u6876\uff09\n    // \u70ba\u6bcf\u500b\u6876\u9810\u5206\u914d\u8db3\u5920\u7684\u7a7a\u9593\n    for (int i = 0; i < k; ++i) {\n        buckets[i] = (float *)malloc(n * sizeof(float));\n        sizes[i] = 0;\n    }\n    // 1. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\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. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (int i = 0; i < k; ++i) {\n        qsort(buckets[i], sizes[i], sizeof(float), compare);\n    }\n    // 3. \u5408\u4f75\u6392\u5e8f\u5f8c\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        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(buckets[i]);\n    }\n}\n
    bucket_sort.kt
    /* \u6876\u6392\u5e8f */\nfun bucketSort(nums: FloatArray) {\n    // \u521d\u59cb\u5316 k = n/2 \u500b\u6876\uff0c\u9810\u671f\u5411\u6bcf\u500b\u6876\u5206\u914d 2 \u500b\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. \u5c07\u9663\u5217\u5143\u7d20\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\n    for (num in nums) {\n        // \u8f38\u5165\u8cc7\u6599\u7bc4\u570d\u70ba [0, 1)\uff0c\u4f7f\u7528 num * k \u5c0d\u6620\u5230\u7d22\u5f15\u7bc4\u570d [0, k-1]\n        val i = (num * k).toInt()\n        // \u5c07 num \u65b0\u589e\u9032\u6876 i\n        buckets[i].add(num)\n    }\n    // 2. \u5c0d\u5404\u500b\u6876\u57f7\u884c\u6392\u5e8f\n    for (bucket in buckets) {\n        // \u4f7f\u7528\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u66ff\u63db\u6210\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\n        bucket.sort()\n    }\n    // 3. \u8d70\u8a2a\u6876\u5408\u4f75\u7d50\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
    [class]{}-[func]{bucket_sort}\n
    bucket_sort.zig
    [class]{}-[func]{bucketSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/bucket_sort/#1182","title":"11.8.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u6876\u6392\u5e8f\u9069\u7528\u65bc\u8655\u7406\u9ad4\u91cf\u5f88\u5927\u7684\u8cc7\u6599\u3002\u4f8b\u5982\uff0c\u8f38\u5165\u8cc7\u6599\u5305\u542b 100 \u842c\u500b\u5143\u7d20\uff0c\u7531\u65bc\u7a7a\u9593\u9650\u5236\uff0c\u7cfb\u7d71\u8a18\u61b6\u9ad4\u7121\u6cd5\u4e00\u6b21\u6027\u8f09\u5165\u6240\u6709\u8cc7\u6599\u3002\u6b64\u6642\uff0c\u53ef\u4ee5\u5c07\u8cc7\u6599\u5206\u6210 1000 \u500b\u6876\uff0c\u7136\u5f8c\u5206\u5225\u5c0d\u6bcf\u500b\u6876\u9032\u884c\u6392\u5e8f\uff0c\u6700\u5f8c\u5c07\u7d50\u679c\u5408\u4f75\u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\) \uff1a\u5047\u8a2d\u5143\u7d20\u5728\u5404\u500b\u6876\u5167\u5e73\u5747\u5206\u4f48\uff0c\u90a3\u9ebc\u6bcf\u500b\u6876\u5167\u7684\u5143\u7d20\u6578\u91cf\u70ba \\(\\frac{n}{k}\\) \u3002\u5047\u8a2d\u6392\u5e8f\u55ae\u500b\u6876\u4f7f\u7528 \\(O(\\frac{n}{k} \\log\\frac{n}{k})\\) \u6642\u9593\uff0c\u5247\u6392\u5e8f\u6240\u6709\u6876\u4f7f\u7528 \\(O(n \\log\\frac{n}{k})\\) \u6642\u9593\u3002\u7576\u6876\u6578\u91cf \\(k\\) \u6bd4\u8f03\u5927\u6642\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5247\u8da8\u5411\u65bc \\(O(n)\\) \u3002\u5408\u4f75\u7d50\u679c\u6642\u9700\u8981\u8d70\u8a2a\u6240\u6709\u6876\u548c\u5143\u7d20\uff0c\u82b1\u8cbb \\(O(n + k)\\) \u6642\u9593\u3002
    • \u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u8cc7\u6599\u88ab\u5206\u914d\u5230\u4e00\u500b\u6876\u4e2d\uff0c\u4e14\u6392\u5e8f\u8a72\u6876\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + k)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u9700\u8981\u85c9\u52a9 \\(k\\) \u500b\u6876\u548c\u7e3d\u5171 \\(n\\) \u500b\u5143\u7d20\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u6876\u6392\u5e8f\u662f\u5426\u7a69\u5b9a\u53d6\u6c7a\u65bc\u6392\u5e8f\u6876\u5167\u5143\u7d20\u7684\u6f14\u7b97\u6cd5\u662f\u5426\u7a69\u5b9a\u3002
    "},{"location":"chapter_sorting/bucket_sort/#1183","title":"11.8.3 \u00a0 \u5982\u4f55\u5be6\u73fe\u5e73\u5747\u5206\u914d","text":"

    \u6876\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u7406\u8ad6\u4e0a\u53ef\u4ee5\u9054\u5230 \\(O(n)\\) \uff0c\u95dc\u9375\u5728\u65bc\u5c07\u5143\u7d20\u5747\u52fb\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\uff0c\u56e0\u70ba\u5be6\u969b\u8cc7\u6599\u5f80\u5f80\u4e0d\u662f\u5747\u52fb\u5206\u4f48\u7684\u3002\u4f8b\u5982\uff0c\u6211\u5011\u60f3\u8981\u5c07\u6dd8\u5bf6\u4e0a\u7684\u6240\u6709\u5546\u54c1\u6309\u50f9\u683c\u7bc4\u570d\u5e73\u5747\u5206\u914d\u5230 10 \u500b\u6876\u4e2d\uff0c\u4f46\u5546\u54c1\u50f9\u683c\u5206\u4f48\u4e0d\u5747\uff0c\u4f4e\u65bc 100 \u5143\u7684\u975e\u5e38\u591a\uff0c\u9ad8\u65bc 1000 \u5143\u7684\u975e\u5e38\u5c11\u3002\u82e5\u5c07\u50f9\u683c\u5340\u9593\u5e73\u5747\u5283\u5206\u70ba 10 \u500b\uff0c\u5404\u500b\u6876\u4e2d\u7684\u5546\u54c1\u6578\u91cf\u5dee\u8ddd\u6703\u975e\u5e38\u5927\u3002

    \u70ba\u5be6\u73fe\u5e73\u5747\u5206\u914d\uff0c\u6211\u5011\u53ef\u4ee5\u5148\u8a2d\u5b9a\u4e00\u689d\u5927\u81f4\u7684\u5206\u754c\u7dda\uff0c\u5c07\u8cc7\u6599\u7c97\u7565\u5730\u5206\u5230 3 \u500b\u6876\u4e2d\u3002\u5206\u914d\u5b8c\u7562\u5f8c\uff0c\u518d\u5c07\u5546\u54c1\u8f03\u591a\u7684\u6876\u7e7c\u7e8c\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u76f4\u81f3\u6240\u6709\u6876\u4e2d\u7684\u5143\u7d20\u6578\u91cf\u5927\u81f4\u76f8\u7b49\u3002

    \u5982\u5716 11-14 \u6240\u793a\uff0c\u9019\u7a2e\u65b9\u6cd5\u672c\u8cea\u4e0a\u662f\u5efa\u7acb\u4e00\u68f5\u905e\u8ff4\u6a39\uff0c\u76ee\u6a19\u662f\u8b93\u8449\u7bc0\u9ede\u7684\u503c\u5118\u53ef\u80fd\u5e73\u5747\u3002\u7576\u7136\uff0c\u4e0d\u4e00\u5b9a\u8981\u6bcf\u8f2a\u5c07\u8cc7\u6599\u5283\u5206\u70ba 3 \u500b\u6876\uff0c\u5177\u9ad4\u5283\u5206\u65b9\u5f0f\u53ef\u6839\u64da\u8cc7\u6599\u7279\u9ede\u9748\u6d3b\u9078\u64c7\u3002

    \u5716 11-14 \u00a0 \u905e\u8ff4\u5283\u5206\u6876

    \u5982\u679c\u6211\u5011\u63d0\u524d\u77e5\u9053\u5546\u54c1\u50f9\u683c\u7684\u6a5f\u7387\u5206\u4f48\uff0c\u5247\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u6a5f\u7387\u5206\u4f48\u8a2d\u5b9a\u6bcf\u500b\u6876\u7684\u50f9\u683c\u5206\u754c\u7dda\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u8cc7\u6599\u5206\u4f48\u4e26\u4e0d\u4e00\u5b9a\u9700\u8981\u7279\u610f\u7d71\u8a08\uff0c\u4e5f\u53ef\u4ee5\u6839\u64da\u8cc7\u6599\u7279\u9ede\u63a1\u7528\u67d0\u7a2e\u6a5f\u7387\u6a21\u578b\u9032\u884c\u8fd1\u4f3c\u3002

    \u5982\u5716 11-15 \u6240\u793a\uff0c\u6211\u5011\u5047\u8a2d\u5546\u54c1\u50f9\u683c\u670d\u5f9e\u6b63\u614b\u5206\u4f48\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5408\u7406\u5730\u8a2d\u5b9a\u50f9\u683c\u5340\u9593\uff0c\u5f9e\u800c\u5c07\u5546\u54c1\u5e73\u5747\u5206\u914d\u5230\u5404\u500b\u6876\u4e2d\u3002

    \u5716 11-15 \u00a0 \u6839\u64da\u6a5f\u7387\u5206\u4f48\u5283\u5206\u6876

    "},{"location":"chapter_sorting/counting_sort/","title":"11.9 \u00a0 \u8a08\u6578\u6392\u5e8f","text":"

    \u8a08\u6578\u6392\u5e8f\uff08counting sort\uff09\u900f\u904e\u7d71\u8a08\u5143\u7d20\u6578\u91cf\u4f86\u5be6\u73fe\u6392\u5e8f\uff0c\u901a\u5e38\u61c9\u7528\u65bc\u6574\u6578\u9663\u5217\u3002

    "},{"location":"chapter_sorting/counting_sort/#1191","title":"11.9.1 \u00a0 \u7c21\u55ae\u5be6\u73fe","text":"

    \u5148\u4f86\u770b\u4e00\u500b\u7c21\u55ae\u7684\u4f8b\u5b50\u3002\u7d66\u5b9a\u4e00\u500b\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217 nums \uff0c\u5176\u4e2d\u7684\u5143\u7d20\u90fd\u662f\u201c\u975e\u8ca0\u6574\u6578\u201d\uff0c\u8a08\u6578\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-16 \u6240\u793a\u3002

    1. \u8d70\u8a2a\u9663\u5217\uff0c\u627e\u51fa\u5176\u4e2d\u7684\u6700\u5927\u6578\u5b57\uff0c\u8a18\u70ba \\(m\\) \uff0c\u7136\u5f8c\u5efa\u7acb\u4e00\u500b\u9577\u5ea6\u70ba \\(m + 1\\) \u7684\u8f14\u52a9\u9663\u5217 counter \u3002
    2. \u85c9\u52a9 counter \u7d71\u8a08 nums \u4e2d\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\uff0c\u5176\u4e2d counter[num] \u5c0d\u61c9\u6578\u5b57 num \u7684\u51fa\u73fe\u6b21\u6578\u3002\u7d71\u8a08\u65b9\u6cd5\u5f88\u7c21\u55ae\uff0c\u53ea\u9700\u8d70\u8a2a nums\uff08\u8a2d\u7576\u524d\u6578\u5b57\u70ba num\uff09\uff0c\u6bcf\u8f2a\u5c07 counter[num] \u589e\u52a0 \\(1\\) \u5373\u53ef\u3002
    3. \u7531\u65bc counter \u7684\u5404\u500b\u7d22\u5f15\u5929\u7136\u6709\u5e8f\uff0c\u56e0\u6b64\u76f8\u7576\u65bc\u6240\u6709\u6578\u5b57\u5df2\u7d93\u6392\u5e8f\u597d\u4e86\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u8d70\u8a2a counter \uff0c\u6839\u64da\u5404\u6578\u5b57\u51fa\u73fe\u6b21\u6578\u5f9e\u5c0f\u5230\u5927\u7684\u9806\u5e8f\u586b\u5165 nums \u5373\u53ef\u3002

    \u5716 11-16 \u00a0 \u8a08\u6578\u6392\u5e8f\u6d41\u7a0b

    \u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort_naive(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = 0\n    for num in nums:\n        m = max(m, num)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid CountingSortNaive(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunc countingSortNaive(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    var counter = Array(repeating: 0, count: m + 1)\n    for num in nums {\n        counter[num] += 1\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter = new Array(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfunction countingSortNaive(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    const counter: number[] = new Array<number>(m + 1).fill(0);\n    for (const num of nums) {\n        counter[num]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\n  List<int> counter = List.filled(m + 1, 0);\n  for (int _num in nums) {\n    counter[_num]++;\n  }\n  // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfn counting_sort_naive(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nvoid countingSortNaive(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\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. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int *counter = calloc(m + 1, sizeof(int));\n    for (int i = 0; i < size; i++) {\n        counter[nums[i]]++;\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8a08\u6578\u6392\u5e8f */\n// \u7c21\u55ae\u5be6\u73fe\uff0c\u7121\u6cd5\u7528\u65bc\u6392\u5e8f\u7269\u4ef6\nfun countingSortNaive(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u8d70\u8a2a counter \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u539f\u9663\u5217 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
    [class]{}-[func]{counting_sort_naive}\n
    counting_sort.zig
    [class]{}-[func]{countingSortNaive}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8a08\u6578\u6392\u5e8f\u8207\u6876\u6392\u5e8f\u7684\u95dc\u806f

    \u5f9e\u6876\u6392\u5e8f\u7684\u89d2\u5ea6\u770b\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u8a08\u6578\u6392\u5e8f\u4e2d\u7684\u8a08\u6578\u9663\u5217 counter \u7684\u6bcf\u500b\u7d22\u5f15\u8996\u70ba\u4e00\u500b\u6876\uff0c\u5c07\u7d71\u8a08\u6578\u91cf\u7684\u904e\u7a0b\u770b\u4f5c\u5c07\u5404\u500b\u5143\u7d20\u5206\u914d\u5230\u5c0d\u61c9\u7684\u6876\u4e2d\u3002\u672c\u8cea\u4e0a\uff0c\u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u5728\u6574\u578b\u8cc7\u6599\u4e0b\u7684\u4e00\u500b\u7279\u4f8b\u3002

    "},{"location":"chapter_sorting/counting_sort/#1192","title":"11.9.2 \u00a0 \u5b8c\u6574\u5be6\u73fe","text":"

    \u7d30\u5fc3\u7684\u8b80\u8005\u53ef\u80fd\u767c\u73fe\u4e86\uff0c\u5982\u679c\u8f38\u5165\u8cc7\u6599\u662f\u7269\u4ef6\uff0c\u4e0a\u8ff0\u6b65\u9a5f 3. \u5c31\u5931\u6548\u4e86\u3002\u5047\u8a2d\u8f38\u5165\u8cc7\u6599\u662f\u5546\u54c1\u7269\u4ef6\uff0c\u6211\u5011\u60f3\u6309\u7167\u5546\u54c1\u50f9\u683c\uff08\u985e\u5225\u7684\u6210\u54e1\u8b8a\u6578\uff09\u5c0d\u5546\u54c1\u9032\u884c\u6392\u5e8f\uff0c\u800c\u4e0a\u8ff0\u6f14\u7b97\u6cd5\u53ea\u80fd\u7d66\u51fa\u50f9\u683c\u7684\u6392\u5e8f\u7d50\u679c\u3002

    \u90a3\u9ebc\u5982\u4f55\u624d\u80fd\u5f97\u5230\u539f\u8cc7\u6599\u7684\u6392\u5e8f\u7d50\u679c\u5462\uff1f\u6211\u5011\u9996\u5148\u8a08\u7b97 counter \u7684\u201c\u524d\u7db4\u548c\u201d\u3002\u9867\u540d\u601d\u7fa9\uff0c\u7d22\u5f15 i \u8655\u7684\u524d\u7db4\u548c prefix[i] \u7b49\u65bc\u9663\u5217\u524d i \u500b\u5143\u7d20\u4e4b\u548c\uff1a

    \\[ \\text{prefix}[i] = \\sum_{j=0}^i \\text{counter[j]} \\]

    \u524d\u7db4\u548c\u5177\u6709\u660e\u78ba\u7684\u610f\u7fa9\uff0cprefix[num] - 1 \u4ee3\u8868\u5143\u7d20 num \u5728\u7d50\u679c\u9663\u5217 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\u3002\u9019\u500b\u8cc7\u8a0a\u975e\u5e38\u95dc\u9375\uff0c\u56e0\u70ba\u5b83\u544a\u8a34\u6211\u5011\u5404\u500b\u5143\u7d20\u61c9\u8a72\u51fa\u73fe\u5728\u7d50\u679c\u9663\u5217\u7684\u54ea\u500b\u4f4d\u7f6e\u3002\u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5012\u5e8f\u8d70\u8a2a\u539f\u9663\u5217 nums \u7684\u6bcf\u500b\u5143\u7d20 num \uff0c\u5728\u6bcf\u8f2a\u8fed\u4ee3\u4e2d\u57f7\u884c\u4ee5\u4e0b\u5169\u6b65\u3002

    1. \u5c07 num \u586b\u5165\u9663\u5217 res \u7684\u7d22\u5f15 prefix[num] - 1 \u8655\u3002
    2. \u4ee4\u524d\u7db4\u548c prefix[num] \u6e1b\u5c0f \\(1\\) \uff0c\u5f9e\u800c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\u3002

    \u8d70\u8a2a\u5b8c\u6210\u5f8c\uff0c\u9663\u5217 res \u4e2d\u5c31\u662f\u6392\u5e8f\u597d\u7684\u7d50\u679c\uff0c\u6700\u5f8c\u4f7f\u7528 res \u8986\u84cb\u539f\u9663\u5217 nums \u5373\u53ef\u3002\u5716 11-17 \u5c55\u793a\u4e86\u5b8c\u6574\u7684\u8a08\u6578\u6392\u5e8f\u6d41\u7a0b\u3002

    <1><2><3><4><5><6><7><8>

    \u5716 11-17 \u00a0 \u8a08\u6578\u6392\u5e8f\u6b65\u9a5f

    \u8a08\u6578\u6392\u5e8f\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig counting_sort.py
    def counting_sort(nums: list[int]):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\"\"\"\n    # \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\n    # 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m = max(nums)\n    # 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    # counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter = [0] * (m + 1)\n    for num in nums:\n        counter[num] += 1\n    # 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    # \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in range(m):\n        counter[i + 1] += counter[i]\n    # 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    # \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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  # \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1  # \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    # \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n
    counting_sort.cpp
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(vector<int> &nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    vector<int> counter(m + 1, 0);\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    nums = res;\n}\n
    counting_sort.java
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    for (int num : nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    for (int num : nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.cs
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid CountingSort(int[] nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    int m = 0;\n    foreach (int num in nums) {\n        m = Math.Max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    int[] counter = new int[m + 1];\n    foreach (int num in nums) {\n        counter[num]++;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.go
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums []int) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    m := 0\n    for _, num := range nums {\n        if num > m {\n            m = num\n        }\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    counter := make([]int, m+1)\n    for _, num := range nums {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i := 0; i < m; i++ {\n        counter[i+1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\u679c\n    n := len(nums)\n    res := make([]int, n)\n    for i := n - 1; i >= 0; i-- {\n        num := nums[i]\n        // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        res[counter[num]-1] = num\n        // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n        counter[num]--\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    copy(nums, res)\n}\n
    counting_sort.swift
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunc countingSort(nums: inout [Int]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = nums.max()!\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0 ..< m {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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 // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num] -= 1 // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.js
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.ts
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfunction countingSort(nums: number[]): void {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = 0;\n    for (const num of nums) {\n        m = Math.max(m, num);\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (let i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.dart
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(List<int> nums) {\n  // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n  int m = 0;\n  for (int _num in nums) {\n    m = max(m, _num);\n  }\n  // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  // counter[_num] \u4ee3\u8868 _num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n  // \u5373 counter[_num]-1 \u662f _num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n  for (int i = 0; i < m; i++) {\n    counter[i + 1] += counter[i];\n  }\n  // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n  // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 _num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n    counter[_num]--; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e _num \u7684\u7d22\u5f15\n  }\n  // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n  nums.setAll(0, res);\n}\n
    counting_sort.rs
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfn counting_sort(nums: &mut [i32]) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    let m = *nums.into_iter().max().unwrap();\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    let mut counter = vec![0; m as usize + 1];\n    for &num in &*nums {\n        counter[num as usize] += 1;\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for i in 0..m as usize {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num as usize] -= 1; // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n
    counting_sort.c
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nvoid countingSort(int nums[], int size) {\n    // 1. \u7d71\u8a08\u9663\u5217\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. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\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\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (int i = 0; i < m; i++) {\n        counter[i + 1] += counter[i];\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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; // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]--;              // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    memcpy(nums, res, size * sizeof(int));\n    // 5. \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(counter);\n}\n
    counting_sort.kt
    /* \u8a08\u6578\u6392\u5e8f */\n// \u5b8c\u6574\u5be6\u73fe\uff0c\u53ef\u6392\u5e8f\u7269\u4ef6\uff0c\u4e26\u4e14\u662f\u7a69\u5b9a\u6392\u5e8f\nfun countingSort(nums: IntArray) {\n    // 1. \u7d71\u8a08\u9663\u5217\u6700\u5927\u5143\u7d20 m\n    var m = 0\n    for (num in nums) {\n        m = max(m, num)\n    }\n    // 2. \u7d71\u8a08\u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    // counter[num] \u4ee3\u8868 num \u7684\u51fa\u73fe\u6b21\u6578\n    val counter = IntArray(m + 1)\n    for (num in nums) {\n        counter[num]++\n    }\n    // 3. \u6c42 counter \u7684\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u6b21\u6578\u201d\u8f49\u63db\u70ba\u201c\u5c3e\u7d22\u5f15\u201d\n    // \u5373 counter[num]-1 \u662f num \u5728 res \u4e2d\u6700\u5f8c\u4e00\u6b21\u51fa\u73fe\u7684\u7d22\u5f15\n    for (i in 0..<m) {\n        counter[i + 1] += counter[i]\n    }\n    // 4. \u5012\u5e8f\u8d70\u8a2a nums \uff0c\u5c07\u5404\u5143\u7d20\u586b\u5165\u7d50\u679c\u9663\u5217 res\n    // \u521d\u59cb\u5316\u9663\u5217 res \u7528\u65bc\u8a18\u9304\u7d50\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 // \u5c07 num \u653e\u7f6e\u5230\u5c0d\u61c9\u7d22\u5f15\u8655\n        counter[num]-- // \u4ee4\u524d\u7db4\u548c\u81ea\u6e1b 1 \uff0c\u5f97\u5230\u4e0b\u6b21\u653e\u7f6e num \u7684\u7d22\u5f15\n    }\n    // \u4f7f\u7528\u7d50\u679c\u9663\u5217 res \u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n) {\n        nums[i] = res[i]\n    }\n}\n
    counting_sort.rb
    [class]{}-[func]{counting_sort}\n
    counting_sort.zig
    [class]{}-[func]{countingSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/counting_sort/#1193","title":"11.9.3 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\) \uff1a\u6d89\u53ca\u8d70\u8a2a nums \u548c\u8d70\u8a2a counter \uff0c\u90fd\u4f7f\u7528\u7dda\u6027\u6642\u9593\u3002\u4e00\u822c\u60c5\u6cc1\u4e0b \\(n \\gg m\\) \uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u65bc \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + m)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u85c9\u52a9\u4e86\u9577\u5ea6\u5206\u5225\u70ba \\(n\\) \u548c \\(m\\) \u7684\u9663\u5217 res \u548c counter \u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7531\u65bc\u5411 res \u4e2d\u586b\u5145\u5143\u7d20\u7684\u9806\u5e8f\u662f\u201c\u5f9e\u53f3\u5411\u5de6\u201d\u7684\uff0c\u56e0\u6b64\u5012\u5e8f\u8d70\u8a2a nums \u53ef\u4ee5\u907f\u514d\u6539\u8b8a\u76f8\u7b49\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5be6\u73fe\u7a69\u5b9a\u6392\u5e8f\u3002\u5be6\u969b\u4e0a\uff0c\u6b63\u5e8f\u8d70\u8a2a nums \u4e5f\u53ef\u4ee5\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\uff0c\u4f46\u7d50\u679c\u662f\u975e\u7a69\u5b9a\u7684\u3002
    "},{"location":"chapter_sorting/counting_sort/#1194","title":"11.9.4 \u00a0 \u4fb7\u9650\u6027","text":"

    \u770b\u5230\u9019\u88e1\uff0c\u4f60\u4e5f\u8a31\u6703\u89ba\u5f97\u8a08\u6578\u6392\u5e8f\u975e\u5e38\u5de7\u5999\uff0c\u50c5\u900f\u904e\u7d71\u8a08\u6578\u91cf\u5c31\u53ef\u4ee5\u5be6\u73fe\u9ad8\u6548\u7684\u6392\u5e8f\u3002\u7136\u800c\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u7684\u524d\u7f6e\u689d\u4ef6\u76f8\u5c0d\u8f03\u70ba\u56b4\u683c\u3002

    \u8a08\u6578\u6392\u5e8f\u53ea\u9069\u7528\u65bc\u975e\u8ca0\u6574\u6578\u3002\u82e5\u60f3\u5c07\u5176\u7528\u65bc\u5176\u4ed6\u578b\u5225\u7684\u8cc7\u6599\uff0c\u9700\u8981\u78ba\u4fdd\u9019\u4e9b\u8cc7\u6599\u53ef\u4ee5\u8f49\u63db\u70ba\u975e\u8ca0\u6574\u6578\uff0c\u4e26\u4e14\u5728\u8f49\u63db\u904e\u7a0b\u4e2d\u4e0d\u80fd\u6539\u8b8a\u5404\u500b\u5143\u7d20\u4e4b\u9593\u7684\u76f8\u5c0d\u5927\u5c0f\u95dc\u4fc2\u3002\u4f8b\u5982\uff0c\u5c0d\u65bc\u5305\u542b\u8ca0\u6578\u7684\u6574\u6578\u9663\u5217\uff0c\u53ef\u4ee5\u5148\u7d66\u6240\u6709\u6578\u5b57\u52a0\u4e0a\u4e00\u500b\u5e38\u6578\uff0c\u5c07\u5168\u90e8\u6578\u5b57\u8f49\u5316\u70ba\u6b63\u6578\uff0c\u6392\u5e8f\u5b8c\u6210\u5f8c\u518d\u8f49\u63db\u56de\u53bb\u3002

    \u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u6bd4\u5982\uff0c\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d \\(m\\) \u4e0d\u80fd\u592a\u5927\uff0c\u5426\u5247\u6703\u4f54\u7528\u904e\u591a\u7a7a\u9593\u3002\u800c\u7576 \\(n \\ll m\\) \u6642\uff0c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(m)\\) \u6642\u9593\uff0c\u53ef\u80fd\u6bd4 \\(O(n \\log n)\\) \u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u9084\u8981\u6162\u3002

    "},{"location":"chapter_sorting/heap_sort/","title":"11.7 \u00a0 \u5806\u7a4d\u6392\u5e8f","text":"

    Tip

    \u95b1\u8b80\u672c\u7bc0\u524d\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b78\u5b8c\u201c\u5806\u7a4d\u201c\u7ae0\u7bc0\u3002

    \u5806\u7a4d\u6392\u5e8f\uff08heap sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5806\u7a4d\u8cc7\u6599\u7d50\u69cb\u5be6\u73fe\u7684\u9ad8\u6548\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u6211\u5011\u53ef\u4ee5\u5229\u7528\u5df2\u7d93\u5b78\u904e\u7684\u201c\u5efa\u5806\u7a4d\u64cd\u4f5c\u201d\u548c\u201c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u201d\u5be6\u73fe\u5806\u7a4d\u6392\u5e8f\u3002

    1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5c0f\u9802\u5806\u7a4d\uff0c\u6b64\u6642\u6700\u5c0f\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
    2. \u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u7a4d\u64cd\u4f5c\uff0c\u4f9d\u6b21\u8a18\u9304\u51fa\u5806\u7a4d\u5143\u7d20\uff0c\u5373\u53ef\u5f97\u5230\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u7684\u5e8f\u5217\u3002

    \u4ee5\u4e0a\u65b9\u6cd5\u96d6\u7136\u53ef\u884c\uff0c\u4f46\u9700\u8981\u85c9\u52a9\u4e00\u500b\u984d\u5916\u9663\u5217\u4f86\u5132\u5b58\u5f48\u51fa\u7684\u5143\u7d20\uff0c\u6bd4\u8f03\u6d6a\u8cbb\u7a7a\u9593\u3002\u5728\u5be6\u969b\u4e2d\uff0c\u6211\u5011\u901a\u5e38\u4f7f\u7528\u4e00\u7a2e\u66f4\u52a0\u512a\u96c5\u7684\u5be6\u73fe\u65b9\u5f0f\u3002

    "},{"location":"chapter_sorting/heap_sort/#1171","title":"11.7.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u5806\u7a4d\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-12 \u6240\u793a\u3002

    1. \u8f38\u5165\u9663\u5217\u4e26\u5efa\u7acb\u5927\u9802\u5806\u7a4d\u3002\u5b8c\u6210\u5f8c\uff0c\u6700\u5927\u5143\u7d20\u4f4d\u65bc\u5806\u7a4d\u9802\u3002
    2. \u5c07\u5806\u7a4d\u9802\u5143\u7d20\uff08\u7b2c\u4e00\u500b\u5143\u7d20\uff09\u8207\u5806\u7a4d\u5e95\u5143\u7d20\uff08\u6700\u5f8c\u4e00\u500b\u5143\u7d20\uff09\u4ea4\u63db\u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u5806\u7a4d\u7684\u9577\u5ea6\u6e1b \\(1\\) \uff0c\u5df2\u6392\u5e8f\u5143\u7d20\u6578\u91cf\u52a0 \\(1\\) \u3002
    3. \u5f9e\u5806\u7a4d\u9802\u5143\u7d20\u958b\u59cb\uff0c\u5f9e\u9802\u5230\u5e95\u57f7\u884c\u5806\u7a4d\u5316\u64cd\u4f5c\uff08sift down\uff09\u3002\u5b8c\u6210\u5806\u7a4d\u5316\u5f8c\uff0c\u5806\u7a4d\u7684\u6027\u8cea\u5f97\u5230\u4fee\u5fa9\u3002
    4. \u8ff4\u5708\u57f7\u884c\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\u3002\u8ff4\u5708 \\(n - 1\\) \u8f2a\u5f8c\uff0c\u5373\u53ef\u5b8c\u6210\u9663\u5217\u6392\u5e8f\u3002

    Tip

    \u5be6\u969b\u4e0a\uff0c\u5143\u7d20\u51fa\u5806\u7a4d\u64cd\u4f5c\u4e2d\u4e5f\u5305\u542b\u7b2c 2. \u6b65\u548c\u7b2c 3. \u6b65\uff0c\u53ea\u662f\u591a\u4e86\u4e00\u500b\u5f48\u51fa\u5143\u7d20\u7684\u6b65\u9a5f\u3002

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

    \u5716 11-12 \u00a0 \u5806\u7a4d\u6392\u5e8f\u6b65\u9a5f

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u6211\u5011\u4f7f\u7528\u4e86\u8207\u201c\u5806\u7a4d\u201d\u7ae0\u7bc0\u76f8\u540c\u7684\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 sift_down() \u51fd\u5f0f\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u7531\u65bc\u5806\u7a4d\u7684\u9577\u5ea6\u6703\u96a8\u8457\u63d0\u53d6\u6700\u5927\u5143\u7d20\u800c\u6e1b\u5c0f\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u7d66 sift_down() \u51fd\u5f0f\u65b0\u589e\u4e00\u500b\u9577\u5ea6\u53c3\u6578 \\(n\\) \uff0c\u7528\u65bc\u6307\u5b9a\u5806\u7a4d\u7684\u7576\u524d\u6709\u6548\u9577\u5ea6\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig heap_sort.py
    def sift_down(nums: list[int], n: int, i: int):\n    \"\"\"\u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316\"\"\"\n    while True:\n        # \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i:\n            break\n        # \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums[i], nums[ma] = nums[ma], nums[i]\n        # \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n\ndef heap_sort(nums: list[int]):\n    \"\"\"\u5806\u7a4d\u6392\u5e8f\"\"\"\n    # \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in range(len(nums) // 2 - 1, -1, -1):\n        sift_down(nums, len(nums), i)\n    # \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in range(len(nums) - 1, 0, -1):\n        # \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums[0], nums[i] = nums[i], nums[0]\n        # \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0)\n
    heap_sort.cpp
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(vector<int> &nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        swap(nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(vector<int> &nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.size() / 2 - 1; i >= 0; --i) {\n        siftDown(nums, nums.size(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.size() - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        swap(nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.java
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.length / 2 - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.cs
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid SiftDown(int[] nums, int n, int i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i)\n            break;\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (nums[ma], nums[i]) = (nums[i], nums[ma]);\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid HeapSort(int[] nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = nums.Length / 2 - 1; i >= 0; i--) {\n        SiftDown(nums, nums.Length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = nums.Length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (nums[i], nums[0]) = (nums[0], nums[i]);\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        SiftDown(nums, i, 0);\n    }\n}\n
    heap_sort.go
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums *[]int, n, i int) {\n    for true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        (*nums)[i], (*nums)[ma] = (*nums)[ma], (*nums)[i]\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums *[]int) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i := len(*nums)/2 - 1; i >= 0; i-- {\n        siftDown(nums, len(*nums), i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i := len(*nums) - 1; i > 0; i-- {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        (*nums)[0], (*nums)[i] = (*nums)[i], (*nums)[0]\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.swift
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunc siftDown(nums: inout [Int], n: Int, i: Int) {\n    var i = i\n    while true {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        nums.swapAt(i, ma)\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunc heapSort(nums: inout [Int]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\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    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in nums.indices.dropFirst().reversed() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        nums.swapAt(0, i)\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums: &nums, n: i, i: 0)\n    }\n}\n
    heap_sort.js
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums, n, i) {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.ts
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfunction siftDown(nums: number[], n: number, i: number): void {\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma === i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        [nums[i], nums[ma]] = [nums[ma], nums[i]];\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfunction heapSort(nums: number[]): void {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (let i = Math.floor(nums.length / 2) - 1; i >= 0; i--) {\n        siftDown(nums, nums.length, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (let i = nums.length - 1; i > 0; i--) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        [nums[0], nums[i]] = [nums[i], nums[0]];\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.dart
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(List<int> nums, int n, int i) {\n  while (true) {\n    // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n    if (ma == i) break;\n    // \u4ea4\u63db\u5169\u7bc0\u9ede\n    int temp = nums[i];\n    nums[i] = nums[ma];\n    nums[ma] = temp;\n    // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n    i = ma;\n  }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(List<int> nums) {\n  // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n  for (int i = nums.length ~/ 2 - 1; i >= 0; i--) {\n    siftDown(nums, nums.length, i);\n  }\n  // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n  for (int i = nums.length - 1; i > 0; i--) {\n    // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n    int tmp = nums[0];\n    nums[0] = nums[i];\n    nums[i] = tmp;\n    // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n    siftDown(nums, i, 0);\n  }\n}\n
    heap_sort.rs
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfn sift_down(nums: &mut [i32], n: usize, mut i: usize) {\n    loop {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if ma == i {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        let temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfn heap_sort(nums: &mut [i32]) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for i in (0..=nums.len() / 2 - 1).rev() {\n        sift_down(nums, nums.len(), i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for i in (1..=nums.len() - 1).rev() {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        let tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        sift_down(nums, i, 0);\n    }\n}\n
    heap_sort.c
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nvoid siftDown(int nums[], int n, int i) {\n    while (1) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) {\n            break;\n        }\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        int temp = nums[i];\n        nums[i] = nums[ma];\n        nums[ma] = temp;\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma;\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nvoid heapSort(int nums[], int n) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (int i = n / 2 - 1; i >= 0; --i) {\n        siftDown(nums, n, i);\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (int i = n - 1; i > 0; --i) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        int tmp = nums[0];\n        nums[0] = nums[i];\n        nums[i] = tmp;\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0);\n    }\n}\n
    heap_sort.kt
    /* \u5806\u7a4d\u7684\u9577\u5ea6\u70ba n \uff0c\u5f9e\u7bc0\u9ede i \u958b\u59cb\uff0c\u5f9e\u9802\u81f3\u5e95\u5806\u7a4d\u5316 */\nfun siftDown(nums: IntArray, n: Int, li: Int) {\n    var i = li\n    while (true) {\n        // \u5224\u65b7\u7bc0\u9ede i, l, r \u4e2d\u503c\u6700\u5927\u7684\u7bc0\u9ede\uff0c\u8a18\u70ba 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\u7bc0\u9ede i \u6700\u5927\u6216\u7d22\u5f15 l, r \u8d8a\u754c\uff0c\u5247\u7121\u9808\u7e7c\u7e8c\u5806\u7a4d\u5316\uff0c\u8df3\u51fa\n        if (ma == i) \n            break\n        // \u4ea4\u63db\u5169\u7bc0\u9ede\n        val temp = nums[i]\n        nums[i] = nums[ma]\n        nums[ma] = temp\n        // \u8ff4\u5708\u5411\u4e0b\u5806\u7a4d\u5316\n        i = ma\n    }\n}\n\n/* \u5806\u7a4d\u6392\u5e8f */\nfun heapSort(nums: IntArray) {\n    // \u5efa\u5806\u7a4d\u64cd\u4f5c\uff1a\u5806\u7a4d\u5316\u9664\u8449\u7bc0\u9ede\u4ee5\u5916\u7684\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\n    for (i in nums.size / 2 - 1 downTo 0) {\n        siftDown(nums, nums.size, i)\n    }\n    // \u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\uff0c\u8ff4\u5708 n-1 \u8f2a\n    for (i in nums.size - 1 downTo 1) {\n        // \u4ea4\u63db\u6839\u7bc0\u9ede\u8207\u6700\u53f3\u8449\u7bc0\u9ede\uff08\u4ea4\u63db\u9996\u5143\u7d20\u8207\u5c3e\u5143\u7d20\uff09\n        val temp = nums[0]\n        nums[0] = nums[i]\n        nums[i] = temp\n        // \u4ee5\u6839\u7bc0\u9ede\u70ba\u8d77\u9ede\uff0c\u5f9e\u9802\u81f3\u5e95\u9032\u884c\u5806\u7a4d\u5316\n        siftDown(nums, i, 0)\n    }\n}\n
    heap_sort.rb
    [class]{}-[func]{sift_down}\n\n[class]{}-[func]{heap_sort}\n
    heap_sort.zig
    [class]{}-[func]{siftDown}\n\n[class]{}-[func]{heapSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/heap_sort/#1172","title":"11.7.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5efa\u5806\u7a4d\u64cd\u4f5c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002\u5f9e\u5806\u7a4d\u4e2d\u63d0\u53d6\u6700\u5927\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(\\log n)\\) \uff0c\u5171\u8ff4\u5708 \\(n - 1\\) \u8f2a\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5e7e\u500b\u6307\u6a19\u8b8a\u6578\u4f7f\u7528 \\(O(1)\\) \u7a7a\u9593\u3002\u5143\u7d20\u4ea4\u63db\u548c\u5806\u7a4d\u5316\u64cd\u4f5c\u90fd\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u4ea4\u63db\u5806\u7a4d\u9802\u5143\u7d20\u548c\u5806\u7a4d\u5e95\u5143\u7d20\u6642\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5c0d\u4f4d\u7f6e\u53ef\u80fd\u767c\u751f\u8b8a\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\u7a2e\u7c21\u55ae\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u8207\u624b\u52d5\u6574\u7406\u4e00\u526f\u724c\u7684\u904e\u7a0b\u975e\u5e38\u76f8\u4f3c\u3002

    \u5177\u9ad4\u4f86\u8aaa\uff0c\u6211\u5011\u5728\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u4e00\u500b\u57fa\u6e96\u5143\u7d20\uff0c\u5c07\u8a72\u5143\u7d20\u8207\u5176\u5de6\u5074\u5df2\u6392\u5e8f\u5340\u9593\u7684\u5143\u7d20\u9010\u4e00\u6bd4\u8f03\u5927\u5c0f\uff0c\u4e26\u5c07\u8a72\u5143\u7d20\u63d2\u5165\u5230\u6b63\u78ba\u7684\u4f4d\u7f6e\u3002

    \u5716 11-6 \u5c55\u793a\u4e86\u9663\u5217\u63d2\u5165\u5143\u7d20\u7684\u64cd\u4f5c\u6d41\u7a0b\u3002\u8a2d\u57fa\u6e96\u5143\u7d20\u70ba base \uff0c\u6211\u5011\u9700\u8981\u5c07\u5f9e\u76ee\u6a19\u7d22\u5f15\u5230 base \u4e4b\u9593\u7684\u6240\u6709\u5143\u7d20\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\uff0c\u7136\u5f8c\u5c07 base \u8ce6\u503c\u7d66\u76ee\u6a19\u7d22\u5f15\u3002

    \u5716 11-6 \u00a0 \u55ae\u6b21\u63d2\u5165\u64cd\u4f5c

    "},{"location":"chapter_sorting/insertion_sort/#1141","title":"11.4.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-7 \u6240\u793a\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u9663\u5217\u7684\u7b2c 1 \u500b\u5143\u7d20\u5df2\u5b8c\u6210\u6392\u5e8f\u3002
    2. \u9078\u53d6\u9663\u5217\u7684\u7b2c 2 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9078\u53d6\u7b2c 3 \u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u9663\u5217\u7684\u524d 3 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u985e\u63a8\uff0c\u5728\u6700\u5f8c\u4e00\u8f2a\u4e2d\uff0c\u9078\u53d6\u6700\u5f8c\u4e00\u500b\u5143\u7d20\u4f5c\u70ba base \uff0c\u5c07\u5176\u63d2\u5165\u5230\u6b63\u78ba\u4f4d\u7f6e\u5f8c\uff0c\u6240\u6709\u5143\u7d20\u5747\u5df2\u6392\u5e8f\u3002

    \u5716 11-7 \u00a0 \u63d2\u5165\u6392\u5e8f\u6d41\u7a0b

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig insertion_sort.py
    def insertion_sort(nums: list[int]):\n    \"\"\"\u63d2\u5165\u6392\u5e8f\"\"\"\n    # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in range(1, len(nums)):\n        base = nums[i]\n        j = i - 1\n        # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 and nums[j] > base:\n            nums[j + 1] = nums[j]  # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        nums[j + 1] = base  # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n
    insertion_sort.cpp
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(vector<int> &nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.size(); i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.java
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.length; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base;        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.cs
    /* \u63d2\u5165\u6392\u5e8f */\nvoid InsertionSort(int[] nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < nums.Length; i++) {\n        int bas = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > bas) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = bas;         // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.go
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums []int) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i := 1; i < len(nums); i++ {\n        base := nums[i]\n        j := i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        for j >= 0 && nums[j] > base {\n            nums[j+1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j+1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.swift
    /* \u63d2\u5165\u6392\u5e8f */\nfunc insertionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in nums.indices.dropFirst() {\n        let base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0, nums[j] > base {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1\n        }\n        nums[j + 1] = base // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.js
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        let base = nums[i],\n            j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.ts
    /* \u63d2\u5165\u6392\u5e8f */\nfunction insertionSort(nums: number[]): void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (let i = 1; i < nums.length; i++) {\n        const base = nums[i];\n        let j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--;\n        }\n        nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.dart
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(List<int> nums) {\n  // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for (int i = 1; i < nums.length; i++) {\n    int base = nums[i], j = i - 1;\n    // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while (j >= 0 && nums[j] > base) {\n      nums[j + 1] = nums[j]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j--;\n    }\n    nums[j + 1] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  }\n}\n
    insertion_sort.rs
    /* \u63d2\u5165\u6392\u5e8f */\nfn insertion_sort(nums: &mut [i32]) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for i in 1..nums.len() {\n        let (base, mut j) = (nums[i], (i - 1) as i32);\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while j >= 0 && nums[j as usize] > base {\n            nums[(j + 1) as usize] = nums[j as usize]; // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j -= 1;\n        }\n        nums[(j + 1) as usize] = base; // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.c
    /* \u63d2\u5165\u6392\u5e8f */\nvoid insertionSort(int nums[], int size) {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n    for (int i = 1; i < size; i++) {\n        int base = nums[i], j = i - 1;\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            nums[j + 1] = nums[j];\n            j--;\n        }\n        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n        nums[j + 1] = base;\n    }\n}\n
    insertion_sort.kt
    /* \u63d2\u5165\u6392\u5e8f */\nfun insertionSort(nums: IntArray) {\n    //\u5916\u8ff4\u5708: \u5df2\u6392\u5e8f\u5143\u7d20\u70ba 1, 2, ..., n\n    for (i in nums.indices) {\n        val base = nums[i]\n        var j = i - 1\n        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 0 && nums[j] > base) {\n            nums[j + 1] = nums[j] // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n            j--\n        }\n        nums[j + 1] = base        // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    insertion_sort.rb
    ### \u63d2\u5165\u6392\u5e8f ###\ndef insertion_sort(nums)\n  n = nums.length\n  # \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [0, i-1]\n  for i in 1...n\n    base = nums[i]\n    j = i - 1\n    # \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n    while j >= 0 && nums[j] > base\n      nums[j + 1] = nums[j] # \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n      j -= 1\n    end\n    nums[j + 1] = base # \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n  end\nend\n
    insertion_sort.zig
    // \u63d2\u5165\u6392\u5e8f\nfn insertionSort(nums: []i32) void {\n    // \u5916\u8ff4\u5708\uff1a\u5df2\u6392\u5e8f\u5340\u9593\u70ba [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        // \u5167\u8ff4\u5708\uff1a\u5c07 base \u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593 [0, i-1] \u4e2d\u7684\u6b63\u78ba\u4f4d\u7f6e\n        while (j >= 1 and nums[j - 1] > base) : (j -= 1) {\n            nums[j] = nums[j - 1];  // \u5c07 nums[j] \u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n        }\n        nums[j] = base;             // \u5c07 base \u8ce6\u503c\u5230\u6b63\u78ba\u4f4d\u7f6e\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/insertion_sort/#1142","title":"11.4.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u6b21\u63d2\u5165\u64cd\u4f5c\u5206\u5225\u9700\u8981\u8ff4\u5708 \\(n - 1\\)\u3001\\(n-2\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \u6b21\uff0c\u6c42\u548c\u5f97\u5230 \\((n - 1) n / 2\\) \uff0c\u56e0\u6b64\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002\u5728\u9047\u5230\u6709\u5e8f\u8cc7\u6599\u6642\uff0c\u63d2\u5165\u64cd\u4f5c\u6703\u63d0\u524d\u7d42\u6b62\u3002\u7576\u8f38\u5165\u9663\u5217\u5b8c\u5168\u6709\u5e8f\u6642\uff0c\u63d2\u5165\u6392\u5e8f\u9054\u5230\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u63d2\u5165\u64cd\u4f5c\u904e\u7a0b\u4e2d\uff0c\u6211\u5011\u6703\u5c07\u5143\u7d20\u63d2\u5165\u5230\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\uff0c\u4e0d\u6703\u6539\u8b8a\u5b83\u5011\u7684\u9806\u5e8f\u3002
    "},{"location":"chapter_sorting/insertion_sort/#1143","title":"11.4.3 \u00a0 \u63d2\u5165\u6392\u5e8f\u7684\u512a\u52e2","text":"

    \u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u800c\u6211\u5011\u5373\u5c07\u5b78\u7fd2\u7684\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u5118\u7ba1\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u66f4\u9ad8\uff0c\u4f46\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u7684\u60c5\u6cc1\u4e0b\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u66f4\u5feb\u3002

    \u9019\u500b\u7d50\u8ad6\u8207\u7dda\u6027\u67e5\u8a62\u548c\u4e8c\u5206\u641c\u5c0b\u7684\u9069\u7528\u60c5\u6cc1\u7684\u7d50\u8ad6\u985e\u4f3c\u3002\u5feb\u901f\u6392\u5e8f\u9019\u985e \\(O(n \\log n)\\) \u7684\u6f14\u7b97\u6cd5\u5c6c\u65bc\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5f80\u5f80\u5305\u542b\u66f4\u591a\u55ae\u5143\u8a08\u7b97\u64cd\u4f5c\u3002\u800c\u5728\u8cc7\u6599\u91cf\u8f03\u5c0f\u6642\uff0c\\(n^2\\) \u548c \\(n \\log n\\) \u7684\u6578\u503c\u6bd4\u8f03\u63a5\u8fd1\uff0c\u8907\u96dc\u5ea6\u4e0d\u4f54\u4e3b\u5c0e\u5730\u4f4d\uff0c\u6bcf\u8f2a\u4e2d\u7684\u55ae\u5143\u64cd\u4f5c\u6578\u91cf\u8d77\u5230\u6c7a\u5b9a\u6027\u4f5c\u7528\u3002

    \u5be6\u969b\u4e0a\uff0c\u8a31\u591a\u7a0b\u5f0f\u8a9e\u8a00\uff08\u4f8b\u5982 Java\uff09\u7684\u5167\u5efa\u6392\u5e8f\u51fd\u5f0f\u63a1\u7528\u4e86\u63d2\u5165\u6392\u5e8f\uff0c\u5927\u81f4\u601d\u8def\u70ba\uff1a\u5c0d\u65bc\u9577\u9663\u5217\uff0c\u63a1\u7528\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4f8b\u5982\u5feb\u901f\u6392\u5e8f\uff1b\u5c0d\u65bc\u77ed\u9663\u5217\uff0c\u76f4\u63a5\u4f7f\u7528\u63d2\u5165\u6392\u5e8f\u3002

    \u96d6\u7136\u6ce1\u6cab\u6392\u5e8f\u3001\u9078\u64c7\u6392\u5e8f\u548c\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \uff0c\u4f46\u5728\u5be6\u969b\u60c5\u6cc1\u4e2d\uff0c\u63d2\u5165\u6392\u5e8f\u7684\u4f7f\u7528\u983b\u7387\u986f\u8457\u9ad8\u65bc\u6ce1\u6cab\u6392\u5e8f\u548c\u9078\u64c7\u6392\u5e8f\uff0c\u4e3b\u8981\u6709\u4ee5\u4e0b\u539f\u56e0\u3002

    • \u6ce1\u6cab\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u4ea4\u63db\u5be6\u73fe\uff0c\u9700\u8981\u85c9\u52a9\u4e00\u500b\u81e8\u6642\u8b8a\u6578\uff0c\u5171\u6d89\u53ca 3 \u500b\u55ae\u5143\u64cd\u4f5c\uff1b\u63d2\u5165\u6392\u5e8f\u57fa\u65bc\u5143\u7d20\u8ce6\u503c\u5be6\u73fe\uff0c\u50c5\u9700 1 \u500b\u55ae\u5143\u64cd\u4f5c\u3002\u56e0\u6b64\uff0c\u6ce1\u6cab\u6392\u5e8f\u7684\u8a08\u7b97\u958b\u92b7\u901a\u5e38\u6bd4\u63d2\u5165\u6392\u5e8f\u66f4\u9ad8\u3002
    • \u9078\u64c7\u6392\u5e8f\u5728\u4efb\u4f55\u60c5\u6cc1\u4e0b\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(n^2)\\) \u3002\u5982\u679c\u7d66\u5b9a\u4e00\u7d44\u90e8\u5206\u6709\u5e8f\u7684\u8cc7\u6599\uff0c\u63d2\u5165\u6392\u5e8f\u901a\u5e38\u6bd4\u9078\u64c7\u6392\u5e8f\u6548\u7387\u66f4\u9ad8\u3002
    • \u9078\u64c7\u6392\u5e8f\u4e0d\u7a69\u5b9a\uff0c\u7121\u6cd5\u61c9\u7528\u65bc\u591a\u7d1a\u6392\u5e8f\u3002
    "},{"location":"chapter_sorting/merge_sort/","title":"11.6 \u00a0 \u5408\u4f75\u6392\u5e8f","text":"

    \u5408\u4f75\u6392\u5e8f\uff08merge sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5305\u542b\u5716 11-10 \u6240\u793a\u7684\u201c\u5283\u5206\u201d\u548c\u201c\u5408\u4f75\u201d\u968e\u6bb5\u3002

    1. \u5283\u5206\u968e\u6bb5\uff1a\u900f\u904e\u905e\u8ff4\u4e0d\u65b7\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u8655\u5206\u958b\uff0c\u5c07\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u8f49\u63db\u70ba\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002
    2. \u5408\u4f75\u968e\u6bb5\uff1a\u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u5283\u5206\uff0c\u958b\u59cb\u5408\u4f75\uff0c\u6301\u7e8c\u5730\u5c07\u5de6\u53f3\u5169\u500b\u8f03\u77ed\u7684\u6709\u5e8f\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u8f03\u9577\u7684\u6709\u5e8f\u9663\u5217\uff0c\u76f4\u81f3\u7d50\u675f\u3002

    \u5716 11-10 \u00a0 \u5408\u4f75\u6392\u5e8f\u7684\u5283\u5206\u8207\u5408\u4f75\u968e\u6bb5

    "},{"location":"chapter_sorting/merge_sort/#1161","title":"11.6.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5982\u5716 11-11 \u6240\u793a\uff0c\u201c\u5283\u5206\u968e\u6bb5\u201d\u5f9e\u9802\u81f3\u5e95\u905e\u8ff4\u5730\u5c07\u9663\u5217\u5f9e\u4e2d\u9ede\u5207\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002

    1. \u8a08\u7b97\u9663\u5217\u4e2d\u9ede mid \uff0c\u905e\u8ff4\u5283\u5206\u5de6\u5b50\u9663\u5217\uff08\u5340\u9593 [left, mid] \uff09\u548c\u53f3\u5b50\u9663\u5217\uff08\u5340\u9593 [mid + 1, right] \uff09\u3002
    2. \u905e\u8ff4\u57f7\u884c\u6b65\u9a5f 1. \uff0c\u76f4\u81f3\u5b50\u9663\u5217\u5340\u9593\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u3002

    \u201c\u5408\u4f75\u968e\u6bb5\u201d\u5f9e\u5e95\u81f3\u9802\u5730\u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5408\u4f75\u70ba\u4e00\u500b\u6709\u5e8f\u9663\u5217\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5f9e\u9577\u5ea6\u70ba 1 \u7684\u5b50\u9663\u5217\u958b\u59cb\u5408\u4f75\uff0c\u5408\u4f75\u968e\u6bb5\u4e2d\u7684\u6bcf\u500b\u5b50\u9663\u5217\u90fd\u662f\u6709\u5e8f\u7684\u3002

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

    \u5716 11-11 \u00a0 \u5408\u4f75\u6392\u5e8f\u6b65\u9a5f

    \u89c0\u5bdf\u767c\u73fe\uff0c\u5408\u4f75\u6392\u5e8f\u8207\u4e8c\u5143\u6a39\u5f8c\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u9806\u5e8f\u662f\u4e00\u81f4\u7684\u3002

    • \u5f8c\u5e8f\u8d70\u8a2a\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u6a39\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u6a39\uff0c\u6700\u5f8c\u8655\u7406\u6839\u7bc0\u9ede\u3002
    • \u5408\u4f75\u6392\u5e8f\uff1a\u5148\u905e\u8ff4\u5de6\u5b50\u9663\u5217\uff0c\u518d\u905e\u8ff4\u53f3\u5b50\u9663\u5217\uff0c\u6700\u5f8c\u8655\u7406\u5408\u4f75\u3002

    \u5408\u4f75\u6392\u5e8f\u7684\u5be6\u73fe\u5982\u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u6240\u793a\u3002\u8acb\u6ce8\u610f\uff0cnums \u7684\u5f85\u5408\u4f75\u5340\u9593\u70ba [left, right] \uff0c\u800c tmp \u7684\u5c0d\u61c9\u5340\u9593\u70ba [0, right - left] \u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig merge_sort.py
    def merge(nums: list[int], left: int, mid: int, right: int):\n    \"\"\"\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\"\"\"\n    # \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    # \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp = [0] * (right - left + 1)\n    # \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k = left, mid + 1, 0\n    # \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    # \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    # \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\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    \"\"\"\u5408\u4f75\u6392\u5e8f\"\"\"\n    # \u7d42\u6b62\u689d\u4ef6\n    if left >= right:\n        return  # \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    # \u5283\u5206\u968e\u6bb5\n    mid = (left + right) // 2  # \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid)  # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right)  # \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    # \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n
    merge_sort.cpp
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(vector<int> &nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    vector<int> tmp(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.size(); k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(vector<int> &nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.java
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.cs
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid Merge(int[] nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int[] tmp = new int[right - left + 1];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.Length; ++k) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid MergeSort(int[] nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;       // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    MergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    MergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    Merge(nums, left, mid, right);\n}\n
    merge_sort.go
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums []int, left, mid, right int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    tmp := make([]int, right-left+1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    i, j, k := left, mid+1, 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k := 0; k < len(tmp); k++ {\n        nums[left+k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums []int, left, right int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    mid := (left + right) / 2\n    mergeSort(nums, left, mid)\n    mergeSort(nums, mid+1, right)\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.swift
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunc merge(nums: inout [Int], left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    var tmp = Array(repeating: 0, count: right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left, j = mid + 1, k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in tmp.indices {\n        nums[left + k] = tmp[k]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunc mergeSort(nums: inout [Int], left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right { // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n        return\n    }\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums: &nums, left: left, right: mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums: &nums, left: mid + 1, right: right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums: &nums, left: left, mid: mid, right: right)\n}\n
    merge_sort.js
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums, left, mid, right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums, left, right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.ts
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfunction merge(nums: number[], left: number, mid: number, right: number): void {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    const tmp = new Array(right - left + 1);\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let i = left,\n        j = mid + 1,\n        k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmp.length; k++) {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfunction mergeSort(nums: number[], left: number, right: number): void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    let mid = Math.floor((left + right) / 2); // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.dart
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(List<int> nums, int left, int mid, int right) {\n  // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n  // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n  List<int> tmp = List.filled(right - left + 1, 0);\n  // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n  int i = left, j = mid + 1, k = 0;\n  // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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  // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n  while (i <= mid) {\n    tmp[k++] = nums[i++];\n  }\n  while (j <= right) {\n    tmp[k++] = nums[j++];\n  }\n  // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n  for (k = 0; k < tmp.length; k++) {\n    nums[left + k] = tmp[k];\n  }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(List<int> nums, int left, int right) {\n  // \u7d42\u6b62\u689d\u4ef6\n  if (left >= right) return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  // \u5283\u5206\u968e\u6bb5\n  int mid = (left + right) ~/ 2; // \u8a08\u7b97\u4e2d\u9ede\n  mergeSort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n  mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n  // \u5408\u4f75\u968e\u6bb5\n  merge(nums, left, mid, right);\n}\n
    merge_sort.rs
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfn merge(nums: &mut [i32], left: usize, mid: usize, right: usize) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    let tmp_size = right - left + 1;\n    let mut tmp = vec![0; tmp_size];\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    let (mut i, mut j, mut k) = (left, mid + 1, 0);\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for k in 0..tmp_size {\n        nums[left + k] = tmp[k];\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfn merge_sort(nums: &mut [i32], left: usize, right: usize) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if left >= right {\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    }\n\n    // \u5283\u5206\u968e\u6bb5\n    let mid = (left + right) / 2; // \u8a08\u7b97\u4e2d\u9ede\n    merge_sort(nums, left, mid); // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    merge_sort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.c
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nvoid merge(int *nums, int left, int mid, int right) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    int tmpSize = right - left + 1;\n    int *tmp = (int *)malloc(tmpSize * sizeof(int));\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    int i = left, j = mid + 1, k = 0;\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++];\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++];\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (k = 0; k < tmpSize; ++k) {\n        nums[left + k] = tmp[k];\n    }\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nvoid mergeSort(int *nums, int left, int right) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right)\n        return; // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    int mid = (left + right) / 2;    // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid);      // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right); // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right);\n}\n
    merge_sort.kt
    /* \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217 */\nfun merge(nums: IntArray, left: Int, mid: Int, right: Int) {\n    // \u5de6\u5b50\u9663\u5217\u5340\u9593\u70ba [left, mid], \u53f3\u5b50\u9663\u5217\u5340\u9593\u70ba [mid+1, right]\n    // \u5efa\u7acb\u4e00\u500b\u81e8\u6642\u9663\u5217 tmp \uff0c\u7528\u65bc\u5b58\u653e\u5408\u4f75\u5f8c\u7684\u7d50\u679c\n    val tmp = IntArray(right - left + 1)\n    // \u521d\u59cb\u5316\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\n    var i = left\n    var j = mid + 1\n    var k = 0\n    // \u7576\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u9084\u6709\u5143\u7d20\u6642\uff0c\u9032\u884c\u6bd4\u8f03\u4e26\u5c07\u8f03\u5c0f\u7684\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\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    // \u5c07\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u7684\u5269\u9918\u5143\u7d20\u8907\u88fd\u5230\u81e8\u6642\u9663\u5217\u4e2d\n    while (i <= mid) {\n        tmp[k++] = nums[i++]\n    }\n    while (j <= right) {\n        tmp[k++] = nums[j++]\n    }\n    // \u5c07\u81e8\u6642\u9663\u5217 tmp \u4e2d\u7684\u5143\u7d20\u8907\u88fd\u56de\u539f\u9663\u5217 nums \u7684\u5c0d\u61c9\u5340\u9593\n    for (l in tmp.indices) {\n        nums[left + l] = tmp[l]\n    }\n}\n\n/* \u5408\u4f75\u6392\u5e8f */\nfun mergeSort(nums: IntArray, left: Int, right: Int) {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return  // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    val mid = (left + right) / 2 // \u8a08\u7b97\u4e2d\u9ede\n    mergeSort(nums, left, mid) // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    mergeSort(nums, mid + 1, right) // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    merge(nums, left, mid, right)\n}\n
    merge_sort.rb
    [class]{}-[func]{merge}\n\n[class]{}-[func]{merge_sort}\n
    merge_sort.zig
    // \u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n// \u5de6\u5b50\u9663\u5217\u5340\u9593 [left, mid]\n// \u53f3\u5b50\u9663\u5217\u5340\u9593 [mid + 1, right]\nfn merge(nums: []i32, left: usize, mid: usize, right: usize) !void {\n    // \u521d\u59cb\u5316\u8f14\u52a9\u9663\u5217\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\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15  \n    var leftStart = left - left;\n    var leftEnd = mid - left;\n    // \u53f3\u5b50\u9663\u5217\u7684\u8d77\u59cb\u7d22\u5f15\u548c\u7d50\u675f\u7d22\u5f15       \n    var rightStart = mid + 1 - left;\n    var rightEnd = right - left;\n    // i, j \u5206\u5225\u6307\u5411\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\u7684\u9996\u5143\u7d20\n    var i = leftStart;\n    var j = rightStart;\n    // \u900f\u904e\u8986\u84cb\u539f\u9663\u5217 nums \u4f86\u5408\u4f75\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\n    var k = left;\n    while (k <= right) : (k += 1) {\n        // \u82e5\u201c\u5de6\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        if (i > leftEnd) {\n            nums[k] = tmp[j];\n            j += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u53f3\u5b50\u9663\u5217\u5df2\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u6216\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 <= \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u5de6\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 i++\n        } else if  (j > rightEnd or tmp[i] <= tmp[j]) {\n            nums[k] = tmp[i];\n            i += 1;\n        // \u5426\u5247\uff0c\u82e5\u201c\u5de6\u53f3\u5b50\u9663\u5217\u90fd\u672a\u5168\u90e8\u5408\u4f75\u5b8c\u201d\u4e14\u201c\u5de6\u5b50\u9663\u5217\u5143\u7d20 > \u53f3\u5b50\u9663\u5217\u5143\u7d20\u201d\uff0c\u5247\u9078\u53d6\u53f3\u5b50\u9663\u5217\u5143\u7d20\uff0c\u4e26\u4e14 j++\n        } else {\n            nums[k] = tmp[j];\n            j += 1;\n        }\n    }\n}\n\n// \u5408\u4f75\u6392\u5e8f\nfn mergeSort(nums: []i32, left: usize, right: usize) !void {\n    // \u7d42\u6b62\u689d\u4ef6\n    if (left >= right) return;              // \u7576\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    // \u5283\u5206\u968e\u6bb5\n    var mid = (left + right) / 2;           // \u8a08\u7b97\u4e2d\u9ede\n    try mergeSort(nums, left, mid);         // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\n    try mergeSort(nums, mid + 1, right);    // \u905e\u8ff4\u53f3\u5b50\u9663\u5217\n    // \u5408\u4f75\u968e\u6bb5\n    try merge(nums, left, mid, right);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/merge_sort/#1162","title":"11.6.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5283\u5206\u7522\u751f\u9ad8\u5ea6\u70ba \\(\\log n\\) \u7684\u905e\u8ff4\u6a39\uff0c\u6bcf\u5c64\u5408\u4f75\u7684\u7e3d\u64cd\u4f5c\u6578\u91cf\u70ba \\(n\\) \uff0c\u56e0\u6b64\u7e3d\u9ad4\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u905e\u8ff4\u6df1\u5ea6\u70ba \\(\\log n\\) \uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002\u5408\u4f75\u64cd\u4f5c\u9700\u8981\u85c9\u52a9\u8f14\u52a9\u9663\u5217\u5be6\u73fe\uff0c\u4f7f\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u5408\u4f75\u904e\u7a0b\u4e2d\uff0c\u76f8\u7b49\u5143\u7d20\u7684\u6b21\u5e8f\u4fdd\u6301\u4e0d\u8b8a\u3002
    "},{"location":"chapter_sorting/merge_sort/#1163","title":"11.6.3 \u00a0 \u93c8\u7d50\u4e32\u5217\u6392\u5e8f","text":"

    \u5c0d\u65bc\u93c8\u7d50\u4e32\u5217\uff0c\u5408\u4f75\u6392\u5e8f\u76f8\u8f03\u65bc\u5176\u4ed6\u6392\u5e8f\u6f14\u7b97\u6cd5\u5177\u6709\u986f\u8457\u512a\u52e2\uff0c\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u6392\u5e8f\u4efb\u52d9\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002

    • \u5283\u5206\u968e\u6bb5\uff1a\u53ef\u4ee5\u4f7f\u7528\u201c\u8fed\u4ee3\u201d\u66ff\u4ee3\u201c\u905e\u8ff4\u201d\u4f86\u5be6\u73fe\u93c8\u7d50\u4e32\u5217\u5283\u5206\u5de5\u4f5c\uff0c\u5f9e\u800c\u7701\u53bb\u905e\u8ff4\u4f7f\u7528\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002
    • \u5408\u4f75\u968e\u6bb5\uff1a\u5728\u93c8\u7d50\u4e32\u5217\u4e2d\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u50c5\u9700\u6539\u8b8a\u5f15\u7528\uff08\u6307\u6a19\uff09\u5373\u53ef\u5be6\u73fe\uff0c\u56e0\u6b64\u5408\u4f75\u968e\u6bb5\uff08\u5c07\u5169\u500b\u77ed\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\u5408\u4f75\u70ba\u4e00\u500b\u9577\u6709\u5e8f\u93c8\u7d50\u4e32\u5217\uff09\u7121\u9808\u5efa\u7acb\u984d\u5916\u93c8\u7d50\u4e32\u5217\u3002

    \u5177\u9ad4\u5be6\u73fe\u7d30\u7bc0\u6bd4\u8f03\u8907\u96dc\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u67e5\u95b1\u76f8\u95dc\u8cc7\u6599\u9032\u884c\u5b78\u7fd2\u3002

    "},{"location":"chapter_sorting/quick_sort/","title":"11.5 \u00a0 \u5feb\u901f\u6392\u5e8f","text":"

    \u5feb\u901f\u6392\u5e8f\uff08quick sort\uff09\u662f\u4e00\u7a2e\u57fa\u65bc\u5206\u6cbb\u7b56\u7565\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u57f7\u884c\u9ad8\u6548\uff0c\u61c9\u7528\u5ee3\u6cdb\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u6838\u5fc3\u64cd\u4f5c\u662f\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5176\u76ee\u6a19\u662f\uff1a\u9078\u64c7\u9663\u5217\u4e2d\u7684\u67d0\u500b\u5143\u7d20\u4f5c\u70ba\u201c\u57fa\u6e96\u6578\u201d\uff0c\u5c07\u6240\u6709\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u5de6\u5074\uff0c\u800c\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\u79fb\u5230\u5176\u53f3\u5074\u3002\u5177\u9ad4\u4f86\u8aaa\uff0c\u54e8\u5175\u5283\u5206\u7684\u6d41\u7a0b\u5982\u5716 11-8 \u6240\u793a\u3002

    1. \u9078\u53d6\u9663\u5217\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u521d\u59cb\u5316\u5169\u500b\u6307\u6a19 i \u548c j \u5206\u5225\u6307\u5411\u9663\u5217\u7684\u5169\u7aef\u3002
    2. \u8a2d\u5b9a\u4e00\u500b\u8ff4\u5708\uff0c\u5728\u6bcf\u8f2a\u4e2d\u4f7f\u7528 i\uff08j\uff09\u5206\u5225\u5c0b\u627e\u7b2c\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u5927\uff08\u5c0f\uff09\u7684\u5143\u7d20\uff0c\u7136\u5f8c\u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\u3002
    3. \u8ff4\u5708\u57f7\u884c\u6b65\u9a5f 2. \uff0c\u76f4\u5230 i \u548c j \u76f8\u9047\u6642\u505c\u6b62\uff0c\u6700\u5f8c\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u500b\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\u3002
    <1><2><3><4><5><6><7><8><9>

    \u5716 11-8 \u00a0 \u54e8\u5175\u5283\u5206\u6b65\u9a5f

    \u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u539f\u9663\u5217\u88ab\u5283\u5206\u6210\u4e09\u90e8\u5206\uff1a\u5de6\u5b50\u9663\u5217\u3001\u57fa\u6e96\u6578\u3001\u53f3\u5b50\u9663\u5217\uff0c\u4e14\u6eff\u8db3\u201c\u5de6\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20 \\(\\leq\\) \u57fa\u6e96\u6578 \\(\\leq\\) \u53f3\u5b50\u9663\u5217\u4efb\u610f\u5143\u7d20\u201d\u3002\u56e0\u6b64\uff0c\u6211\u5011\u63a5\u4e0b\u4f86\u53ea\u9700\u5c0d\u9019\u5169\u500b\u5b50\u9663\u5217\u9032\u884c\u6392\u5e8f\u3002

    \u5feb\u901f\u6392\u5e8f\u7684\u5206\u6cbb\u7b56\u7565

    \u54e8\u5175\u5283\u5206\u7684\u5be6\u8cea\u662f\u5c07\u4e00\u500b\u8f03\u9577\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u7c21\u5316\u70ba\u5169\u500b\u8f03\u77ed\u9663\u5217\u7684\u6392\u5e8f\u554f\u984c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u5143\u7d20\u4ea4\u63db */\nvoid Swap(int[] nums, int i, int j) {\n    (nums[j], nums[i]) = (nums[i], nums[j]);\n}\n\n/* \u54e8\u5175\u5283\u5206 */\nint Partition(int[] nums, int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u54e8\u5175\u5283\u5206 */\nfunc (q *quickSort) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u54e8\u5175\u5283\u5206 */\nfunc partition(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while i < j {\n        while i < j, nums[j] >= nums[left] {\n            j -= 1 // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j, nums[i] <= nums[left] {\n            i += 1 // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swapAt(i, j) // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swapAt(i, left) // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.js
    /* \u5143\u7d20\u4ea4\u63db */\nswap(nums, i, j) {\n    let tmp = nums[i];\n    nums[i] = nums[j];\n    nums[j] = tmp;\n}\n\n/* \u54e8\u5175\u5283\u5206 */\npartition(nums, left, right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\npartition(nums: number[], left: number, right: number): number {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u5143\u7d20\u4ea4\u63db\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint _partition(List<int> nums, int left, int right) {\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u54e8\u5175\u5283\u5206 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nint partition(int nums[], int left, int right) {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n        swap(nums, i, j);\n    }\n    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    swap(nums, i, left);\n    // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n    return i;\n}\n
    quick_sort.kt
    /* \u5143\u7d20\u4ea4\u63db */\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\u5283\u5206 */\nfun partition(nums: IntArray, left: Int, right: Int): Int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--           // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++           // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)  // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)   // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i              // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    [class]{QuickSort}-[func]{partition}\n
    quick_sort.zig
    // \u5143\u7d20\u4ea4\u63db\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\u5283\u5206\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1151","title":"11.5.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u5feb\u901f\u6392\u5e8f\u7684\u6574\u9ad4\u6d41\u7a0b\u5982\u5716 11-9 \u6240\u793a\u3002

    1. \u9996\u5148\uff0c\u5c0d\u539f\u9663\u5217\u57f7\u884c\u4e00\u6b21\u201c\u54e8\u5175\u5283\u5206\u201d\uff0c\u5f97\u5230\u672a\u6392\u5e8f\u7684\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u3002
    2. \u7136\u5f8c\uff0c\u5c0d\u5de6\u5b50\u9663\u5217\u548c\u53f3\u5b50\u9663\u5217\u5206\u5225\u905e\u8ff4\u57f7\u884c\u201c\u54e8\u5175\u5283\u5206\u201d\u3002
    3. \u6301\u7e8c\u905e\u8ff4\uff0c\u76f4\u81f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\uff0c\u5f9e\u800c\u5b8c\u6210\u6574\u500b\u9663\u5217\u7684\u6392\u5e8f\u3002

    \u5716 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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right:\n        return\n    # \u54e8\u5175\u5283\u5206\n    pivot = self.partition(nums, left, right)\n    # \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right)\n        return;\n    // \u54e8\u5175\u5283\u5206\n    int pivot = Partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    pivot := q.partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = partition(nums: &nums, left: left, right: right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    const pivot = this.partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n  if (left >= right) return;\n  // \u54e8\u5175\u5283\u5206\n  int pivot = _partition(nums, left, right);\n  // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if left >= right {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) {\n        return;\n    }\n    // \u54e8\u5175\u5283\u5206\n    int pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\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\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return\n    // \u54e8\u5175\u5283\u5206\n    val pivot = partition(nums, left, right)\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1)\n    quickSort(nums, pivot + 1, right)\n}\n
    quick_sort.rb
    [class]{QuickSort}-[func]{quick_sort}\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\nfn quickSort(nums: []i32, left: usize, right: usize) void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    if (left >= right) return;\n    // \u54e8\u5175\u5283\u5206\n    var pivot = partition(nums, left, right);\n    // \u905e\u8ff4\u5de6\u5b50\u9663\u5217\u3001\u53f3\u5b50\u9663\u5217\n    quickSort(nums, left, pivot - 1);\n    quickSort(nums, pivot + 1, right);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1152","title":"11.5.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\)\u3001\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5728\u5e73\u5747\u60c5\u6cc1\u4e0b\uff0c\u54e8\u5175\u5283\u5206\u7684\u905e\u8ff4\u5c64\u6578\u70ba \\(\\log n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u7e3d\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n \\log n)\\) \u6642\u9593\u3002\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u9577\u5ea6\u70ba \\(n\\) \u7684\u9663\u5217\u5283\u5206\u70ba\u9577\u5ea6\u70ba \\(0\\) \u548c \\(n - 1\\) \u7684\u5169\u500b\u5b50\u9663\u5217\uff0c\u6b64\u6642\u905e\u8ff4\u5c64\u6578\u9054\u5230 \\(n\\) \uff0c\u6bcf\u5c64\u4e2d\u7684\u8ff4\u5708\u6578\u70ba \\(n\\) \uff0c\u7e3d\u9ad4\u4f7f\u7528 \\(O(n^2)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u5728\u8f38\u5165\u9663\u5217\u5b8c\u5168\u5012\u5e8f\u7684\u60c5\u6cc1\u4e0b\uff0c\u9054\u5230\u6700\u5dee\u905e\u8ff4\u6df1\u5ea6 \\(n\\) \uff0c\u4f7f\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002\u6392\u5e8f\u64cd\u4f5c\u662f\u5728\u539f\u9663\u5217\u4e0a\u9032\u884c\u7684\uff0c\u672a\u85c9\u52a9\u984d\u5916\u9663\u5217\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5728\u54e8\u5175\u5283\u5206\u7684\u6700\u5f8c\u4e00\u6b65\uff0c\u57fa\u6e96\u6578\u53ef\u80fd\u6703\u88ab\u4ea4\u63db\u81f3\u76f8\u7b49\u5143\u7d20\u7684\u53f3\u5074\u3002
    "},{"location":"chapter_sorting/quick_sort/#1153","title":"11.5.3 \u00a0 \u5feb\u901f\u6392\u5e8f\u70ba\u4ec0\u9ebc\u5feb","text":"

    \u5f9e\u540d\u7a31\u4e0a\u5c31\u80fd\u770b\u51fa\uff0c\u5feb\u901f\u6392\u5e8f\u5728\u6548\u7387\u65b9\u9762\u61c9\u8a72\u5177\u6709\u4e00\u5b9a\u7684\u512a\u52e2\u3002\u5118\u7ba1\u5feb\u901f\u6392\u5e8f\u7684\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u8207\u201c\u5408\u4f75\u6392\u5e8f\u201d\u548c\u201c\u5806\u7a4d\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\u73fe\u6700\u5dee\u60c5\u6cc1\u7684\u6a5f\u7387\u5f88\u4f4e\uff1a\u96d6\u7136\u5feb\u901f\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u6c92\u6709\u5408\u4f75\u6392\u5e8f\u7a69\u5b9a\uff0c\u4f46\u5728\u7d55\u5927\u591a\u6578\u60c5\u6cc1\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u80fd\u5728 \\(O(n \\log n)\\) \u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e0b\u57f7\u884c\u3002
    • \u5feb\u53d6\u4f7f\u7528\u6548\u7387\u9ad8\uff1a\u5728\u57f7\u884c\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u6642\uff0c\u7cfb\u7d71\u53ef\u5c07\u6574\u500b\u5b50\u9663\u5217\u8f09\u5165\u5230\u5feb\u53d6\uff0c\u56e0\u6b64\u8a2a\u554f\u5143\u7d20\u7684\u6548\u7387\u8f03\u9ad8\u3002\u800c\u50cf\u201c\u5806\u7a4d\u6392\u5e8f\u201d\u9019\u985e\u6f14\u7b97\u6cd5\u9700\u8981\u8df3\u8e8d\u5f0f\u8a2a\u554f\u5143\u7d20\uff0c\u5f9e\u800c\u7f3a\u4e4f\u9019\u4e00\u7279\u6027\u3002
    • \u8907\u96dc\u5ea6\u7684\u5e38\u6578\u4fc2\u6578\u5c0f\uff1a\u5728\u4e0a\u8ff0\u4e09\u7a2e\u6f14\u7b97\u6cd5\u4e2d\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6bd4\u8f03\u3001\u8ce6\u503c\u3001\u4ea4\u63db\u7b49\u64cd\u4f5c\u7684\u7e3d\u6578\u91cf\u6700\u5c11\u3002\u9019\u8207\u201c\u63d2\u5165\u6392\u5e8f\u201d\u6bd4\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u66f4\u5feb\u7684\u539f\u56e0\u985e\u4f3c\u3002
    "},{"location":"chapter_sorting/quick_sort/#1154","title":"11.5.4 \u00a0 \u57fa\u6e96\u6578\u6700\u4f73\u5316","text":"

    \u5feb\u901f\u6392\u5e8f\u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\u7684\u6642\u9593\u6548\u7387\u53ef\u80fd\u964d\u4f4e\u3002\u8209\u4e00\u500b\u6975\u7aef\u4f8b\u5b50\uff0c\u5047\u8a2d\u8f38\u5165\u9663\u5217\u662f\u5b8c\u5168\u5012\u5e8f\u7684\uff0c\u7531\u65bc\u6211\u5011\u9078\u64c7\u6700\u5de6\u7aef\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u5728\u54e8\u5175\u5283\u5206\u5b8c\u6210\u5f8c\uff0c\u57fa\u6e96\u6578\u88ab\u4ea4\u63db\u81f3\u9663\u5217\u6700\u53f3\u7aef\uff0c\u5c0e\u81f4\u5de6\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(n - 1\\)\u3001\u53f3\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(0\\) \u3002\u5982\u6b64\u905e\u8ff4\u4e0b\u53bb\uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u5f8c\u90fd\u6709\u4e00\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(0\\) \uff0c\u5206\u6cbb\u7b56\u7565\u5931\u6548\uff0c\u5feb\u901f\u6392\u5e8f\u9000\u5316\u70ba\u201c\u6ce1\u6cab\u6392\u5e8f\u201d\u7684\u8fd1\u4f3c\u5f62\u5f0f\u3002

    \u70ba\u4e86\u5118\u91cf\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u767c\u751f\uff0c\u6211\u5011\u53ef\u4ee5\u6700\u4f73\u5316\u54e8\u5175\u5283\u5206\u4e2d\u7684\u57fa\u6e96\u6578\u7684\u9078\u53d6\u7b56\u7565\u3002\u4f8b\u5982\uff0c\u6211\u5011\u53ef\u4ee5\u96a8\u6a5f\u9078\u53d6\u4e00\u500b\u5143\u7d20\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u7136\u800c\uff0c\u5982\u679c\u904b\u6c23\u4e0d\u4f73\uff0c\u6bcf\u6b21\u90fd\u9078\u5230\u4e0d\u7406\u60f3\u7684\u57fa\u6e96\u6578\uff0c\u6548\u7387\u4ecd\u7136\u4e0d\u76e1\u5982\u4eba\u610f\u3002

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u7a0b\u5f0f\u8a9e\u8a00\u901a\u5e38\u751f\u6210\u7684\u662f\u201c\u507d\u96a8\u6a5f\u6578\u201d\u3002\u5982\u679c\u6211\u5011\u91dd\u5c0d\u507d\u96a8\u6a5f\u6578\u5e8f\u5217\u69cb\u5efa\u4e00\u500b\u7279\u5b9a\u7684\u6e2c\u8a66\u6a23\u4f8b\uff0c\u90a3\u9ebc\u5feb\u901f\u6392\u5e8f\u7684\u6548\u7387\u4ecd\u7136\u53ef\u80fd\u52a3\u5316\u3002

    \u70ba\u4e86\u9032\u4e00\u6b65\u6539\u9032\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u9663\u5217\u4e2d\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\uff08\u901a\u5e38\u70ba\u9663\u5217\u7684\u9996\u3001\u5c3e\u3001\u4e2d\u9ede\u5143\u7d20\uff09\uff0c\u4e26\u5c07\u9019\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\u4f5c\u70ba\u57fa\u6e96\u6578\u3002\u9019\u6a23\u4e00\u4f86\uff0c\u57fa\u6e96\u6578\u201c\u65e2\u4e0d\u592a\u5c0f\u4e5f\u4e0d\u592a\u5927\u201d\u7684\u6a5f\u7387\u5c07\u5927\u5e45\u63d0\u5347\u3002\u7576\u7136\uff0c\u6211\u5011\u9084\u53ef\u4ee5\u9078\u53d6\u66f4\u591a\u5019\u9078\u5143\u7d20\uff0c\u4ee5\u9032\u4e00\u6b65\u63d0\u9ad8\u6f14\u7b97\u6cd5\u7684\u7a69\u5065\u6027\u3002\u63a1\u7528\u9019\u7a2e\u65b9\u6cd5\u5f8c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u7684\u6a5f\u7387\u5927\u5927\u964d\u4f4e\u3002

    \u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig quick_sort.py
    def median_three(self, nums: list[int], left: int, mid: int, right: int) -> int:\n    \"\"\"\u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\"\"\"\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\u9593\n    if (m <= l <= r) or (r <= l <= m):\n        return left  # l \u5728 m \u548c r \u4e4b\u9593\n    return right\n\ndef partition(self, nums: list[int], left: int, right: int) -> int:\n    \"\"\"\u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\"\"\"\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med = self.median_three(nums, left, (left + right) // 2, right)\n    # \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    # \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j = left, right\n    while i < j:\n        while i < j and nums[j] >= nums[left]:\n            j -= 1  # \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while i < j and nums[i] <= nums[left]:\n            i += 1  # \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        # \u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    # \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i  # \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n
    quick_sort.cpp
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(vector<int> &nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.java
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.cs
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint Partition(int[] nums, int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = MedianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    Swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--;          // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        Swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    Swap(nums, i, left);  // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;             // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.go
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09*/\nfunc (q *quickSortMedian) partition(nums []int, left, right int) int {\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    med := q.medianThree(nums, left, (left+right)/2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums[left], nums[med] = nums[med], nums[left]\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    i, j := left, right\n    for i < j {\n        for i < j && nums[j] >= nums[left] {\n            j-- //\u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        for i < j && nums[i] <= nums[left] {\n            i++ //\u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        //\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[j] = nums[j], nums[i]\n    }\n    //\u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    nums[i], nums[left] = nums[left], nums[i]\n    return i //\u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.swift
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfunc partitionMedian(nums: inout [Int], left: Int, right: Int) -> Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = medianThree(nums: nums, left: left, mid: (left + right) / 2, right: right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swapAt(left, med)\n    return partition(nums: &nums, left: left, right: right)\n}\n
    quick_sort.js
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums, left, right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.ts
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l <= m && m <= r) || (r <= m && m <= l)) return mid;\n    // l \u5728 m \u548c r \u4e4b\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m)) return left;\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\npartition(nums: number[], left: number, right: number): number {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = this.medianThree(\n        nums,\n        left,\n        Math.floor((left + right) / 2),\n        right\n    );\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    this.swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let i = left,\n        j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left]) {\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while (i < j && nums[i] <= nums[left]) {\n            i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        this.swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    this.swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.dart
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n  if ((m <= l && l <= r) || (r <= l && l <= m))\n    return left; // l \u5728 m \u548c r \u4e4b\u9593\n  return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint _partition(List<int> nums, int left, int right) {\n  // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n  int med = _medianThree(nums, left, (left + right) ~/ 2, right);\n  // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n  _swap(nums, left, med);\n  // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n  int i = left, j = right;\n  while (i < j) {\n    while (i < j && nums[j] >= nums[left]) j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    while (i < j && nums[i] <= nums[left]) i++; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n    _swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n  }\n  _swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n  return i; // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rs
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    }\n    if (m <= l && l <= r) || (r <= l && l <= m) {\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    }\n    right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfn partition(nums: &mut [i32], left: usize, right: usize) -> usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    let med = Self::median_three(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    nums.swap(left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    let (mut i, mut j) = (left, right);\n    while i < j {\n        while i < j && nums[j] >= nums[left] {\n            j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        while i < j && nums[i] <= nums[left] {\n            i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        }\n        nums.swap(i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    nums.swap(i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    i // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.c
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nint partitionMedian(int nums[], int left, int right) {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    int med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    int i = left, j = right;\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++;          // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j); // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left); // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;            // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.kt
    /* \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578 */\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\u9593\n    if ((l in m..r) || (l in r..m))\n        return left // l \u5728 m \u548c r \u4e4b\u9593\n    return right\n}\n\n/* \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09 */\nfun partitionMedian(nums: IntArray, left: Int, right: Int): Int {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    val med = medianThree(nums, left, (left + right) / 2, right)\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med)\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left\n    var j = right\n    while (i < j) {\n        while (i < j && nums[j] >= nums[left])\n            j--                      // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j && nums[i] <= nums[left])\n            i++                      // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j)             // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left)              // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i                         // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    quick_sort.rb
    [class]{QuickSortMedian}-[func]{median_three}\n\n[class]{QuickSortMedian}-[func]{partition}\n
    quick_sort.zig
    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\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\u9593\n    if ((m <= l && l <= r) || (r <= l && l <= m))\n        return left; // l \u5728 m \u548c r \u4e4b\u9593\n    return right;\n}\n\n// \u54e8\u5175\u5283\u5206\uff08\u4e09\u6578\u53d6\u4e2d\u503c\uff09\nfn partition(nums: []i32, left: usize, right: usize) usize {\n    // \u9078\u53d6\u4e09\u500b\u5019\u9078\u5143\u7d20\u7684\u4e2d\u4f4d\u6578\n    var med = medianThree(nums, left, (left + right) / 2, right);\n    // \u5c07\u4e2d\u4f4d\u6578\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\n    swap(nums, left, med);\n    // \u4ee5 nums[left] \u70ba\u57fa\u6e96\u6578\n    var i = left;\n    var j = right;\n    while (i < j) {\n        while (i < j and nums[j] >= nums[left]) j -= 1; // \u5f9e\u53f3\u5411\u5de6\u627e\u9996\u500b\u5c0f\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        while (i < j and nums[i] <= nums[left]) i += 1; // \u5f9e\u5de6\u5411\u53f3\u627e\u9996\u500b\u5927\u65bc\u57fa\u6e96\u6578\u7684\u5143\u7d20\n        swap(nums, i, j);   // \u4ea4\u63db\u9019\u5169\u500b\u5143\u7d20\n    }\n    swap(nums, i, left);    // \u5c07\u57fa\u6e96\u6578\u4ea4\u63db\u81f3\u5169\u5b50\u9663\u5217\u7684\u5206\u754c\u7dda\n    return i;               // \u8fd4\u56de\u57fa\u6e96\u6578\u7684\u7d22\u5f15\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/quick_sort/#1155","title":"11.5.5 \u00a0 \u5c3e\u905e\u8ff4\u6700\u4f73\u5316","text":"

    \u5728\u67d0\u4e9b\u8f38\u5165\u4e0b\uff0c\u5feb\u901f\u6392\u5e8f\u53ef\u80fd\u4f54\u7528\u7a7a\u9593\u8f03\u591a\u3002\u4ee5\u5b8c\u5168\u6709\u5e8f\u7684\u8f38\u5165\u9663\u5217\u70ba\u4f8b\uff0c\u8a2d\u905e\u8ff4\u4e2d\u7684\u5b50\u9663\u5217\u9577\u5ea6\u70ba \\(m\\) \uff0c\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u90fd\u5c07\u7522\u751f\u9577\u5ea6\u70ba \\(0\\) \u7684\u5de6\u5b50\u9663\u5217\u548c\u9577\u5ea6\u70ba \\(m - 1\\) \u7684\u53f3\u5b50\u9663\u5217\uff0c\u9019\u610f\u5473\u8457\u6bcf\u4e00\u5c64\u905e\u8ff4\u547c\u53eb\u6e1b\u5c11\u7684\u554f\u984c\u898f\u6a21\u975e\u5e38\u5c0f\uff08\u53ea\u6e1b\u5c11\u4e00\u500b\u5143\u7d20\uff09\uff0c\u905e\u8ff4\u6a39\u7684\u9ad8\u5ea6\u6703\u9054\u5230 \\(n - 1\\) \uff0c\u6b64\u6642\u9700\u8981\u4f54\u7528 \\(O(n)\\) \u5927\u5c0f\u7684\u5806\u758a\u5e40\u7a7a\u9593\u3002

    \u70ba\u4e86\u9632\u6b62\u5806\u758a\u5e40\u7a7a\u9593\u7684\u7d2f\u7a4d\uff0c\u6211\u5011\u53ef\u4ee5\u5728\u6bcf\u8f2a\u54e8\u5175\u6392\u5e8f\u5b8c\u6210\u5f8c\uff0c\u6bd4\u8f03\u5169\u500b\u5b50\u9663\u5217\u7684\u9577\u5ea6\uff0c\u50c5\u5c0d\u8f03\u77ed\u7684\u5b50\u9663\u5217\u9032\u884c\u905e\u8ff4\u3002\u7531\u65bc\u8f03\u77ed\u5b50\u9663\u5217\u7684\u9577\u5ea6\u4e0d\u6703\u8d85\u904e \\(n / 2\\) \uff0c\u56e0\u6b64\u9019\u7a2e\u65b9\u6cd5\u80fd\u78ba\u4fdd\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff0c\u5f9e\u800c\u5c07\u6700\u5dee\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u81f3 \\(O(\\log n)\\) \u3002\u7a0b\u5f0f\u78bc\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\u905e\u8ff4\u6700\u4f73\u5316\uff09\"\"\"\n    # \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right:\n        # \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot = self.partition(nums, left, right)\n        # \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot:\n            self.quick_sort(nums, left, pivot - 1)  # \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        else:\n            self.quick_sort(nums, pivot + 1, right)  # \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1  # \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n
    quick_sort.cpp
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(vector<int> &nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.java
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.cs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid QuickSort(int[] nums, int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = Partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            QuickSort(nums, left, pivot - 1);  // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            QuickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.go
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09*/\nfunc (q *quickSortTailCall) quickSort(nums []int, left, right int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    for left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        pivot := q.partition(nums, left, right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot-left < right-pivot {\n            q.quickSort(nums, left, pivot-1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            q.quickSort(nums, pivot+1, right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1                 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.swift
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfunc quickSortTailCall(nums: inout [Int], left: Int, right: Int) {\n    var left = left\n    var right = right\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = partition(nums: &nums, left: left, right: right)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left) < (right - pivot) {\n            quickSortTailCall(nums: &nums, left: left, right: pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSortTailCall(nums: &nums, left: pivot + 1, right: right) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.js
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums, left, right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.ts
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nquickSort(nums: number[], left: number, right: number): void {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = this.partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            this.quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            this.quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.dart
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSort(List<int> nums, int left, int right) {\n  // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n  while (left < right) {\n    // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n    int pivot = _partition(nums, left, right);\n    // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n    if (pivot - left < right - pivot) {\n      quickSort(nums, left, pivot - 1); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n      left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n    } else {\n      quickSort(nums, pivot + 1, right); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n      right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n    }\n  }\n}\n
    quick_sort.rs
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\npub fn quick_sort(mut left: i32, mut right: i32, nums: &mut [i32]) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while left < right {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        let pivot = Self::partition(nums, left as usize, right as usize) as i32;\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if pivot - left < right - pivot {\n            Self::quick_sort(left, pivot - 1, nums); // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            Self::quick_sort(pivot + 1, right, nums); // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1; // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.c
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nvoid quickSortTailCall(int nums[], int left, int right) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        int pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            quickSortTailCall(nums, left, pivot - 1);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n            left = pivot + 1;\n        } else {\n            // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            quickSortTailCall(nums, pivot + 1, right);\n            // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n            right = pivot - 1;\n        }\n    }\n}\n
    quick_sort.kt
    /* \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09 */\nfun quickSortTailCall(nums: IntArray, left: Int, right: Int) {\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\n    var l = left\n    var r = right\n    while (l < r) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        val pivot = partition(nums, l, r)\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - l < r - pivot) {\n            quickSort(nums, l, pivot - 1) // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            l = pivot + 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, r) // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            r = pivot - 1 // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    quick_sort.rb
    [class]{QuickSortTailCall}-[func]{quick_sort}\n
    quick_sort.zig
    // \u5feb\u901f\u6392\u5e8f\uff08\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff09\nfn quickSort(nums: []i32, left_: usize, right_: usize) void {\n    var left = left_;\n    var right = right_;\n    // \u5b50\u9663\u5217\u9577\u5ea6\u70ba 1 \u6642\u7d42\u6b62\u905e\u8ff4\n    while (left < right) {\n        // \u54e8\u5175\u5283\u5206\u64cd\u4f5c\n        var pivot = partition(nums, left, right);\n        // \u5c0d\u5169\u500b\u5b50\u9663\u5217\u4e2d\u8f03\u77ed\u7684\u90a3\u500b\u57f7\u884c\u5feb\u901f\u6392\u5e8f\n        if (pivot - left < right - pivot) {\n            quickSort(nums, left, pivot - 1);   // \u905e\u8ff4\u6392\u5e8f\u5de6\u5b50\u9663\u5217\n            left = pivot + 1;                   // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [pivot + 1, right]\n        } else {\n            quickSort(nums, pivot + 1, right);  // \u905e\u8ff4\u6392\u5e8f\u53f3\u5b50\u9663\u5217\n            right = pivot - 1;                  // \u5269\u9918\u672a\u6392\u5e8f\u5340\u9593\u70ba [left, pivot - 1]\n        }\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/radix_sort/","title":"11.10 \u00a0 \u57fa\u6578\u6392\u5e8f","text":"

    \u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u8a08\u6578\u6392\u5e8f\uff0c\u5b83\u9069\u7528\u65bc\u8cc7\u6599\u91cf \\(n\\) \u8f03\u5927\u4f46\u8cc7\u6599\u7bc4\u570d \\(m\\) \u8f03\u5c0f\u7684\u60c5\u6cc1\u3002\u5047\u8a2d\u6211\u5011\u9700\u8981\u5c0d \\(n = 10^6\\) \u500b\u5b78\u865f\u9032\u884c\u6392\u5e8f\uff0c\u800c\u5b78\u865f\u662f\u4e00\u500b \\(8\\) \u4f4d\u6578\u5b57\uff0c\u9019\u610f\u5473\u8457\u8cc7\u6599\u7bc4\u570d \\(m = 10^8\\) \u975e\u5e38\u5927\uff0c\u4f7f\u7528\u8a08\u6578\u6392\u5e8f\u9700\u8981\u5206\u914d\u5927\u91cf\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u800c\u57fa\u6578\u6392\u5e8f\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u3002

    \u57fa\u6578\u6392\u5e8f\uff08radix sort\uff09\u7684\u6838\u5fc3\u601d\u60f3\u8207\u8a08\u6578\u6392\u5e8f\u4e00\u81f4\uff0c\u4e5f\u900f\u904e\u7d71\u8a08\u500b\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u6b64\u57fa\u790e\u4e0a\uff0c\u57fa\u6578\u6392\u5e8f\u5229\u7528\u6578\u5b57\u5404\u4f4d\u4e4b\u9593\u7684\u905e\u9032\u95dc\u4fc2\uff0c\u4f9d\u6b21\u5c0d\u6bcf\u4e00\u4f4d\u9032\u884c\u6392\u5e8f\uff0c\u5f9e\u800c\u5f97\u5230\u6700\u7d42\u7684\u6392\u5e8f\u7d50\u679c\u3002

    "},{"location":"chapter_sorting/radix_sort/#11101","title":"11.10.1 \u00a0 \u6f14\u7b97\u6cd5\u6d41\u7a0b","text":"

    \u4ee5\u5b78\u865f\u8cc7\u6599\u70ba\u4f8b\uff0c\u5047\u8a2d\u6578\u5b57\u7684\u6700\u4f4e\u4f4d\u662f\u7b2c \\(1\\) \u4f4d\uff0c\u6700\u9ad8\u4f4d\u662f\u7b2c \\(8\\) \u4f4d\uff0c\u57fa\u6578\u6392\u5e8f\u7684\u6d41\u7a0b\u5982\u5716 11-18 \u6240\u793a\u3002

    1. \u521d\u59cb\u5316\u4f4d\u6578 \\(k = 1\\) \u3002
    2. \u5c0d\u5b78\u865f\u7684\u7b2c \\(k\\) \u4f4d\u57f7\u884c\u201c\u8a08\u6578\u6392\u5e8f\u201d\u3002\u5b8c\u6210\u5f8c\uff0c\u8cc7\u6599\u6703\u6839\u64da\u7b2c \\(k\\) \u4f4d\u5f9e\u5c0f\u5230\u5927\u6392\u5e8f\u3002
    3. \u5c07 \\(k\\) \u589e\u52a0 \\(1\\) \uff0c\u7136\u5f8c\u8fd4\u56de\u6b65\u9a5f 2. \u7e7c\u7e8c\u8fed\u4ee3\uff0c\u76f4\u5230\u6240\u6709\u4f4d\u90fd\u6392\u5e8f\u5b8c\u6210\u5f8c\u7d50\u675f\u3002

    \u5716 11-18 \u00a0 \u57fa\u6578\u6392\u5e8f\u6f14\u7b97\u6cd5\u6d41\u7a0b

    \u4e0b\u9762\u5256\u6790\u7a0b\u5f0f\u78bc\u5be6\u73fe\u3002\u5c0d\u65bc\u4e00\u500b \\(d\\) \u9032\u4f4d\u5236\u7684\u6578\u5b57 \\(x\\) \uff0c\u8981\u7372\u53d6\u5176\u7b2c \\(k\\) \u4f4d \\(x_k\\) \uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8a08\u7b97\u516c\u5f0f\uff1a

    \\[ x_k = \\lfloor\\frac{x}{d^{k-1}}\\rfloor \\bmod d \\]

    \u5176\u4e2d \\(\\lfloor a \\rfloor\\) \u8868\u793a\u5c0d\u6d6e\u9ede\u6578 \\(a\\) \u5411\u4e0b\u53d6\u6574\uff0c\u800c \\(\\bmod \\: d\\) \u8868\u793a\u5c0d \\(d\\) \u53d6\u6a21\uff08\u53d6\u9918\uff09\u3002\u5c0d\u65bc\u5b78\u865f\u8cc7\u6599\uff0c\\(d = 10\\) \u4e14 \\(k \\in [1, 8]\\) \u3002

    \u6b64\u5916\uff0c\u6211\u5011\u9700\u8981\u5c0f\u5e45\u6539\u52d5\u8a08\u6578\u6392\u5e8f\u7a0b\u5f0f\u78bc\uff0c\u4f7f\u4e4b\u53ef\u4ee5\u6839\u64da\u6578\u5b57\u7684\u7b2c \\(k\\) \u4f4d\u9032\u884c\u6392\u5e8f\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig radix_sort.py
    def digit(num: int, exp: int) -> int:\n    \"\"\"\u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\"\"\"\n    # \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num // exp) % 10\n\ndef counting_sort_digit(nums: list[int], exp: int):\n    \"\"\"\u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\"\"\"\n    # \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter = [0] * 10\n    n = len(nums)\n    # \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in range(n):\n        d = digit(nums[i], exp)  # \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1  # \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    # \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in range(1, 10):\n        counter[i] += counter[i - 1]\n    # \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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  # \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]  # \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1  # \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    # \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in range(n):\n        nums[i] = res[i]\n\ndef radix_sort(nums: list[int]):\n    \"\"\"\u57fa\u6578\u6392\u5e8f\"\"\"\n    # \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    m = max(nums)\n    # \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    exp = 1\n    while exp <= m:\n        # \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(vector<int> &nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    vector<int> counter(10, 0);\n    int n = nums.size();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(vector<int> &nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = *max_element(nums.begin(), nums.end());\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++)\n        nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = Integer.MIN_VALUE;\n    for (int num : nums)\n        if (num > m)\n            m = num;\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint Digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid CountingSortDigit(int[] nums, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int[] counter = new int[10];\n    int n = nums.Length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < n; i++) {\n        int d = Digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++;                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid RadixSort(int[] nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    int m = int.MinValue;\n    foreach (int num in nums) {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num, exp int) int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums []int, exp int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    counter := make([]int, 10)\n    n := len(nums)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i := 0; i < n; i++ {\n        d := digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++             // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i := 1; i < 10; i++ {\n        counter[i] += counter[i-1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]    // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i := 0; i < n; i++ {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums []int) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    max := math.MinInt\n    for _, num := range nums {\n        if num > max {\n            max = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp := 1; max >= exp; exp *= 10 {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunc digit(num: Int, exp: Int) -> Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunc countingSortDigit(nums: inout [Int], exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    var counter = Array(repeating: 0, count: 10)\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in nums.indices {\n        let d = digit(num: nums[i], exp: exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1 // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1 ..< 10 {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i] // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1 // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in nums.indices {\n        nums[i] = res[i]\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunc radixSort(nums: inout [Int]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.min\n    for num in nums {\n        if num > m {\n            m = num\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for exp in sequence(first: 1, next: { m >= ($0 * 10) ? $0 * 10 : nil }) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num, exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums, exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfunction digit(num: number, exp: number): number {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return Math.floor(num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfunction countingSortDigit(nums: number[], exp: number): void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    const counter = new Array(10).fill(0);\n    const n = nums.length;\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (let i = 0; i < n; i++) {\n        const d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (let i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (let i = 0; i < n; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfunction radixSort(nums: number[]): void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = Number.MIN_VALUE;\n    for (const num of nums) {\n        if (num > m) {\n            m = num;\n        }\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (let exp = 1; exp <= m; exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 _num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int _num, int exp) {\n  // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n  return (_num ~/ exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(List<int> nums, int exp) {\n  // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n  List<int> counter = List<int>.filled(10, 0);\n  int n = nums.length;\n  // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n  for (int i = 0; i < n; i++) {\n    int d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n    counter[d]++; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n  }\n  // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n  for (int i = 1; i < 10; i++) {\n    counter[i] += counter[i - 1];\n  }\n  // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n    res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n    counter[d]--; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n  }\n  // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n  for (int i = 0; i < n; i++) nums[i] = res[i];\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(List<int> nums) {\n  // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n  // dart \u4e2d int \u7684\u9577\u5ea6\u662f 64 \u4f4d\u7684\n  int m = -1 << 63;\n  for (int _num in nums) if (_num > m) m = _num;\n  // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n  for (int exp = 1; exp <= m; exp *= 10)\n    // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfn digit(num: i32, exp: i32) -> usize {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return ((num / exp) % 10) as usize;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfn counting_sort_digit(nums: &mut [i32], exp: i32) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    let mut counter = [0; 10];\n    let n = nums.len();\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for i in 0..n {\n        let d = digit(nums[i], exp); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for i in 1..10 {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]; // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1; // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for i in 0..n {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfn radix_sort(nums: &mut [i32]) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    let m = *nums.into_iter().max().unwrap();\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    let mut exp = 1;\n    while exp <= m {\n        counting_sort_digit(nums, exp);\n        exp *= 10;\n    }\n}\n
    radix_sort.c
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nint digit(int num, int exp) {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10;\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nvoid countingSortDigit(int nums[], int size, int exp) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    int *counter = (int *)malloc((sizeof(int) * 10));\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (int i = 0; i < size; i++) {\n        // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        int d = digit(nums[i], exp);\n        // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n        counter[d]++;\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (int i = 1; i < 10; i++) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--;           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (int i = 0; i < size; i++) {\n        nums[i] = res[i];\n    }\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nvoid radixSort(int nums[], int size) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\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\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    for (int exp = 1; max >= exp; exp *= 10)\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    /* \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1) */\nfun digit(num: Int, exp: Int): Int {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return (num / exp) % 10\n}\n\n/* \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09 */\nfun countingSortDigit(nums: IntArray, exp: Int) {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\n    val counter = IntArray(10)\n    val n = nums.size\n    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (i in 0..<n) {\n        val d = digit(nums[i], exp) // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d]++                // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    for (i in 1..9) {\n        counter[i] += counter[i - 1]\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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 // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i]       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d]--           // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    for (i in 0..<n)\n        nums[i] = res[i]\n}\n\n/* \u57fa\u6578\u6392\u5e8f */\nfun radixSort(nums: IntArray) {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m = Int.MIN_VALUE\n    for (num in nums) if (num > m) m = num\n    var exp = 1\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    while (exp <= m) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    [class]{}-[func]{digit}\n\n[class]{}-[func]{counting_sort_digit}\n\n[class]{}-[func]{radix_sort}\n
    radix_sort.zig
    // \u7372\u53d6\u5143\u7d20 num \u7684\u7b2c k \u4f4d\uff0c\u5176\u4e2d exp = 10^(k-1)\nfn digit(num: i32, exp: i32) i32 {\n    // \u50b3\u5165 exp \u800c\u975e k \u53ef\u4ee5\u907f\u514d\u5728\u6b64\u91cd\u8907\u57f7\u884c\u6602\u8cb4\u7684\u6b21\u65b9\u8a08\u7b97\n    return @mod(@divFloor(num, exp), 10);\n}\n\n// \u8a08\u6578\u6392\u5e8f\uff08\u6839\u64da nums \u7b2c k \u4f4d\u6392\u5e8f\uff09\nfn countingSortDigit(nums: []i32, exp: i32) !void {\n    // \u5341\u9032\u4f4d\u5236\u7684\u4f4d\u7bc4\u570d\u70ba 0~9 \uff0c\u56e0\u6b64\u9700\u8981\u9577\u5ea6\u70ba 10 \u7684\u6876\u9663\u5217\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    // \u7d71\u8a08 0~9 \u5404\u6578\u5b57\u7684\u51fa\u73fe\u6b21\u6578\n    for (nums) |num| {\n        var d: u32 = @bitCast(digit(num, exp)); // \u7372\u53d6 nums[i] \u7b2c k \u4f4d\uff0c\u8a18\u70ba d\n        counter[d] += 1; // \u7d71\u8a08\u6578\u5b57 d \u7684\u51fa\u73fe\u6b21\u6578\n    }\n    // \u6c42\u524d\u7db4\u548c\uff0c\u5c07\u201c\u51fa\u73fe\u500b\u6578\u201d\u8f49\u63db\u70ba\u201c\u9663\u5217\u7d22\u5f15\u201d\n    var i: usize = 1;\n    while (i < 10) : (i += 1) {\n        counter[i] += counter[i - 1];\n    }\n    // \u5012\u5e8f\u8d70\u8a2a\uff0c\u6839\u64da\u6876\u5167\u7d71\u8a08\u7d50\u679c\uff0c\u5c07\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; // \u7372\u53d6 d \u5728\u9663\u5217\u4e2d\u7684\u7d22\u5f15 j\n        res[j] = nums[i];       // \u5c07\u7576\u524d\u5143\u7d20\u586b\u5165\u7d22\u5f15 j\n        counter[d] -= 1;        // \u5c07 d \u7684\u6578\u91cf\u6e1b 1\n        if (i == 0) break;\n    }\n    // \u4f7f\u7528\u7d50\u679c\u8986\u84cb\u539f\u9663\u5217 nums\n    i = 0;\n    while (i < n) : (i += 1) {\n        nums[i] = res[i];\n    }\n}\n\n// \u57fa\u6578\u6392\u5e8f\nfn radixSort(nums: []i32) !void {\n    // \u7372\u53d6\u9663\u5217\u7684\u6700\u5927\u5143\u7d20\uff0c\u7528\u65bc\u5224\u65b7\u6700\u5927\u4f4d\u6578\n    var m: i32 = std.math.minInt(i32);\n    for (nums) |num| {\n        if (num > m) m = num;\n    }\n    // \u6309\u7167\u5f9e\u4f4e\u4f4d\u5230\u9ad8\u4f4d\u7684\u9806\u5e8f\u8d70\u8a2a\n    var exp: i32 = 1;\n    while (exp <= m) : (exp *= 10) {\n        // \u5c0d\u9663\u5217\u5143\u7d20\u7684\u7b2c k \u4f4d\u57f7\u884c\u8a08\u6578\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u70ba\u4ec0\u9ebc\u5f9e\u6700\u4f4e\u4f4d\u958b\u59cb\u6392\u5e8f\uff1f

    \u5728\u9023\u7e8c\u7684\u6392\u5e8f\u8f2a\u6b21\u4e2d\uff0c\u5f8c\u4e00\u8f2a\u6392\u5e8f\u6703\u8986\u84cb\u524d\u4e00\u8f2a\u6392\u5e8f\u7684\u7d50\u679c\u3002\u8209\u4f8b\u4f86\u8aaa\uff0c\u5982\u679c\u7b2c\u4e00\u8f2a\u6392\u5e8f\u7d50\u679c \\(a < b\\) \uff0c\u800c\u7b2c\u4e8c\u8f2a\u6392\u5e8f\u7d50\u679c \\(a > b\\) \uff0c\u90a3\u9ebc\u7b2c\u4e8c\u8f2a\u7684\u7d50\u679c\u5c07\u53d6\u4ee3\u7b2c\u4e00\u8f2a\u7684\u7d50\u679c\u3002\u7531\u65bc\u6578\u5b57\u7684\u9ad8\u4f4d\u512a\u5148\u9806\u5e8f\u9ad8\u65bc\u4f4e\u4f4d\uff0c\u56e0\u6b64\u61c9\u8a72\u5148\u6392\u5e8f\u4f4e\u4f4d\u518d\u6392\u5e8f\u9ad8\u4f4d\u3002

    "},{"location":"chapter_sorting/radix_sort/#11102","title":"11.10.2 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"

    \u76f8\u8f03\u65bc\u8a08\u6578\u6392\u5e8f\uff0c\u57fa\u6578\u6392\u5e8f\u9069\u7528\u65bc\u6578\u503c\u7bc4\u570d\u8f03\u5927\u7684\u60c5\u6cc1\uff0c\u4f46\u524d\u63d0\u662f\u8cc7\u6599\u5fc5\u9808\u53ef\u4ee5\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u683c\u5f0f\uff0c\u4e14\u4f4d\u6578\u4e0d\u80fd\u904e\u5927\u3002\u4f8b\u5982\uff0c\u6d6e\u9ede\u6578\u4e0d\u9069\u5408\u4f7f\u7528\u57fa\u6578\u6392\u5e8f\uff0c\u56e0\u70ba\u5176\u4f4d\u6578 \\(k\\) \u904e\u5927\uff0c\u53ef\u80fd\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6 \\(O(nk) \\gg O(n^2)\\) \u3002

    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(nk)\\)\uff1a\u8a2d\u8cc7\u6599\u91cf\u70ba \\(n\\)\u3001\u8cc7\u6599\u70ba \\(d\\) \u9032\u4f4d\u5236\u3001\u6700\u5927\u4f4d\u6578\u70ba \\(k\\) \uff0c\u5247\u5c0d\u67d0\u4e00\u4f4d\u57f7\u884c\u8a08\u6578\u6392\u5e8f\u4f7f\u7528 \\(O(n + d)\\) \u6642\u9593\uff0c\u6392\u5e8f\u6240\u6709 \\(k\\) \u4f4d\u4f7f\u7528 \\(O((n + d)k)\\) \u6642\u9593\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\\(d\\) \u548c \\(k\\) \u90fd\u76f8\u5c0d\u8f03\u5c0f\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u8da8\u5411 \\(O(n)\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n + d)\\)\u3001\u975e\u539f\u5730\u6392\u5e8f\uff1a\u8207\u8a08\u6578\u6392\u5e8f\u76f8\u540c\uff0c\u57fa\u6578\u6392\u5e8f\u9700\u8981\u85c9\u52a9\u9577\u5ea6\u70ba \\(n\\) \u548c \\(d\\) \u7684\u9663\u5217 res \u548c counter \u3002
    • \u7a69\u5b9a\u6392\u5e8f\uff1a\u7576\u8a08\u6578\u6392\u5e8f\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u4e5f\u7a69\u5b9a\uff1b\u7576\u8a08\u6578\u6392\u5e8f\u4e0d\u7a69\u5b9a\u6642\uff0c\u57fa\u6578\u6392\u5e8f\u7121\u6cd5\u4fdd\u8b49\u5f97\u5230\u6b63\u78ba\u7684\u6392\u5e8f\u7d50\u679c\u3002
    "},{"location":"chapter_sorting/selection_sort/","title":"11.2 \u00a0 \u9078\u64c7\u6392\u5e8f","text":"

    \u9078\u64c7\u6392\u5e8f\uff08selection sort\uff09\u7684\u5de5\u4f5c\u539f\u7406\u975e\u5e38\u7c21\u55ae\uff1a\u958b\u555f\u4e00\u500b\u8ff4\u5708\uff0c\u6bcf\u8f2a\u5f9e\u672a\u6392\u5e8f\u5340\u9593\u9078\u64c7\u6700\u5c0f\u7684\u5143\u7d20\uff0c\u5c07\u5176\u653e\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u672b\u5c3e\u3002

    \u8a2d\u9663\u5217\u7684\u9577\u5ea6\u70ba \\(n\\) \uff0c\u9078\u64c7\u6392\u5e8f\u7684\u6f14\u7b97\u6cd5\u6d41\u7a0b\u5982\u5716 11-2 \u6240\u793a\u3002

    1. \u521d\u59cb\u72c0\u614b\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u672a\u6392\u5e8f\uff0c\u5373\u672a\u6392\u5e8f\uff08\u7d22\u5f15\uff09\u5340\u9593\u70ba \\([0, n-1]\\) \u3002
    2. \u9078\u53d6\u5340\u9593 \\([0, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(0\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 1 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    3. \u9078\u53d6\u5340\u9593 \\([1, n-1]\\) \u4e2d\u7684\u6700\u5c0f\u5143\u7d20\uff0c\u5c07\u5176\u8207\u7d22\u5f15 \\(1\\) \u8655\u7684\u5143\u7d20\u4ea4\u63db\u3002\u5b8c\u6210\u5f8c\uff0c\u9663\u5217\u524d 2 \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    4. \u4ee5\u6b64\u985e\u63a8\u3002\u7d93\u904e \\(n - 1\\) \u8f2a\u9078\u64c7\u8207\u4ea4\u63db\u5f8c\uff0c\u9663\u5217\u524d \\(n - 1\\) \u500b\u5143\u7d20\u5df2\u6392\u5e8f\u3002
    5. \u50c5\u5269\u7684\u4e00\u500b\u5143\u7d20\u5fc5\u5b9a\u662f\u6700\u5927\u5143\u7d20\uff0c\u7121\u9808\u6392\u5e8f\uff0c\u56e0\u6b64\u9663\u5217\u6392\u5e8f\u5b8c\u6210\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5716 11-2 \u00a0 \u9078\u64c7\u6392\u5e8f\u6b65\u9a5f

    \u5728\u7a0b\u5f0f\u78bc\u4e2d\uff0c\u6211\u5011\u7528 \\(k\\) \u4f86\u8a18\u9304\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig selection_sort.py
    def selection_sort(nums: list[int]):\n    \"\"\"\u9078\u64c7\u6392\u5e8f\"\"\"\n    n = len(nums)\n    # \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in range(n - 1):\n        # \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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  # \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        # \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n
    selection_sort.cpp
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(vector<int> &nums) {\n    int n = nums.size();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        swap(nums[i], nums[k]);\n    }\n}\n
    selection_sort.java
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int[] nums) {\n    int n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.cs
    /* \u9078\u64c7\u6392\u5e8f */\nvoid SelectionSort(int[] nums) {\n    int n = nums.Length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        (nums[k], nums[i]) = (nums[i], nums[k]);\n    }\n}\n
    selection_sort.go
    /* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums []int) {\n    n := len(nums)\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i := 0; i < n-1; i++ {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        k := i\n        for j := i + 1; j < n; j++ {\n            if nums[j] < nums[k] {\n                // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n                k = j\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums[i], nums[k] = nums[k], nums[i]\n\n    }\n}\n
    selection_sort.swift
    /* \u9078\u64c7\u6392\u5e8f */\nfunc selectionSort(nums: inout [Int]) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in nums.indices.dropLast() {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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 // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swapAt(i, k)\n    }\n}\n
    selection_sort.js
    /* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums) {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.ts
    /* \u9078\u64c7\u6392\u5e8f */\nfunction selectionSort(nums: number[]): void {\n    let n = nums.length;\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (let i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        [nums[i], nums[k]] = [nums[k], nums[i]];\n    }\n}\n
    selection_sort.dart
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(List<int> nums) {\n  int n = nums.length;\n  // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n  for (int i = 0; i < n - 1; i++) {\n    // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n    }\n    // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n    int temp = nums[i];\n    nums[i] = nums[k];\n    nums[k] = temp;\n  }\n}\n
    selection_sort.rs
    /* \u9078\u64c7\u6392\u5e8f */\nfn selection_sort(nums: &mut [i32]) {\n    if nums.is_empty() {\n        return;\n    }\n    let n = nums.len();\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for i in 0..n - 1 {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n            }\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        nums.swap(i, k);\n    }\n}\n
    selection_sort.c
    /* \u9078\u64c7\u6392\u5e8f */\nvoid selectionSort(int nums[], int n) {\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (int i = 0; i < n - 1; i++) {\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\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; // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        int temp = nums[i];\n        nums[i] = nums[k];\n        nums[k] = temp;\n    }\n}\n
    selection_sort.kt
    /* \u9078\u64c7\u6392\u5e8f */\nfun selectionSort(nums: IntArray) {\n    val n = nums.size\n    // \u5916\u8ff4\u5708\uff1a\u672a\u6392\u5e8f\u5340\u9593\u70ba [i, n-1]\n    for (i in 0..<n - 1) {\n        var k = i\n        // \u5167\u8ff4\u5708\uff1a\u627e\u5230\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u6700\u5c0f\u5143\u7d20\n        for (j in i + 1..<n) {\n            if (nums[j] < nums[k])\n                k = j // \u8a18\u9304\u6700\u5c0f\u5143\u7d20\u7684\u7d22\u5f15\n        }\n        // \u5c07\u8a72\u6700\u5c0f\u5143\u7d20\u8207\u672a\u6392\u5e8f\u5340\u9593\u7684\u9996\u500b\u5143\u7d20\u4ea4\u63db\n        val temp = nums[i]\n        nums[i] = nums[k]\n        nums[k] = temp\n    }\n}\n
    selection_sort.rb
    [class]{}-[func]{selection_sort}\n
    selection_sort.zig
    [class]{}-[func]{selectionSort}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_sorting/selection_sort/#1121","title":"11.2.1 \u00a0 \u6f14\u7b97\u6cd5\u7279\u6027","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\)\u3001\u975e\u81ea\u9069\u61c9\u6392\u5e8f\uff1a\u5916\u8ff4\u5708\u5171 \\(n - 1\\) \u8f2a\uff0c\u7b2c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(n\\) \uff0c\u6700\u5f8c\u4e00\u8f2a\u7684\u672a\u6392\u5e8f\u5340\u9593\u9577\u5ea6\u70ba \\(2\\) \uff0c\u5373\u5404\u8f2a\u5916\u8ff4\u5708\u5206\u5225\u5305\u542b \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(3\\)\u3001\\(2\\) \u8f2a\u5167\u8ff4\u5708\uff0c\u6c42\u548c\u70ba \\(\\frac{(n - 1)(n + 2)}{2}\\) \u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(1)\\)\u3001\u539f\u5730\u6392\u5e8f\uff1a\u6307\u6a19 \\(i\\) \u548c \\(j\\) \u4f7f\u7528\u5e38\u6578\u5927\u5c0f\u7684\u984d\u5916\u7a7a\u9593\u3002
    • \u975e\u7a69\u5b9a\u6392\u5e8f\uff1a\u5982\u5716 11-3 \u6240\u793a\uff0c\u5143\u7d20 nums[i] \u6709\u53ef\u80fd\u88ab\u4ea4\u63db\u81f3\u8207\u5176\u76f8\u7b49\u7684\u5143\u7d20\u7684\u53f3\u908a\uff0c\u5c0e\u81f4\u5169\u8005\u7684\u76f8\u5c0d\u9806\u5e8f\u767c\u751f\u6539\u8b8a\u3002

    \u5716 11-3 \u00a0 \u9078\u64c7\u6392\u5e8f\u975e\u7a69\u5b9a\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/","title":"11.1 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

    \u6392\u5e8f\u6f14\u7b97\u6cd5\uff08sorting algorithm\uff09\u7528\u65bc\u5c0d\u4e00\u7d44\u8cc7\u6599\u6309\u7167\u7279\u5b9a\u9806\u5e8f\u9032\u884c\u6392\u5217\u3002\u6392\u5e8f\u6f14\u7b97\u6cd5\u6709\u8457\u5ee3\u6cdb\u7684\u61c9\u7528\uff0c\u56e0\u70ba\u6709\u5e8f\u8cc7\u6599\u901a\u5e38\u80fd\u5920\u88ab\u66f4\u9ad8\u6548\u5730\u67e5\u8a62\u3001\u5206\u6790\u548c\u8655\u7406\u3002

    \u5982\u5716 11-1 \u6240\u793a\uff0c\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e2d\u7684\u8cc7\u6599\u578b\u5225\u53ef\u4ee5\u662f\u6574\u6578\u3001\u6d6e\u9ede\u6578\u3001\u5b57\u5143\u6216\u5b57\u4e32\u7b49\u3002\u6392\u5e8f\u7684\u5224\u65b7\u898f\u5247\u53ef\u6839\u64da\u9700\u6c42\u8a2d\u5b9a\uff0c\u5982\u6578\u5b57\u5927\u5c0f\u3001\u5b57\u5143 ASCII \u78bc\u9806\u5e8f\u6216\u81ea\u5b9a\u7fa9\u898f\u5247\u3002

    \u5716 11-1 \u00a0 \u8cc7\u6599\u578b\u5225\u548c\u5224\u65b7\u898f\u5247\u793a\u4f8b

    "},{"location":"chapter_sorting/sorting_algorithm/#1111","title":"11.1.1 \u00a0 \u8a55\u50f9\u7dad\u5ea6","text":"

    \u57f7\u884c\u6548\u7387\uff1a\u6211\u5011\u671f\u671b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5118\u91cf\u4f4e\uff0c\u4e14\u7e3d\u9ad4\u64cd\u4f5c\u6578\u91cf\u8f03\u5c11\uff08\u6642\u9593\u8907\u96dc\u5ea6\u4e2d\u7684\u5e38\u6578\u9805\u8b8a\u5c0f\uff09\u3002\u5c0d\u65bc\u5927\u8cc7\u6599\u91cf\u7684\u60c5\u6cc1\uff0c\u57f7\u884c\u6548\u7387\u986f\u5f97\u5c24\u70ba\u91cd\u8981\u3002

    \u5c31\u5730\u6027\uff1a\u9867\u540d\u601d\u7fa9\uff0c\u539f\u5730\u6392\u5e8f\u900f\u904e\u5728\u539f\u9663\u5217\u4e0a\u76f4\u63a5\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\uff0c\u7121\u9808\u85c9\u52a9\u984d\u5916\u7684\u8f14\u52a9\u9663\u5217\uff0c\u5f9e\u800c\u7bc0\u7701\u8a18\u61b6\u9ad4\u3002\u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u539f\u5730\u6392\u5e8f\u7684\u8cc7\u6599\u642c\u904b\u64cd\u4f5c\u8f03\u5c11\uff0c\u57f7\u884c\u901f\u5ea6\u4e5f\u66f4\u5feb\u3002

    \u7a69\u5b9a\u6027\uff1a\u7a69\u5b9a\u6392\u5e8f\u5728\u5b8c\u6210\u6392\u5e8f\u5f8c\uff0c\u76f8\u7b49\u5143\u7d20\u5728\u9663\u5217\u4e2d\u7684\u76f8\u5c0d\u9806\u5e8f\u4e0d\u767c\u751f\u6539\u8b8a\u3002

    \u7a69\u5b9a\u6392\u5e8f\u662f\u591a\u7d1a\u6392\u5e8f\u5834\u666f\u7684\u5fc5\u8981\u689d\u4ef6\u3002\u5047\u8a2d\u6211\u5011\u6709\u4e00\u500b\u5132\u5b58\u5b78\u751f\u8cc7\u8a0a\u7684\u8868\u683c\uff0c\u7b2c 1 \u5217\u548c\u7b2c 2 \u5217\u5206\u5225\u662f\u59d3\u540d\u548c\u5e74\u9f61\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u975e\u7a69\u5b9a\u6392\u5e8f\u53ef\u80fd\u5c0e\u81f4\u8f38\u5165\u8cc7\u6599\u7684\u6709\u5e8f\u6027\u55aa\u5931\uff1a

    # \u8f38\u5165\u8cc7\u6599\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\u8a2d\u4f7f\u7528\u975e\u7a69\u5b9a\u6392\u5e8f\u6f14\u7b97\u6cd5\u6309\u5e74\u9f61\u6392\u5e8f\u4e32\u5217\uff0c\n# \u7d50\u679c\u4e2d ('D', 19) \u548c ('A', 19) \u7684\u76f8\u5c0d\u4f4d\u7f6e\u6539\u8b8a\uff0c\n# \u8f38\u5165\u8cc7\u6599\u6309\u59d3\u540d\u6392\u5e8f\u7684\u6027\u8cea\u4e1f\u5931\n  ('B', 18)\n  ('D', 19)\n  ('A', 19)\n  ('C', 21)\n  ('E', 23)\n

    \u81ea\u9069\u61c9\u6027\uff1a\u81ea\u9069\u61c9\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u53d7\u8f38\u5165\u8cc7\u6599\u7684\u5f71\u97ff\uff0c\u5373\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u3001\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u3001\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\u4e26\u4e0d\u5b8c\u5168\u76f8\u7b49\u3002

    \u81ea\u9069\u61c9\u6027\u9700\u8981\u6839\u64da\u5177\u9ad4\u60c5\u6cc1\u4f86\u8a55\u4f30\u3002\u5982\u679c\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u5dee\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u8aaa\u660e\u6392\u5e8f\u6f14\u7b97\u6cd5\u5728\u67d0\u4e9b\u8cc7\u6599\u4e0b\u6548\u80fd\u53ef\u80fd\u52a3\u5316\uff0c\u56e0\u6b64\u88ab\u8996\u70ba\u8ca0\u9762\u5c6c\u6027\uff1b\u800c\u5982\u679c\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u512a\u65bc\u5e73\u5747\u6642\u9593\u8907\u96dc\u5ea6\uff0c\u5247\u88ab\u8996\u70ba\u6b63\u9762\u5c6c\u6027\u3002

    \u662f\u5426\u57fa\u65bc\u6bd4\u8f03\uff1a\u57fa\u65bc\u6bd4\u8f03\u7684\u6392\u5e8f\u4f9d\u8cf4\u6bd4\u8f03\u904b\u7b97\u5b50\uff08\\(<\\)\u3001\\(=\\)\u3001\\(>\\)\uff09\u4f86\u5224\u65b7\u5143\u7d20\u7684\u76f8\u5c0d\u9806\u5e8f\uff0c\u5f9e\u800c\u6392\u5e8f\u6574\u500b\u9663\u5217\uff0c\u7406\u8ad6\u6700\u512a\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n \\log n)\\) \u3002\u800c\u975e\u6bd4\u8f03\u6392\u5e8f\u4e0d\u4f7f\u7528\u6bd4\u8f03\u904b\u7b97\u5b50\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u53ef\u9054 \\(O(n)\\) \uff0c\u4f46\u5176\u901a\u7528\u6027\u76f8\u5c0d\u8f03\u5dee\u3002

    "},{"location":"chapter_sorting/sorting_algorithm/#1112","title":"11.1.2 \u00a0 \u7406\u60f3\u6392\u5e8f\u6f14\u7b97\u6cd5","text":"

    \u57f7\u884c\u5feb\u3001\u539f\u5730\u3001\u7a69\u5b9a\u3001\u6b63\u5411\u81ea\u9069\u61c9\u3001\u901a\u7528\u6027\u597d\u3002\u986f\u7136\uff0c\u8fc4\u4eca\u70ba\u6b62\u5c1a\u672a\u767c\u73fe\u517c\u5177\u4ee5\u4e0a\u6240\u6709\u7279\u6027\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002\u56e0\u6b64\uff0c\u5728\u9078\u64c7\u6392\u5e8f\u6f14\u7b97\u6cd5\u6642\uff0c\u9700\u8981\u6839\u64da\u5177\u9ad4\u7684\u8cc7\u6599\u7279\u9ede\u548c\u554f\u984c\u9700\u6c42\u4f86\u6c7a\u5b9a\u3002

    \u63a5\u4e0b\u4f86\uff0c\u6211\u5011\u5c07\u5171\u540c\u5b78\u7fd2\u5404\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u4e26\u57fa\u65bc\u4e0a\u8ff0\u8a55\u50f9\u7dad\u5ea6\u5c0d\u5404\u500b\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u512a\u7f3a\u9ede\u9032\u884c\u5206\u6790\u3002

    "},{"location":"chapter_sorting/summary/","title":"11.11 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_sorting/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u6ce1\u6cab\u6392\u5e8f\u900f\u904e\u4ea4\u63db\u76f8\u9130\u5143\u7d20\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u900f\u904e\u65b0\u589e\u4e00\u500b\u6a19\u8a8c\u4f4d\u4f86\u5be6\u73fe\u63d0\u524d\u8fd4\u56de\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u6ce1\u6cab\u6392\u5e8f\u7684\u6700\u4f73\u6642\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(n)\\) \u3002
    • \u63d2\u5165\u6392\u5e8f\u6bcf\u8f2a\u5c07\u672a\u6392\u5e8f\u5340\u9593\u5167\u7684\u5143\u7d20\u63d2\u5165\u5230\u5df2\u6392\u5e8f\u5340\u9593\u7684\u6b63\u78ba\u4f4d\u7f6e\uff0c\u5f9e\u800c\u5b8c\u6210\u6392\u5e8f\u3002\u96d6\u7136\u63d2\u5165\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \uff0c\u4f46\u7531\u65bc\u55ae\u5143\u64cd\u4f5c\u76f8\u5c0d\u8f03\u5c11\uff0c\u56e0\u6b64\u5728\u5c0f\u8cc7\u6599\u91cf\u7684\u6392\u5e8f\u4efb\u52d9\u4e2d\u975e\u5e38\u53d7\u6b61\u8fce\u3002
    • \u5feb\u901f\u6392\u5e8f\u57fa\u65bc\u54e8\u5175\u5283\u5206\u64cd\u4f5c\u5be6\u73fe\u6392\u5e8f\u3002\u5728\u54e8\u5175\u5283\u5206\u4e2d\uff0c\u6709\u53ef\u80fd\u6bcf\u6b21\u90fd\u9078\u53d6\u5230\u6700\u5dee\u7684\u57fa\u6e96\u6578\uff0c\u5c0e\u81f4\u6642\u9593\u8907\u96dc\u5ea6\u52a3\u5316\u81f3 \\(O(n^2)\\) \u3002\u5f15\u5165\u4e2d\u4f4d\u6578\u57fa\u6e96\u6578\u6216\u96a8\u6a5f\u57fa\u6e96\u6578\u53ef\u4ee5\u964d\u4f4e\u9019\u7a2e\u52a3\u5316\u7684\u6a5f\u7387\u3002\u5c3e\u905e\u8ff4\u65b9\u6cd5\u53ef\u4ee5\u6709\u6548\u5730\u6e1b\u5c11\u905e\u8ff4\u6df1\u5ea6\uff0c\u5c07\u7a7a\u9593\u8907\u96dc\u5ea6\u6700\u4f73\u5316\u5230 \\(O(\\log n)\\) \u3002
    • \u5408\u4f75\u6392\u5e8f\u5305\u62ec\u5283\u5206\u548c\u5408\u4e26\u5169\u500b\u968e\u6bb5\uff0c\u5178\u578b\u5730\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\u3002\u5728\u5408\u4f75\u6392\u5e8f\u4e2d\uff0c\u6392\u5e8f\u9663\u5217\u9700\u8981\u5efa\u7acb\u8f14\u52a9\u9663\u5217\uff0c\u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1b\u7136\u800c\u6392\u5e8f\u93c8\u7d50\u4e32\u5217\u7684\u7a7a\u9593\u8907\u96dc\u5ea6\u53ef\u4ee5\u6700\u4f73\u5316\u81f3 \\(O(1)\\) \u3002
    • \u6876\u6392\u5e8f\u5305\u542b\u4e09\u500b\u6b65\u9a5f\uff1a\u8cc7\u6599\u5206\u6876\u3001\u6876\u5167\u6392\u5e8f\u548c\u5408\u4e26\u7d50\u679c\u3002\u5b83\u540c\u6a23\u9ad4\u73fe\u4e86\u5206\u6cbb\u7b56\u7565\uff0c\u9069\u7528\u65bc\u8cc7\u6599\u9ad4\u91cf\u5f88\u5927\u7684\u60c5\u6cc1\u3002\u6876\u6392\u5e8f\u7684\u95dc\u9375\u5728\u65bc\u5c0d\u8cc7\u6599\u9032\u884c\u5e73\u5747\u5206\u914d\u3002
    • \u8a08\u6578\u6392\u5e8f\u662f\u6876\u6392\u5e8f\u7684\u4e00\u500b\u7279\u4f8b\uff0c\u5b83\u900f\u904e\u7d71\u8a08\u8cc7\u6599\u51fa\u73fe\u7684\u6b21\u6578\u4f86\u5be6\u73fe\u6392\u5e8f\u3002\u8a08\u6578\u6392\u5e8f\u9069\u7528\u65bc\u8cc7\u6599\u91cf\u5927\u4f46\u8cc7\u6599\u7bc4\u570d\u6709\u9650\u7684\u60c5\u6cc1\uff0c\u4e26\u4e14\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8f49\u63db\u70ba\u6b63\u6574\u6578\u3002
    • \u57fa\u6578\u6392\u5e8f\u900f\u904e\u9010\u4f4d\u6392\u5e8f\u4f86\u5be6\u73fe\u8cc7\u6599\u6392\u5e8f\uff0c\u8981\u6c42\u8cc7\u6599\u80fd\u5920\u8868\u793a\u70ba\u56fa\u5b9a\u4f4d\u6578\u7684\u6578\u5b57\u3002
    • \u7e3d\u7684\u4f86\u8aaa\uff0c\u6211\u5011\u5e0c\u671b\u627e\u5230\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\uff0c\u5177\u6709\u9ad8\u6548\u7387\u3001\u7a69\u5b9a\u3001\u539f\u5730\u4ee5\u53ca\u6b63\u5411\u81ea\u9069\u61c9\u6027\u7b49\u512a\u9ede\u3002\u7136\u800c\uff0c\u6b63\u5982\u5176\u4ed6\u8cc7\u6599\u7d50\u69cb\u548c\u6f14\u7b97\u6cd5\u4e00\u6a23\uff0c\u6c92\u6709\u4e00\u7a2e\u6392\u5e8f\u6f14\u7b97\u6cd5\u80fd\u5920\u540c\u6642\u6eff\u8db3\u6240\u6709\u9019\u4e9b\u689d\u4ef6\u3002\u5728\u5be6\u969b\u61c9\u7528\u4e2d\uff0c\u6211\u5011\u9700\u8981\u6839\u64da\u8cc7\u6599\u7684\u7279\u6027\u4f86\u9078\u64c7\u5408\u9069\u7684\u6392\u5e8f\u6f14\u7b97\u6cd5\u3002
    • \u5716 11-19 \u5c0d\u6bd4\u4e86\u4e3b\u6d41\u6392\u5e8f\u6f14\u7b97\u6cd5\u7684\u6548\u7387\u3001\u7a69\u5b9a\u6027\u3001\u5c31\u5730\u6027\u548c\u81ea\u9069\u61c9\u6027\u7b49\u3002

    \u5716 11-19 \u00a0 \u6392\u5e8f\u6f14\u7b97\u6cd5\u5c0d\u6bd4

    "},{"location":"chapter_sorting/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u6392\u5e8f\u6f14\u7b97\u6cd5\u7a69\u5b9a\u6027\u5728\u4ec0\u9ebc\u60c5\u6cc1\u4e0b\u662f\u5fc5\u9700\u7684\uff1f

    \u5728\u73fe\u5be6\u4e2d\uff0c\u6211\u5011\u6709\u53ef\u80fd\u57fa\u65bc\u7269\u4ef6\u7684\u67d0\u500b\u5c6c\u6027\u9032\u884c\u6392\u5e8f\u3002\u4f8b\u5982\uff0c\u5b78\u751f\u6709\u59d3\u540d\u548c\u8eab\u9ad8\u5169\u500b\u5c6c\u6027\uff0c\u6211\u5011\u5e0c\u671b\u5be6\u73fe\u4e00\u500b\u591a\u7d1a\u6392\u5e8f\uff1a\u5148\u6309\u7167\u59d3\u540d\u9032\u884c\u6392\u5e8f\uff0c\u5f97\u5230 (A, 180) (B, 185) (C, 170) (D, 170) \uff1b\u518d\u5c0d\u8eab\u9ad8\u9032\u884c\u6392\u5e8f\u3002\u7531\u65bc\u6392\u5e8f\u6f14\u7b97\u6cd5\u4e0d\u7a69\u5b9a\uff0c\u56e0\u6b64\u53ef\u80fd\u5f97\u5230 (D, 170) (C, 170) (A, 180) (B, 185) \u3002

    \u53ef\u4ee5\u767c\u73fe\uff0c\u5b78\u751f D \u548c C \u7684\u4f4d\u7f6e\u767c\u751f\u4e86\u4ea4\u63db\uff0c\u59d3\u540d\u7684\u6709\u5e8f\u6027\u88ab\u7834\u58de\u4e86\uff0c\u800c\u9019\u662f\u6211\u5011\u4e0d\u5e0c\u671b\u770b\u5230\u7684\u3002

    Q\uff1a\u54e8\u5175\u5283\u5206\u4e2d\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u8207\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u7684\u9806\u5e8f\u53ef\u4ee5\u4ea4\u63db\u55ce\uff1f

    \u4e0d\u884c\uff0c\u7576\u6211\u5011\u4ee5\u6700\u5de6\u7aef\u5143\u7d20\u70ba\u57fa\u6e96\u6578\u6642\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u53f3\u5f80\u5de6\u67e5\u8a62\u201d\u518d\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002\u9019\u500b\u7d50\u8ad6\u6709\u4e9b\u53cd\u76f4\u89ba\uff0c\u6211\u5011\u4f86\u5256\u6790\u4e00\u4e0b\u539f\u56e0\u3002

    \u54e8\u5175\u5283\u5206 partition() \u7684\u6700\u5f8c\u4e00\u6b65\u662f\u4ea4\u63db nums[left] \u548c nums[i] \u3002\u5b8c\u6210\u4ea4\u63db\u5f8c\uff0c\u57fa\u6e96\u6578\u5de6\u908a\u7684\u5143\u7d20\u90fd <= \u57fa\u6e96\u6578\uff0c\u9019\u5c31\u8981\u6c42\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u524d nums[left] >= nums[i] \u5fc5\u9808\u6210\u7acb\u3002\u5047\u8a2d\u6211\u5011\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\uff0c\u90a3\u9ebc\u5982\u679c\u627e\u4e0d\u5230\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\uff0c\u5247\u6703\u5728 i == j \u6642\u8df3\u51fa\u8ff4\u5708\uff0c\u6b64\u6642\u53ef\u80fd nums[j] == nums[i] > nums[left]\u3002\u4e5f\u5c31\u662f\u8aaa\uff0c\u6b64\u6642\u6700\u5f8c\u4e00\u6b65\u4ea4\u63db\u64cd\u4f5c\u6703\u628a\u4e00\u500b\u6bd4\u57fa\u6e96\u6578\u66f4\u5927\u7684\u5143\u7d20\u4ea4\u63db\u81f3\u9663\u5217\u6700\u5de6\u7aef\uff0c\u5c0e\u81f4\u54e8\u5175\u5283\u5206\u5931\u6557\u3002

    \u8209\u500b\u4f8b\u5b50\uff0c\u7d66\u5b9a\u9663\u5217 [0, 0, 0, 0, 1] \uff0c\u5982\u679c\u5148\u201c\u5f9e\u5de6\u5411\u53f3\u67e5\u8a62\u201d\uff0c\u54e8\u5175\u5283\u5206\u5f8c\u9663\u5217\u70ba [1, 0, 0, 0, 0] \uff0c\u9019\u500b\u7d50\u679c\u662f\u4e0d\u6b63\u78ba\u7684\u3002

    \u518d\u6df1\u5165\u601d\u8003\u4e00\u4e0b\uff0c\u5982\u679c\u6211\u5011\u9078\u64c7 nums[right] \u70ba\u57fa\u6e96\u6578\uff0c\u90a3\u9ebc\u6b63\u597d\u53cd\u904e\u4f86\uff0c\u5fc5\u9808\u5148\u201c\u5f9e\u5de6\u5f80\u53f3\u67e5\u8a62\u201d\u3002

    Q\uff1a\u95dc\u65bc\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\uff0c\u70ba\u4ec0\u9ebc\u9078\u77ed\u7684\u9663\u5217\u80fd\u4fdd\u8b49\u905e\u8ff4\u6df1\u5ea6\u4e0d\u8d85\u904e \\(\\log n\\) \uff1f

    \u905e\u8ff4\u6df1\u5ea6\u5c31\u662f\u7576\u524d\u672a\u8fd4\u56de\u7684\u905e\u8ff4\u65b9\u6cd5\u7684\u6578\u91cf\u3002\u6bcf\u8f2a\u54e8\u5175\u5283\u5206\u6211\u5011\u5c07\u539f\u9663\u5217\u5283\u5206\u70ba\u5169\u500b\u5b50\u9663\u5217\u3002\u5728\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u5f8c\uff0c\u5411\u4e0b\u905e\u8ff4\u7684\u5b50\u9663\u5217\u9577\u5ea6\u6700\u5927\u70ba\u539f\u9663\u5217\u9577\u5ea6\u7684\u4e00\u534a\u3002\u5047\u8a2d\u6700\u5dee\u60c5\u6cc1\uff0c\u4e00\u76f4\u70ba\u4e00\u534a\u9577\u5ea6\uff0c\u90a3\u9ebc\u6700\u7d42\u7684\u905e\u8ff4\u6df1\u5ea6\u5c31\u662f \\(\\log n\\) \u3002

    \u56de\u9867\u539f\u59cb\u7684\u5feb\u901f\u6392\u5e8f\uff0c\u6211\u5011\u6709\u53ef\u80fd\u6703\u9023\u7e8c\u5730\u905e\u8ff4\u9577\u5ea6\u8f03\u5927\u7684\u9663\u5217\uff0c\u6700\u5dee\u60c5\u6cc1\u4e0b\u70ba \\(n\\)\u3001\\(n - 1\\)\u3001\\(\\dots\\)\u3001\\(2\\)\u3001\\(1\\) \uff0c\u905e\u8ff4\u6df1\u5ea6\u70ba \\(n\\) \u3002\u5c3e\u905e\u8ff4\u6700\u4f73\u5316\u53ef\u4ee5\u907f\u514d\u9019\u7a2e\u60c5\u6cc1\u51fa\u73fe\u3002

    Q\uff1a\u7576\u9663\u5217\u4e2d\u6240\u6709\u5143\u7d20\u90fd\u76f8\u7b49\u6642\uff0c\u5feb\u901f\u6392\u5e8f\u7684\u6642\u9593\u8907\u96dc\u5ea6\u662f \\(O(n^2)\\) \u55ce\uff1f\u8a72\u5982\u4f55\u8655\u7406\u9019\u7a2e\u9000\u5316\u60c5\u6cc1\uff1f

    \u662f\u7684\u3002\u5c0d\u65bc\u9019\u7a2e\u60c5\u6cc1\uff0c\u53ef\u4ee5\u8003\u616e\u900f\u904e\u54e8\u5175\u5283\u5206\u5c07\u9663\u5217\u5283\u5206\u70ba\u4e09\u500b\u90e8\u5206\uff1a\u5c0f\u65bc\u3001\u7b49\u65bc\u3001\u5927\u65bc\u57fa\u6e96\u6578\u3002\u50c5\u5411\u4e0b\u905e\u8ff4\u5c0f\u65bc\u548c\u5927\u65bc\u7684\u5169\u90e8\u5206\u3002\u5728\u8a72\u65b9\u6cd5\u4e0b\uff0c\u8f38\u5165\u5143\u7d20\u5168\u90e8\u76f8\u7b49\u7684\u9663\u5217\uff0c\u50c5\u4e00\u8f2a\u54e8\u5175\u5283\u5206\u5373\u53ef\u5b8c\u6210\u6392\u5e8f\u3002

    Q\uff1a\u6876\u6392\u5e8f\u7684\u6700\u5dee\u6642\u9593\u8907\u96dc\u5ea6\u70ba\u4ec0\u9ebc\u662f \\(O(n^2)\\) \uff1f

    \u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u5143\u7d20\u88ab\u5206\u81f3\u540c\u4e00\u500b\u6876\u4e2d\u3002\u5982\u679c\u6211\u5011\u63a1\u7528\u4e00\u500b \\(O(n^2)\\) \u6f14\u7b97\u6cd5\u4f86\u6392\u5e8f\u9019\u4e9b\u5143\u7d20\uff0c\u5247\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n^2)\\) \u3002

    "},{"location":"chapter_stack_and_queue/","title":"\u7b2c 5 \u7ae0 \u00a0 \u5806\u758a\u8207\u4f47\u5217","text":"

    Abstract

    \u5806\u758a\u5982\u540c\u758a\u8c93\u8c93\uff0c\u800c\u4f47\u5217\u5c31\u50cf\u8c93\u8c93\u6392\u968a\u3002

    \u5169\u8005\u5206\u5225\u4ee3\u8868\u5148\u5165\u5f8c\u51fa\u548c\u5148\u5165\u5148\u51fa\u7684\u908f\u8f2f\u95dc\u4fc2\u3002

    "},{"location":"chapter_stack_and_queue/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 5.1 \u00a0 \u5806\u758a
    • 5.2 \u00a0 \u4f47\u5217
    • 5.3 \u00a0 \u96d9\u5411\u4f47\u5217
    • 5.4 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_stack_and_queue/deque/","title":"5.3 \u00a0 \u96d9\u5411\u4f47\u5217","text":"

    \u5728\u4f47\u5217\u4e2d\uff0c\u6211\u5011\u50c5\u80fd\u522a\u9664\u982d\u90e8\u5143\u7d20\u6216\u5728\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u3002\u5982\u5716 5-7 \u6240\u793a\uff0c\u96d9\u5411\u4f47\u5217\uff08double-ended queue\uff09\u63d0\u4f9b\u4e86\u66f4\u9ad8\u7684\u9748\u6d3b\u6027\uff0c\u5141\u8a31\u5728\u982d\u90e8\u548c\u5c3e\u90e8\u57f7\u884c\u5143\u7d20\u7684\u65b0\u589e\u6216\u522a\u9664\u64cd\u4f5c\u3002

    \u5716 5-7 \u00a0 \u96d9\u5411\u4f47\u5217\u7684\u64cd\u4f5c

    "},{"location":"chapter_stack_and_queue/deque/#531","title":"5.3.1 \u00a0 \u96d9\u5411\u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u96d9\u5411\u4f47\u5217\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-3 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u7a31\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002

    \u8868 5-3 \u00a0 \u96d9\u5411\u4f47\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push_first() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u9996 \\(O(1)\\) push_last() \u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop_first() \u522a\u9664\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) pop_last() \u522a\u9664\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\) peek_first() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\) peek_last() \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 \\(O(1)\\)

    \u540c\u6a23\u5730\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u5df2\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig deque.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\ndeque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\ndeque.append(2)      # \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.appendleft(3)  # \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.appendleft(1)\n\n# \u8a2a\u554f\u5143\u7d20\nfront: int = deque[0]  # \u4f47\u5217\u9996\u5143\u7d20\nrear: int = deque[-1]  # \u4f47\u5217\u5c3e\u5143\u7d20\n\n# \u5143\u7d20\u51fa\u5217\npop_front: int = deque.popleft()  # \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\npop_rear: int = deque.pop()       # \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(deque)\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(deque) == 0\n
    deque.cpp
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\ndeque<int> deque;\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint front = deque.front(); // \u4f47\u5217\u9996\u5143\u7d20\nint back = deque.back();   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.pop_front();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.pop_back();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = deque.empty();\n
    deque.java
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nDeque<Integer> deque = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5);\ndeque.offerLast(4);\ndeque.offerFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.peekFirst();  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.peekLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.pollFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.pollLast();    // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.size();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = deque.isEmpty();\n
    deque.cs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 C# \u4e2d\uff0c\u5c07\u93c8\u7d50\u4e32\u5217 LinkedList \u770b\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nLinkedList<int> deque = new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.AddLast(2);   // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.AddLast(5);\ndeque.AddLast(4);\ndeque.AddFirst(3);  // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.AddFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.First.Value;  // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.Last.Value;    // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.RemoveFirst();  // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.RemoveLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.Count;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.Count == 0;\n
    deque_test.go
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u4f7f\u7528\ndeque := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.PushBack(2)      // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.PushBack(5)\ndeque.PushBack(4)\ndeque.PushFront(3)     // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.PushFront(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nfront := deque.Front() // \u4f47\u5217\u9996\u5143\u7d20\nrear := deque.Back()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\ndeque.Remove(front)    // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\ndeque.Remove(rear)     // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := deque.Len()\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := deque.Len() == 0\n
    deque.swift
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u96d9\u5411\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u96d9\u5411\u4f47\u5217\u4f86\u4f7f\u7528\nvar deque: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.append(2) // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.append(5)\ndeque.append(4)\ndeque.insert(3, at: 0) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.insert(1, at: 0)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nlet peekFirst = deque.first! // \u4f47\u5217\u9996\u5143\u7d20\nlet peekLast = deque.last! // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u4f7f\u7528 Array \u6a21\u64ec\u6642 popFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet popFirst = deque.removeFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nlet popLast = deque.removeLast() // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.count\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = deque.isEmpty\n
    deque.js
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst = deque[0];\nconst peekLast = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront = deque.shift();\nconst popBack = deque.pop();\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty = size === 0;\n
    deque.ts
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\nconst deque: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push(2);\ndeque.push(5);\ndeque.push(4);\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cunshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3);\ndeque.unshift(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nconst peekFirst: number = deque[0];\nconst peekLast: number = deque[deque.length - 1];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cshift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst popFront: number = deque.shift() as number;\nconst popBack: number = deque.pop() as number;\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size: number = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst isEmpty: boolean = size === 0;\n
    deque.dart
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0cQueue \u88ab\u5b9a\u7fa9\u70ba\u96d9\u5411\u4f47\u5217\nQueue<int> deque = Queue<int>();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.addLast(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.addLast(5);\ndeque.addLast(4);\ndeque.addFirst(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.addFirst(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nint peekFirst = deque.first; // \u4f47\u5217\u9996\u5143\u7d20\nint peekLast = deque.last;   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nint popFirst = deque.removeFirst(); // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nint popLast = deque.removeLast();   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = deque.length;\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = deque.isEmpty;\n
    deque.rs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(2);  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.push_back(5);\ndeque.push_back(4);\ndeque.push_front(3); // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.push_front(1);\n\n/* \u8a2a\u554f\u5143\u7d20 */\nif let Some(front) = deque.front() { // \u4f47\u5217\u9996\u5143\u7d20\n}\nif let Some(rear) = deque.back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop_front) = deque.pop_front() { // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\n}\nif let Some(pop_rear) = deque.pop_back() {   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
    deque.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u96d9\u5411\u4f47\u5217\n
    deque.kt
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\nval deque = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.offerLast(2)  // \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\ndeque.offerLast(5)\ndeque.offerLast(4)\ndeque.offerFirst(3) // \u65b0\u589e\u81f3\u4f47\u5217\u9996\ndeque.offerFirst(1)\n\n/* \u8a2a\u554f\u5143\u7d20 */\nval peekFirst = deque.peekFirst() // \u4f47\u5217\u9996\u5143\u7d20\nval peekLast = deque.peekLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\n\n/* \u5143\u7d20\u51fa\u5217 */\nval popFirst = deque.pollFirst() // \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217\nval popLast = deque.pollLast()   // \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = deque.size\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = deque.isEmpty()\n
    deque.rb
    # \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217\n# Ruby \u6c92\u6709\u5167\u76f4\u7684\u96d9\u7aef\u4f47\u5217\uff0c\u53ea\u80fd\u628a Array \u7576\u4f5c\u96d9\u7aef\u4f47\u5217\u4f86\u4f7f\u7528\ndeque = []\n\n# \u5143\u7d20\u5982\u968a\ndeque << 2\ndeque << 5\ndeque << 4\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#unshift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\ndeque.unshift(3)\ndeque.unshift(1)\n\n# \u8a2a\u554f\u5143\u7d20\npeek_first = deque.first\npeek_last = deque.last\n\n# \u5143\u7d20\u51fa\u5217\n# \u8acb\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0c Array#shift \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop_front = deque.shift\npop_back = deque.pop\n\n# \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\nsize = deque.length\n\n# \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = size.zero?\n
    deque.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/deque/#532","title":"5.3.2 \u00a0 \u96d9\u5411\u4f47\u5217\u5be6\u73fe *","text":"

    \u96d9\u5411\u4f47\u5217\u7684\u5be6\u73fe\u8207\u4f47\u5217\u985e\u4f3c\uff0c\u53ef\u4ee5\u9078\u64c7\u93c8\u7d50\u4e32\u5217\u6216\u9663\u5217\u4f5c\u70ba\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

    "},{"location":"chapter_stack_and_queue/deque/#1","title":"1. \u00a0 \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u56de\u9867\u4e0a\u4e00\u7bc0\u5167\u5bb9\uff0c\u6211\u5011\u4f7f\u7528\u666e\u901a\u55ae\u5411\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u4f47\u5217\uff0c\u56e0\u70ba\u5b83\u53ef\u4ee5\u65b9\u4fbf\u5730\u522a\u9664\u982d\u7bc0\u9ede\uff08\u5c0d\u61c9\u51fa\u5217\u64cd\u4f5c\uff09\u548c\u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e\u65b0\u7bc0\u9ede\uff08\u5c0d\u61c9\u5165\u5217\u64cd\u4f5c\uff09\u3002

    \u5c0d\u65bc\u96d9\u5411\u4f47\u5217\u800c\u8a00\uff0c\u982d\u90e8\u548c\u5c3e\u90e8\u90fd\u53ef\u4ee5\u57f7\u884c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u96d9\u5411\u4f47\u5217\u9700\u8981\u5be6\u73fe\u53e6\u4e00\u500b\u5c0d\u7a31\u65b9\u5411\u7684\u64cd\u4f5c\u3002\u70ba\u6b64\uff0c\u6211\u5011\u63a1\u7528\u201c\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u201d\u4f5c\u70ba\u96d9\u5411\u4f47\u5217\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002

    \u5982\u5716 5-8 \u6240\u793a\uff0c\u6211\u5011\u5c07\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u548c\u5c3e\u7bc0\u9ede\u8996\u70ba\u96d9\u5411\u4f47\u5217\u7684\u4f47\u5217\u9996\u548c\u4f47\u5217\u5c3e\uff0c\u540c\u6642\u5be6\u73fe\u5728\u5169\u7aef\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u7684\u529f\u80fd\u3002

    LinkedListDequepush_last()push_first()pop_last()pop_first()

    \u5716 5-8 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_deque.py
    class ListNode:\n    \"\"\"\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\"\"\"\n\n    def __init__(self, val: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self.val: int = val\n        self.next: ListNode | None = None  # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n        self.prev: ListNode | None = None  # \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\nclass LinkedListDeque:\n    \"\"\"\u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0  # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int, is_front: bool):\n        \"\"\"\u5165\u5217\u64cd\u4f5c\"\"\"\n        node = ListNode(num)\n        # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if self.is_empty():\n            self._front = self._rear = node\n        # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        elif is_front:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            self._front.prev = node\n            node.next = self._front\n            self._front = node  # \u66f4\u65b0\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else:\n            # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            self._rear.next = node\n            node.prev = self._rear\n            self._rear = node  # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        self._size += 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        self.push(num, True)\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        self.push(num, False)\n\n    def pop(self, is_front: bool) -> int:\n        \"\"\"\u51fa\u5217\u64cd\u4f5c\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if is_front:\n            val: int = self._front.val  # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            # \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else:\n            val: int = self._rear.val  # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            # \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        self._size -= 1  # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        return self.pop(True)\n\n    def pop_last(self) -> int:\n        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        return self.pop(False)\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._rear.val\n\n    def to_array(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nstruct DoublyListNode {\n    int val;              // \u7bc0\u9ede\u503c\n    DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\n    DoublyListNode(int val) : val(val), prev(nullptr), next(nullptr) {\n    }\n};\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n  private:\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize = 0;              // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    LinkedListDeque() : front(nullptr), rear(nullptr) {\n    }\n\n    /* \u6790\u69cb\u65b9\u6cd5 */\n    ~LinkedListDeque() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        DoublyListNode *pre, *cur = front;\n        while (cur != nullptr) {\n            pre = cur;\n            cur = cur->next;\n            delete pre;\n        }\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void push(int num, bool isFront) {\n        DoublyListNode *node = new DoublyListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front->prev = node;\n            node->next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear->next = node;\n            node->prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int pop(bool isFront) {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front->val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear->val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return rear->val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    int val; // \u7bc0\u9ede\u503c\n    ListNode next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    ListNode prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    ListNode(int val) {\n        this.val = val;\n        prev = next = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private void push(int num, boolean isFront) {\n        ListNode node = new ListNode(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty())\n            front = rear = node;\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear.next = node;\n            node.prev = rear;\n            rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private int pop(boolean isFront) {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        int val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode fNext = front.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front.next = null;\n            }\n            front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            val = rear.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode rPrev = rear.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear.prev = null;\n            }\n            rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        return pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        return pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return rear.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(int val) {\n    public int val = val;       // \u7bc0\u9ede\u503c\n    public ListNode? next = null; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    public ListNode? prev = null; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    ListNode? front, rear; // \u982d\u7bc0\u9ede front, \u5c3e\u7bc0\u9ede rear\n    int queSize = 0;      // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    public LinkedListDeque() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    void Push(int num, bool isFront) {\n        ListNode node = new(num);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (IsEmpty()) {\n            front = node;\n            rear = node;\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front!.prev = node;\n            node.next = front;\n            front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede                           \n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear!.next = node;\n            node.prev = rear;\n            rear = node;  // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        Push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        Push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    int? Pop(bool isFront) {\n        if (IsEmpty())\n            throw new Exception();\n        int? val;\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            val = front?.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            ListNode? fNext = front?.next;\n            if (fNext != null) {\n                fNext.prev = null;\n                front!.next = null;\n            }\n            front = fNext;   // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear?.val;  // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            ListNode? rPrev = rear?.prev;\n            if (rPrev != null) {\n                rPrev.next = null;\n                rear!.prev = null;\n            }\n            rear = rPrev;    // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n\n        queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int? PopFirst() {\n        return Pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int? PopLast() {\n        return Pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int? PeekFirst() {\n        if (IsEmpty())\n            throw new Exception();\n        return front?.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int? PeekLast() {\n        if (IsEmpty())\n            throw new Exception();\n        return rear?.val;\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype linkedListDeque struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u96d9\u7aef\u4f47\u5217 */\nfunc newLinkedListDeque() *linkedListDeque {\n    return &linkedListDeque{\n        data: list.New(),\n    }\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushFirst(value any) {\n    s.data.PushFront(value)\n}\n\n/* \u4f47\u5217\u5c3e\u5143\u7d20\u5165\u5217 */\nfunc (s *linkedListDeque) pushLast(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 */\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/* \u4f47\u5217\u5c3e\u5143\u7d20\u51fa\u5217 */\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/* \u8a2a\u554f\u4f47\u5217\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/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListDeque) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListDeque) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListDeque) toList() *list.List {\n    return s.data\n}\n
    linkedlist_deque.swift
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var next: ListNode? // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    weak var prev: ListNode? // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n    init(val: Int) {\n        self.val = val\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede rear\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    private func push(num: Int, isFront: Bool) {\n        let node = ListNode(val: num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if isEmpty() {\n            front = node\n            rear = node\n        }\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        else if isFront {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size += 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        push(num: num, isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        push(num: num, isFront: false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    private func pop(isFront: Bool) -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        let val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if isFront {\n            val = front!.val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            let fNext = front?.next\n            if fNext != nil {\n                fNext?.prev = nil\n                front?.next = nil\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        else {\n            val = rear!.val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            let rPrev = rear?.prev\n            if rPrev != nil {\n                rPrev?.next = nil\n                rear?.prev = nil\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        _size -= 1 // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        pop(isFront: true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        pop(isFront: false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return rear!.val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val; // \u7bc0\u9ede\u503c\n\n    constructor(val) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    #front; // \u982d\u7bc0\u9ede front\n    #rear; // \u5c3e\u7bc0\u9ede rear\n    #queSize; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n        this.#queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.#rear.next = node;\n            node.prev = this.#rear;\n            this.#rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val) {\n        const node = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.#queSize === 0) {\n            this.#front = node;\n            this.#rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.#front.prev = node;\n            node.next = this.#front;\n            this.#front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst() {\n        if (this.#queSize === 0) {\n            return null;\n        }\n        const value = this.#front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        this.#queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        return this.#queSize === 0 ? null : this.#rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst() {\n        return this.#queSize === 0 ? null : this.#front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n    prev: ListNode; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    next: ListNode; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528 (\u6307\u6a19)\n    val: number; // \u7bc0\u9ede\u503c\n\n    constructor(val: number) {\n        this.val = val;\n        this.next = null;\n        this.prev = null;\n    }\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private front: ListNode; // \u982d\u7bc0\u9ede front\n    private rear: ListNode; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n        this.queSize = 0;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c */\n    pushLast(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            this.rear.next = node;\n            node.prev = this.rear;\n            this.rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c */\n    pushFirst(val: number): void {\n        const node: ListNode = new ListNode(val);\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (this.queSize === 0) {\n            this.front = node;\n            this.rear = node;\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            this.front.prev = node;\n            node.next = this.front;\n            this.front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n        }\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c */\n    popLast(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.rear.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c */\n    popFirst(): number {\n        if (this.queSize === 0) {\n            return null;\n        }\n        const value: number = this.front.val; // \u5132\u5b58\u5c3e\u7bc0\u9ede\u503c\n        // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n        this.queSize--;\n        return value;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        return this.queSize === 0 ? null : this.rear.val;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peekFirst(): number {\n        return this.queSize === 0 ? null : this.front.val;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5217\u5370\u96d9\u5411\u4f47\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode {\n  int val; // \u7bc0\u9ede\u503c\n  ListNode? next; // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  ListNode? prev; // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n\n  ListNode(this.val, {this.next, this.prev});\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u5c0d\u5217 */\nclass LinkedListDeque {\n  late ListNode? _front; // \u982d\u7bc0\u9ede _front\n  late ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n  LinkedListDeque() {\n    this._front = null;\n    this._rear = null;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u9577\u5ea6 */\n  int size() {\n    return this._queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return size() == 0;\n  }\n\n  /* \u5165\u5217\u64cd\u4f5c */\n  void push(int _num, bool isFront) {\n    final ListNode node = ListNode(_num);\n    if (isEmpty()) {\n      // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 _front \u548c _rear \u90fd\u6307\u5411 node\n      _front = _rear = node;\n    } else if (isFront) {\n      // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      _front!.prev = node;\n      node.next = _front;\n      _front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n      // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      _rear!.next = node;\n      node.prev = _rear;\n      _rear = node; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    push(_num, true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    push(_num, false);\n  }\n\n  /* \u51fa\u5217\u64cd\u4f5c */\n  int? pop(bool isFront) {\n    // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de null\n    if (isEmpty()) {\n      return null;\n    }\n    final int val;\n    if (isFront) {\n      // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n      val = _front!.val; // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      // \u522a\u9664\u982d\u7bc0\u9ede\n      ListNode? fNext = _front!.next;\n      if (fNext != null) {\n        fNext.prev = null;\n        _front!.next = null;\n      }\n      _front = fNext; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    } else {\n      // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n      val = _rear!.val; // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      // \u522a\u9664\u5c3e\u7bc0\u9ede\n      ListNode? rPrev = _rear!.prev;\n      if (rPrev != null) {\n        rPrev.next = null;\n        _rear!.prev = null;\n      }\n      _rear = rPrev; // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    }\n    _queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int? popFirst() {\n    return pop(true);\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int? popLast() {\n    return pop(false);\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int? peekFirst() {\n    return _front?.val;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int? peekLast() {\n    return _rear?.val;\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\npub struct ListNode<T> {\n    pub val: T,                                 // \u7bc0\u9ede\u503c\n    pub next: Option<Rc<RefCell<ListNode<T>>>>, // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n    pub prev: Option<Rc<RefCell<ListNode<T>>>>, // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListDeque<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u96d9\u5411\u4f47\u5217\u7684\u9577\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    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    pub fn push(&mut self, num: T, is_front: bool) {\n        let node = ListNode::new(num);\n        // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        if is_front {\n            match self.front.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.rear = Some(node.clone());\n                    self.front = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\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\u982d\u7bc0\u9ede\n                }\n            }\n        }\n        // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        else {\n            match self.rear.take() {\n                // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n                None => {\n                    self.front = Some(node.clone());\n                    self.rear = Some(node);\n                }\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\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\u7bc0\u9ede\n                }\n            }\n        }\n        self.que_size += 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: T) {\n        self.push(num, true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: T) {\n        self.push(num, false);\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    pub fn pop(&mut self, is_front: bool) -> Option<T> {\n        // \u82e5\u4f47\u5217\u70ba\u7a7a\uff0c\u76f4\u63a5\u8fd4\u56de None\n        if self.is_empty() {\n            return None;\n        };\n        // \u4f47\u5217\u9996\u51fa\u5217\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\u982d\u7bc0\u9ede\n                    }\n                    None => {\n                        self.rear.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_front).ok().unwrap().into_inner().val\n            })\n        }\n        // \u4f47\u5217\u5c3e\u51fa\u5217\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\u7bc0\u9ede\n                    }\n                    None => {\n                        self.front.take();\n                    }\n                }\n                self.que_size -= 1; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n                Rc::try_unwrap(old_rear).ok().unwrap().into_inner().val\n            })\n        }\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    pub fn pop_first(&mut self) -> Option<T> {\n        return self.pop(true);\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    pub fn pop_last(&mut self) -> Option<T> {\n        return self.pop(false);\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek_first(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    pub fn peek_last(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.rear.as_ref()\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\ntypedef struct DoublyListNode {\n    int val;                     // \u7bc0\u9ede\u503c\n    struct DoublyListNode *next; // \u5f8c\u7e7c\u7bc0\u9ede\n    struct DoublyListNode *prev; // \u524d\u9a45\u7bc0\u9ede\n} DoublyListNode;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delDoublyListNode(DoublyListNode *node) {\n    free(node);\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    DoublyListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;                  // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n} LinkedListDeque;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delLinkedListdeque(LinkedListDeque *deque) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\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    // \u91cb\u653e deque \u7d50\u69cb\u9ad4\n    free(deque);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListDeque *deque) {\n    return (size(deque) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListDeque *deque, int num, bool isFront) {\n    DoublyListNode *node = newDoublyListNode(num);\n    // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411node\n    if (empty(deque)) {\n        deque->front = deque->rear = node;\n    }\n    // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    else if (isFront) {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n        deque->front->prev = node;\n        node->next = deque->front;\n        deque->front = node; // \u66f4\u65b0\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else {\n        // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n        deque->rear->next = node;\n        node->prev = deque->rear;\n        deque->rear = node;\n    }\n    deque->queSize++; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(LinkedListDeque *deque, int num) {\n    push(deque, num, true);\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(LinkedListDeque *deque, int num) {\n    push(deque, num, false);\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(LinkedListDeque *deque) {\n    assert(size(deque) && deque->front);\n    return deque->front->val;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(LinkedListDeque *deque) {\n    assert(size(deque) && deque->rear);\n    return deque->rear->val;\n}\n\n/* \u51fa\u5217 */\nint pop(LinkedListDeque *deque, bool isFront) {\n    if (empty(deque))\n        return -1;\n    int val;\n    // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if (isFront) {\n        val = peekFirst(deque); // \u66ab\u5b58\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n    }\n    // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else {\n        val = peekLast(deque); // \u66ab\u5b58\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n    }\n    deque->queSize--; // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    return val;\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(LinkedListDeque *deque) {\n    return pop(deque, true);\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(LinkedListDeque *deque) {\n    return pop(deque, false);\n}\n\n/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListDeque(LinkedListDeque *deque) {\n    int *arr = malloc(sizeof(int) * deque->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\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
    /* \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede */\nclass ListNode(var _val: Int) {\n    // \u7bc0\u9ede\u503c\n    var next: ListNode? = null // \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n    var prev: ListNode? = null // \u524d\u9a45\u7bc0\u9ede\u5f15\u7528\n}\n\n/* \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass LinkedListDeque {\n    private var front: ListNode? = null // \u982d\u7bc0\u9ede front\n    private var rear: ListNode? = null // \u5c3e\u7bc0\u9ede rear\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217\u64cd\u4f5c */\n    fun push(num: Int, isFront: Boolean) {\n        val node = ListNode(num)\n        // \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n        if (isEmpty()) {\n            rear = node\n            front = rear\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n        } else if (isFront) {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n            front?.prev = node\n            node.next = front\n            front = node // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n        } else {\n            // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n            rear?.next = node\n            node.prev = rear\n            rear = node // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize++ // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        push(num, true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        push(num, false)\n    }\n\n    /* \u51fa\u5217\u64cd\u4f5c */\n    fun pop(isFront: Boolean): Int {\n        if (isEmpty()) \n            throw IndexOutOfBoundsException()\n        val _val: Int\n        // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n        if (isFront) {\n            _val = front!!._val // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            val fNext = front!!.next\n            if (fNext != null) {\n                fNext.prev = null\n                front!!.next = null\n            }\n            front = fNext // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n        } else {\n            _val = rear!!._val // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n            // \u522a\u9664\u5c3e\u7bc0\u9ede\n            val rPrev = rear!!.prev\n            if (rPrev != null) {\n                rPrev.next = null\n                rear!!.prev = null\n            }\n            rear = rPrev // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n        }\n        queSize-- // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        return _val\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        return pop(true)\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        return pop(false)\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return rear!!._val\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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### \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nclass ListNode\n  attr_accessor :val\n  attr_accessor :next # \u5f8c\u7e7c\u7bc0\u9ede\u5f15\u7528\n  attr_accessor :prev # \u524d\u8ec0\u7bc0\u9ede\u5f15\u7528\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(val)\n    @val = val\n  end\nend\n\n### \u57fa\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass LinkedListDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0     # \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217\u64cd\u4f5c ###\n  def push(num, is_front)\n    node = ListNode.new(num)\n    # \u82e5\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c \u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n    if is_empty?\n      @front = @rear = node\n    # \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n    elsif is_front\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n      @front.prev = node\n      node.next = @front\n      @front = node # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n    else\n      # \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n      @rear.next = node\n      node.prev = @rear\n      @rear = node # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size += 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    push(num, true)\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    push(num, false)\n  end\n\n  ### \u51fa\u5217\u64cd\u4f5c ###\n  def pop(is_front)\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n    if is_front\n      val = @front.val # \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n      # \u522a\u9664\u982d\u7bc0\u9ede\n      fnext = @front.next\n      unless fnext.nil?\n        fnext.prev = nil\n        @front.next = nil\n      end\n      @front = fnext # \u66f4\u65b0\u982d\u7bc0\u9ede\n    # \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n    else\n      val = @rear.val # \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n      # \u522a\u9664\u5c3e\u7bc0\u9ede\n      rprev = @rear.prev\n      unless rprev.nil?\n        rprev.next = nil\n        @rear.prev = nil\n      end\n      @rear = rprev # \u66f4\u65b0\u5c3e\u7bc0\u9ede\n    end\n    @size -= 1 # \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n\n    val\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    pop(true)\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_last\n    pop(false)\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @rear.val\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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
    // \u96d9\u5411\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\nfn ListNode(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        val: T = undefined,     // \u7bc0\u9ede\u503c\n        next: ?*Self = null,    // \u5f8c\u7e7c\u7bc0\u9ede\u6307\u6a19\n        prev: ?*Self = null,    // \u524d\u9a45\u7bc0\u9ede\u6307\u6a19\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\u65bc\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\nfn LinkedListDeque(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*ListNode(T) = null,                    // \u982d\u7bc0\u9ede front\n        rear: ?*ListNode(T) = null,                     // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                             // \u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u5165\u5217\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\u93c8\u7d50\u4e32\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4 front \u548c rear \u90fd\u6307\u5411 node\n            if (self.isEmpty()) {\n                self.front = node;\n                self.rear = node;\n            // \u4f47\u5217\u9996\u5165\u5217\u64cd\u4f5c\n            } else if (is_front) {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u982d\u90e8\n                self.front.?.prev = node;\n                node.next = self.front;\n                self.front = node;  // \u66f4\u65b0\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u5165\u5217\u64cd\u4f5c\n            } else {\n                // \u5c07 node \u65b0\u589e\u81f3\u93c8\u7d50\u4e32\u5217\u5c3e\u90e8\n                self.rear.?.next = node;\n                node.prev = self.rear;\n                self.rear = node;   // \u66f4\u65b0\u5c3e\u7bc0\u9ede\n            }\n            self.que_size += 1;      // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n        } \n\n        // \u4f47\u5217\u9996\u5165\u5217\n        pub fn pushFirst(self: *Self, num: T) !void {\n            try self.push(num, true);\n        } \n\n        // \u4f47\u5217\u5c3e\u5165\u5217\n        pub fn pushLast(self: *Self, num: T) !void {\n            try self.push(num, false);\n        } \n\n        // \u51fa\u5217\u64cd\u4f5c\n        pub fn pop(self: *Self, is_front: bool) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            var val: T = undefined;\n            // \u4f47\u5217\u9996\u51fa\u5217\u64cd\u4f5c\n            if (is_front) {\n                val = self.front.?.val;     // \u66ab\u5b58\u982d\u7bc0\u9ede\u503c\n                // \u522a\u9664\u982d\u7bc0\u9ede\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\u982d\u7bc0\u9ede\n            // \u4f47\u5217\u5c3e\u51fa\u5217\u64cd\u4f5c\n            } else {\n                val = self.rear.?.val;      // \u66ab\u5b58\u5c3e\u7bc0\u9ede\u503c\n                // \u522a\u9664\u5c3e\u7bc0\u9ede\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\u7bc0\u9ede\n            }\n            self.que_size -= 1;              // \u66f4\u65b0\u4f47\u5217\u9577\u5ea6\n            return val;\n        } \n\n        // \u4f47\u5217\u9996\u51fa\u5217\n        pub fn popFirst(self: *Self) T {\n            return self.pop(true);\n        } \n\n        // \u4f47\u5217\u5c3e\u51fa\u5217\n        pub fn popLast(self: *Self) T {\n            return self.pop(false);\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peekFirst(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\n        pub fn peekLast(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n            return self.rear.?.val;\n        }\n\n        // \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\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\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u5982\u5716 5-9 \u6240\u793a\uff0c\u8207\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u985e\u4f3c\uff0c\u6211\u5011\u4e5f\u53ef\u4ee5\u4f7f\u7528\u74b0\u5f62\u9663\u5217\u4f86\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u3002

    ArrayDequepush_last()push_first()pop_last()pop_first()

    \u5716 5-9 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u96d9\u5411\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u5728\u4f47\u5217\u7684\u5be6\u73fe\u57fa\u790e\u4e0a\uff0c\u50c5\u9700\u589e\u52a0\u201c\u4f47\u5217\u9996\u5165\u5217\u201d\u548c\u201c\u4f47\u5217\u5c3e\u51fa\u5217\u201d\u7684\u65b9\u6cd5\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_deque.py
    class ArrayDeque:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217\"\"\"\n\n    def __init__(self, capacity: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * capacity\n        self._front: int = 0\n        self._size: int = 0\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def index(self, i: int) -> int:\n        \"\"\"\u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15\"\"\"\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + self.capacity()) % self.capacity()\n\n    def push_first(self, num: int):\n        \"\"\"\u4f47\u5217\u9996\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self._front = self.index(self._front - 1)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self._nums[self._front] = num\n        self._size += 1\n\n    def push_last(self, num: int):\n        \"\"\"\u4f47\u5217\u5c3e\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        rear = self.index(self._front + self._size)\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop_first(self) -> int:\n        \"\"\"\u4f47\u5217\u9996\u51fa\u5217\"\"\"\n        num = self.peek_first()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\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        \"\"\"\u4f47\u5217\u5c3e\u51fa\u5217\"\"\"\n        num = self.peek_last()\n        self._size -= 1\n        return num\n\n    def peek_first(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def peek_last(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        # \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  private:\n    vector<int> nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;      // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayDeque(int capacity) {\n        nums.resize(capacity);\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return nums.size();\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    void pushFirst(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    void pushLast(int num) {\n        if (queSize == capacity()) {\n            cout << \"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peekFirst() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    int peekLast() {\n        if (isEmpty())\n            throw out_of_range(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        this.nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private int index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void pushFirst(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void pushLast(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int popFirst() {\n        int num = peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int popLast() {\n        int num = peekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peekFirst() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int peekLast() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayDeque(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    int Index(int i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + Capacity()) % Capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    public void PushFirst(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = Index(front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    public void PushLast(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        int rear = Index(front + queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    public int PopFirst() {\n        int num = PeekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = Index(front + 1);\n        queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    public int PopLast() {\n        int num = PeekLast();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int PeekFirst() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        return nums[front];\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    public int PeekLast() {\n        if (IsEmpty()) {\n            throw new InvalidOperationException();\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        int last = Index(front + queSize - 1);\n        return nums[last];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntype arrayDeque struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\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/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayDeque) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayDeque) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nfunc (q *arrayDeque) index(i int) int {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + q.queCapacity) % q.queCapacity\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nfunc (q *arrayDeque) pushFirst(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    q.front = q.index(q.front - 1)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    q.nums[q.front] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nfunc (q *arrayDeque) pushLast(num int) {\n    if q.queSize == q.queCapacity {\n        fmt.Println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear := q.index(q.front + q.queSize)\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nfunc (q *arrayDeque) popFirst() any {\n    num := q.peekFirst()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    q.front = q.index(q.front + 1)\n    q.queSize--\n    return num\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nfunc (q *arrayDeque) popLast() any {\n    num := q.peekLast()\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\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/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nfunc (q *arrayDeque) peekLast() any {\n    if q.isEmpty() {\n        return nil\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last := q.index(q.front + q.queSize - 1)\n    return q.nums[last]\n}\n\n/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (q *arrayDeque) toSlice() []int {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    init(capacity: Int) {\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private func index(i: Int) -> Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    func pushFirst(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(i: front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    func pushLast(num: Int) {\n        if size() == capacity() {\n            print(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = index(i: front + size())\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    func popFirst() -> Int {\n        let num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(i: front + 1)\n        _size -= 1\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    func popLast() -> Int {\n        let num = peekLast()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peekFirst() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    func peekLast() -> Int {\n        if isEmpty() {\n            fatalError(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        }\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        let last = index(i: front + size() - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[index(i: $0)] }\n    }\n}\n
    array_deque.js
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    #nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n        this.#front = 0;\n        this.#queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i) {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.#front = this.index(this.#front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.#nums[this.#front] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num) {\n        if (this.#queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear = this.index(this.#front + this.#queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst() {\n        const num = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.#front = this.index(this.#front + 1);\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast() {\n        const num = this.peekLast();\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast() {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = 0;\n        this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    index(i: number): number {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + this.capacity()) % this.capacity();\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pushFirst(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        this.front = this.index(this.front - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        this.nums[this.front] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pushLast(num: number): void {\n        if (this.queSize === this.capacity()) {\n            console.log('\u96d9\u5411\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        const rear: number = this.index(this.front + this.queSize);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    popFirst(): number {\n        const num: number = this.peekFirst();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        this.front = this.index(this.front + 1);\n        this.queSize--;\n        return num;\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    popLast(): number {\n        const num: number = this.peekLast();\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    peekLast(): number {\n        if (this.isEmpty()) throw new Error('The Deque Is Empty.');\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nclass ArrayDeque {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayDeque(int capacity) {\n    this._nums = List.filled(capacity, 0);\n    this._front = this._queSize = 0;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capacity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n  int index(int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return (i + capacity()) % capacity();\n  }\n\n  /* \u4f47\u5217\u9996\u5165\u5217 */\n  void pushFirst(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe _front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    _front = index(_front - 1);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    _nums[_front] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u5c3e\u5165\u5217 */\n  void pushLast(int _num) {\n    if (_queSize == capacity()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = index(_front + _queSize);\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u4f47\u5217\u9996\u51fa\u5217 */\n  int popFirst() {\n    int _num = peekFirst();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u53f3\u79fb\u52d5\u4e00\u4f4d\n    _front = index(_front + 1);\n    _queSize--;\n    return _num;\n  }\n\n  /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n  int popLast() {\n    int _num = peekLast();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peekFirst() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n  int peekLast() {\n    if (isEmpty()) {\n      throw Exception(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\");\n    }\n    // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    int last = index(_front + _queSize - 1);\n    return _nums[last];\n  }\n\n  /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\nstruct ArrayDeque {\n    nums: Vec<i32>,  // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: usize,    // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: usize, // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n}\n\nimpl ArrayDeque {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    pub fn capacity(&self) -> usize {\n        self.nums.len()\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    fn index(&self, i: i32) -> usize {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return ((i + self.capacity() as i32) % self.capacity() as i32) as usize;\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    pub fn push_first(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        self.front = self.index(self.front as i32 - 1);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        self.nums[self.front] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    pub fn push_last(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        let rear = self.index(self.front as i32 + self.que_size as i32);\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear] = num;\n        self.que_size += 1;\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fn pop_first(&mut self) -> i32 {\n        let num = self.peek_first();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        self.front = self.index(self.front as i32 + 1);\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fn pop_last(&mut self) -> i32 {\n        let num = self.peek_last();\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fn peek_first(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        self.nums[self.front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fn peek_last(&self) -> i32 {\n        if self.is_empty() {\n            panic!(\"\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\")\n        };\n        // \u8a08\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\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fn to_array(&self) -> Vec<i32> {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayDeque;\n\n/* \u5efa\u69cb\u5b50 */\nArrayDeque *newArrayDeque(int capacity) {\n    ArrayDeque *deque = (ArrayDeque *)malloc(sizeof(ArrayDeque));\n    // \u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f */\nvoid delArrayDeque(ArrayDeque *deque) {\n    free(deque->nums);\n    free(deque);\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayDeque *deque) {\n    return deque->queCapacity;\n}\n\n/* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayDeque *deque) {\n    return deque->queSize;\n}\n\n/* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayDeque *deque) {\n    return deque->queSize == 0;\n}\n\n/* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\nint dequeIndex(ArrayDeque *deque, int i) {\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u56de\u5230\u982d\u90e8\n    // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n    return ((i + capacity(deque)) % capacity(deque));\n}\n\n/* \u4f47\u5217\u9996\u5165\u5217 */\nvoid pushFirst(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u56de\u5230\u5c3e\u90e8\n    deque->front = dequeIndex(deque, deque->front - 1);\n    // \u5c07 num \u65b0\u589e\u5230\u4f47\u5217\u9996\n    deque->nums[deque->front] = num;\n    deque->queSize++;\n}\n\n/* \u4f47\u5217\u5c3e\u5165\u5217 */\nvoid pushLast(ArrayDeque *deque, int num) {\n    if (deque->queSize == capacity(deque)) {\n        printf(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    int rear = dequeIndex(deque, deque->front + deque->queSize);\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    deque->nums[rear] = num;\n    deque->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peekFirst(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    return deque->nums[deque->front];\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\nint peekLast(ArrayDeque *deque) {\n    // \u8a2a\u554f\u7570\u5e38\uff1a\u96d9\u5411\u4f47\u5217\u70ba\u7a7a\n    assert(empty(deque) == 0);\n    int last = dequeIndex(deque, deque->front + deque->queSize - 1);\n    return deque->nums[last];\n}\n\n/* \u4f47\u5217\u9996\u51fa\u5217 */\nint popFirst(ArrayDeque *deque) {\n    int num = peekFirst(deque);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    deque->front = dequeIndex(deque, deque->front + 1);\n    deque->queSize--;\n    return num;\n}\n\n/* \u4f47\u5217\u5c3e\u51fa\u5217 */\nint popLast(ArrayDeque *deque) {\n    int num = peekLast(deque);\n    deque->queSize--;\n    return num;\n}\n
    array_deque.kt
    /* \u5efa\u69cb\u5b50 */\nclass ArrayDeque(capacity: Int) {\n    private var nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u96d9\u5411\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u96d9\u5411\u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 */\n    private fun index(i: Int): Int {\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n        // \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\uff0c\u56de\u5230\u5c3e\u90e8\n        return (i + capacity()) % capacity()\n    }\n\n    /* \u4f47\u5217\u9996\u5165\u5217 */\n    fun pushFirst(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n        front = index(front - 1)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n        nums[front] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u5c3e\u5165\u5217 */\n    fun pushLast(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u96d9\u5411\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        val rear = index(front + queSize)\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u4f47\u5217\u9996\u51fa\u5217 */\n    fun popFirst(): Int {\n        val num = peekFirst()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n        front = index(front + 1)\n        queSize--\n        return num\n    }\n\n    /* \u4f47\u5217\u5c3e\u51fa\u5217 */\n    fun popLast(): Int {\n        val num = peekLast()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peekFirst(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 */\n    fun peekLast(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        // \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n        val last = index(front + queSize - 1)\n        return nums[last]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u96d9\u5411\u4f47\u5217 ###\nclass ArrayDeque\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(capacity)\n    @nums = Array.new(capacity, 0)\n    @front = 0\n    @size = 0\n  end\n\n  ### \u7372\u53d6\u96d9\u5411\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u96d9\u5411\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u4f47\u5217\u9996\u5165\u5217 ###\n  def push_first(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5de6\u79fb\u52d5\u4e00\u4f4d\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe front \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\u56de\u5230\u5c3e\u90e8\n    @front = index(@front - 1)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u9996\n    @nums[@front] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u5c3e\u5165\u5217 ###\n  def push_last(num)\n    if size == capacity\n      puts '\u96d9\u5411\u4f47\u5217\u5df2\u6eff'\n      return\n    end\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    rear = index(@front + size)\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u4f47\u5217\u9996\u51fa\u5217 ###\n  def pop_first\n    num = peek_first\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\n    @front = index(@front + 1)\n    @size -= 1\n    num\n  end\n\n  ### \u4f47\u5217\u5c3e\u51fa\u5217 ###\n  def pop_last\n    num = peek_last\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek_first\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u5c3e\u5143\u7d20 ###\n  def peek_last\n    raise IndexError, '\u96d9\u5411\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    # \u8a08\u7b97\u5c3e\u5143\u7d20\u7d22\u5f15\n    last = index(@front + size - 1)\n    @nums[last]\n  end\n\n  ### \u8fd4\u56de\u9663\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    # \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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  ### \u8a08\u7b97\u74b0\u5f62\u9663\u5217\u7d22\u5f15 ###\n  def index(i)\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe\u9663\u5217\u9996\u5c3e\u76f8\u9023\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\uff0c\u56de\u5230\u982d\u90e8\n    # \u7576 i \u8d8a\u904e\u9663\u5217\u982d\u90e8\u5f8c\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 \u96d9\u5411\u4f47\u5217\u61c9\u7528","text":"

    \u96d9\u5411\u4f47\u5217\u517c\u5177\u5806\u758a\u8207\u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u5b83\u53ef\u4ee5\u5be6\u73fe\u9019\u5169\u8005\u7684\u6240\u6709\u61c9\u7528\u5834\u666f\uff0c\u540c\u6642\u63d0\u4f9b\u66f4\u9ad8\u7684\u81ea\u7531\u5ea6\u3002

    \u6211\u5011\u77e5\u9053\uff0c\u8edf\u9ad4\u7684\u201c\u64a4\u92b7\u201d\u529f\u80fd\u901a\u5e38\u4f7f\u7528\u5806\u758a\u4f86\u5be6\u73fe\uff1a\u7cfb\u7d71\u5c07\u6bcf\u6b21\u66f4\u6539\u64cd\u4f5c push \u5230\u5806\u758a\u4e2d\uff0c\u7136\u5f8c\u900f\u904e pop \u5be6\u73fe\u64a4\u92b7\u3002\u7136\u800c\uff0c\u8003\u616e\u5230\u7cfb\u7d71\u8cc7\u6e90\u7684\u9650\u5236\uff0c\u8edf\u9ad4\u901a\u5e38\u6703\u9650\u5236\u64a4\u92b7\u7684\u6b65\u6578\uff08\u4f8b\u5982\u50c5\u5141\u8a31\u5132\u5b58 \\(50\\) \u6b65\uff09\u3002\u7576\u5806\u758a\u7684\u9577\u5ea6\u8d85\u904e \\(50\\) \u6642\uff0c\u8edf\u9ad4\u9700\u8981\u5728\u5806\u758a\u5e95\uff08\u4f47\u5217\u9996\uff09\u57f7\u884c\u522a\u9664\u64cd\u4f5c\u3002\u4f46\u5806\u758a\u7121\u6cd5\u5be6\u73fe\u8a72\u529f\u80fd\uff0c\u6b64\u6642\u5c31\u9700\u8981\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f86\u66ff\u4ee3\u5806\u758a\u3002\u8acb\u6ce8\u610f\uff0c\u201c\u64a4\u92b7\u201d\u7684\u6838\u5fc3\u908f\u8f2f\u4ecd\u7136\u9075\u5faa\u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u539f\u5247\uff0c\u53ea\u662f\u96d9\u5411\u4f47\u5217\u80fd\u5920\u66f4\u52a0\u9748\u6d3b\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u908f\u8f2f\u3002

    "},{"location":"chapter_stack_and_queue/queue/","title":"5.2 \u00a0 \u4f47\u5217","text":"

    \u4f47\u5217\uff08queue\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u898f\u5247\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002\u9867\u540d\u601d\u7fa9\uff0c\u4f47\u5217\u6a21\u64ec\u4e86\u6392\u968a\u73fe\u8c61\uff0c\u5373\u65b0\u4f86\u7684\u4eba\u4e0d\u65b7\u52a0\u5165\u4f47\u5217\u5c3e\u90e8\uff0c\u800c\u4f4d\u65bc\u4f47\u5217\u982d\u90e8\u7684\u4eba\u9010\u500b\u96e2\u958b\u3002

    \u5982\u5716 5-4 \u6240\u793a\uff0c\u6211\u5011\u5c07\u4f47\u5217\u982d\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u9996\u201d\uff0c\u5c3e\u90e8\u7a31\u70ba\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u5c07\u628a\u5143\u7d20\u52a0\u5165\u5217\u5c3e\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u5165\u5217\u201d\uff0c\u522a\u9664\u4f47\u5217\u9996\u5143\u7d20\u7684\u64cd\u4f5c\u7a31\u70ba\u201c\u51fa\u5217\u201d\u3002

    \u5716 5-4 \u00a0 \u4f47\u5217\u7684\u5148\u5165\u5148\u51fa\u898f\u5247

    "},{"location":"chapter_stack_and_queue/queue/#521","title":"5.2.1 \u00a0 \u4f47\u5217\u5e38\u7528\u64cd\u4f5c","text":"

    \u4f47\u5217\u7684\u5e38\u898b\u64cd\u4f5c\u5982\u8868 5-2 \u6240\u793a\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u4e0d\u540c\u7a0b\u5f0f\u8a9e\u8a00\u7684\u65b9\u6cd5\u540d\u7a31\u53ef\u80fd\u6703\u6709\u6240\u4e0d\u540c\u3002\u6211\u5011\u5728\u6b64\u63a1\u7528\u8207\u5806\u758a\u76f8\u540c\u7684\u65b9\u6cd5\u547d\u540d\u3002

    \u8868 5-2 \u00a0 \u4f47\u5217\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5\u540d \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5217\uff0c\u5373\u5c07\u5143\u7d20\u65b0\u589e\u81f3\u4f47\u5217\u5c3e \\(O(1)\\) pop() \u4f47\u5217\u9996\u5143\u7d20\u51fa\u5217 \\(O(1)\\) peek() \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 \\(O(1)\\)

    \u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u4e2d\u73fe\u6210\u7684\u4f47\u5217\u985e\u5225\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig queue.py
    from collections import deque\n\n# \u521d\u59cb\u5316\u4f47\u5217\n# \u5728 Python \u4e2d\uff0c\u6211\u5011\u4e00\u822c\u5c07\u96d9\u5411\u4f47\u5217\u985e\u5225 deque \u7576\u4f5c\u4f47\u5217\u4f7f\u7528\n# \u96d6\u7136 queue.Queue() \u662f\u7d14\u6b63\u7684\u4f47\u5217\u985e\u5225\uff0c\u4f46\u4e0d\u592a\u597d\u7528\uff0c\u56e0\u6b64\u4e0d\u63a8\u85a6\nque: deque[int] = deque()\n\n# \u5143\u7d20\u5165\u5217\nque.append(1)\nque.append(3)\nque.append(2)\nque.append(5)\nque.append(4)\n\n# \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\nfront: int = que[0]\n\n# \u5143\u7d20\u51fa\u5217\npop: int = que.popleft()\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize: int = len(que)\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(que) == 0\n
    queue.cpp
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nqueue<int> queue;\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint front = queue.front();\n\n/* \u5143\u7d20\u51fa\u5217 */\nqueue.pop();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty = queue.empty();\n
    queue.java
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<Integer> queue = new LinkedList<>();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1);\nqueue.offer(3);\nqueue.offer(2);\nqueue.offer(5);\nqueue.offer(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.poll();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.size();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = queue.isEmpty();\n
    queue.cs
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nQueue<int> queue = new();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.Enqueue(1);\nqueue.Enqueue(3);\nqueue.Enqueue(2);\nqueue.Enqueue(5);\nqueue.Enqueue(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.Peek();\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.Dequeue();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.Count;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.Count == 0;\n
    queue_test.go
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Go \u4e2d\uff0c\u5c07 list \u4f5c\u70ba\u4f47\u5217\u4f86\u4f7f\u7528\nqueue := list.New()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.PushBack(1)\nqueue.PushBack(3)\nqueue.PushBack(2)\nqueue.PushBack(5)\nqueue.PushBack(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\npeek := queue.Front()\n\n/* \u5143\u7d20\u51fa\u5217 */\npop := queue.Front()\nqueue.Remove(pop)\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nsize := queue.Len()\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nisEmpty := queue.Len() == 0\n
    queue.swift
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nvar queue: [Int] = []\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.append(1)\nqueue.append(3)\nqueue.append(2)\nqueue.append(5)\nqueue.append(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nlet peek = queue.first!\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u7531\u65bc\u662f\u9663\u5217\uff0c\u56e0\u6b64 removeFirst \u7684\u8907\u96dc\u5ea6\u70ba O(n)\nlet pool = queue.removeFirst()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = queue.count\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = queue.isEmpty\n
    queue.js
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
    queue.ts
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u4f47\u5217\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nconst queue: number[] = [];\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.push(1);\nqueue.push(3);\nqueue.push(2);\nqueue.push(5);\nqueue.push(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nconst peek = queue[0];\n\n/* \u5143\u7d20\u51fa\u5217 */\n// \u5e95\u5c64\u662f\u9663\u5217\uff0c\u56e0\u6b64 shift() \u65b9\u6cd5\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\nconst pop = queue.shift();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nconst size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nconst empty = queue.length === 0;\n
    queue.dart
    /* \u521d\u59cb\u5316\u4f47\u5217 */\n// \u5728 Dart \u4e2d\uff0c\u4f47\u5217\u985e\u5225 Qeque \u662f\u96d9\u5411\u4f47\u5217\uff0c\u4e5f\u53ef\u4f5c\u70ba\u4f47\u5217\u4f7f\u7528\nQueue<int> queue = Queue();\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.add(1);\nqueue.add(3);\nqueue.add(2);\nqueue.add(5);\nqueue.add(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek = queue.first;\n\n/* \u5143\u7d20\u51fa\u5217 */\nint pop = queue.removeFirst();\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size = queue.length;\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = queue.isEmpty;\n
    queue.rs
    /* \u521d\u59cb\u5316\u96d9\u5411\u4f47\u5217 */\n// \u5728 Rust \u4e2d\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u4f5c\u70ba\u666e\u901a\u4f47\u5217\u4f86\u4f7f\u7528\nlet mut deque: VecDeque<u32> = VecDeque::new();\n\n/* \u5143\u7d20\u5165\u5217 */\ndeque.push_back(1);\ndeque.push_back(3);\ndeque.push_back(2);\ndeque.push_back(5);\ndeque.push_back(4);\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nif let Some(front) = deque.front() {\n}\n\n/* \u5143\u7d20\u51fa\u5217 */\nif let Some(pop) = deque.pop_front() {\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nlet size = deque.len();\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nlet is_empty = deque.is_empty();\n
    queue.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u4f47\u5217\n
    queue.kt
    /* \u521d\u59cb\u5316\u4f47\u5217 */\nval queue = LinkedList<Int>()\n\n/* \u5143\u7d20\u5165\u5217 */\nqueue.offer(1)\nqueue.offer(3)\nqueue.offer(2)\nqueue.offer(5)\nqueue.offer(4)\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nval peek = queue.peek()\n\n/* \u5143\u7d20\u51fa\u5217 */\nval pop = queue.poll()\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nval size = queue.size\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nval isEmpty = queue.isEmpty()\n
    queue.rb
    # \u521d\u59cb\u5316\u4f47\u5217\n# Ruby \u5167\u5efa\u7684\u4f47\u5217\uff08Thread::Queue) \u6c92\u6709 peek \u548c\u8d70\u8a2a\u65b9\u6cd5\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u4f47\u5217\u4f86\u4f7f\u7528\nqueue = []\n\n# \u5143\u7d20\u5165\u5217\nqueue.push(1)\nqueue.push(3)\nqueue.push(2)\nqueue.push(5)\nqueue.push(4)\n\n# \u8a2a\u554f\u4f47\u5217\u5143\u7d20\npeek = queue.first\n\n# \u5143\u7d20\u51fa\u5217\n# \u6e05\u6ce8\u610f\uff0c\u7531\u65bc\u662f\u9663\u5217\uff0cArray#shift \u65b9\u6cd5\u6642\u9593\u8907\u96dc\u5ea6\u70ba O(n)\npop = queue.shift\n\n# \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\nsize = queue.length\n\n# \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\nis_empty = queue.empty?\n
    queue.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#522","title":"5.2.2 \u00a0 \u4f47\u5217\u5be6\u73fe","text":"

    \u70ba\u4e86\u5be6\u73fe\u4f47\u5217\uff0c\u6211\u5011\u9700\u8981\u4e00\u7a2e\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u4ee5\u5728\u4e00\u7aef\u65b0\u589e\u5143\u7d20\uff0c\u4e26\u5728\u53e6\u4e00\u7aef\u522a\u9664\u5143\u7d20\uff0c\u93c8\u7d50\u4e32\u5217\u548c\u9663\u5217\u90fd\u7b26\u5408\u8981\u6c42\u3002

    "},{"location":"chapter_stack_and_queue/queue/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u5982\u5716 5-5 \u6240\u793a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u201c\u982d\u7bc0\u9ede\u201d\u548c\u201c\u5c3e\u7bc0\u9ede\u201d\u5206\u5225\u8996\u70ba\u201c\u4f47\u5217\u9996\u201d\u548c\u201c\u4f47\u5217\u5c3e\u201d\uff0c\u898f\u5b9a\u4f47\u5217\u5c3e\u50c5\u53ef\u65b0\u589e\u7bc0\u9ede\uff0c\u4f47\u5217\u9996\u50c5\u53ef\u522a\u9664\u7bc0\u9ede\u3002

    LinkedListQueuepush()pop()

    \u5716 5-5 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u4f47\u5217\u7684\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_queue.py
    class LinkedListQueue:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._front: ListNode | None = None  # \u982d\u7bc0\u9ede front\n        self._rear: ListNode | None = None  # \u5c3e\u7bc0\u9ede rear\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        node = ListNode(num)\n        # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if self._front is None:\n            self._front = node\n            self._rear = node\n        # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else:\n            self._rear.next = node\n            self._rear = node\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num = self.peek()\n        # \u522a\u9664\u982d\u7bc0\u9ede\n        self._front = self._front.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._front.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  private:\n    ListNode *front, *rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    int queSize;\n\n  public:\n    LinkedListQueue() {\n        front = nullptr;\n        rear = nullptr;\n        queSize = 0;\n    }\n\n    ~LinkedListQueue() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(front);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode *node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == nullptr) {\n            front = node;\n            rear = node;\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear->next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        ListNode *tmp = front;\n        front = front->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (size() == 0)\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return front->val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Vector \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private ListNode front, rear; // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    ListNode? front, rear;  // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear \n    int queSize = 0;\n\n    public LinkedListQueue() {\n        front = null;\n        rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        ListNode node = new(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node;\n            rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else if (rear != null) {\n            rear.next = node;\n            rear = node;\n        }\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype linkedListQueue struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u4f47\u5217\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u4f47\u5217 */\nfunc newLinkedListQueue() *linkedListQueue {\n    return &linkedListQueue{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5217 */\nfunc (s *linkedListQueue) push(value any) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5217 */\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/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (s *linkedListQueue) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListQueue) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListQueue) toList() *list.List {\n    return s.data\n}\n
    linkedlist_queue.swift
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private var front: ListNode? // \u982d\u7bc0\u9ede\n    private var rear: ListNode? // \u5c3e\u7bc0\u9ede\n    private var _size: Int\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let node = ListNode(x: num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if front == nil {\n            front = node\n            rear = node\n        }\n        // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        else {\n            rear?.next = node\n            rear = node\n        }\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return front!.val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    #front; // \u982d\u7bc0\u9ede #front\n    #rear; // \u5c3e\u7bc0\u9ede #rear\n    #queSize = 0;\n\n    constructor() {\n        this.#front = null;\n        this.#rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.#front) {\n            this.#front = node;\n            this.#rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.#rear.next = node;\n            this.#rear = node;\n        }\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.#front = this.#front.next;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#front.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n    private front: ListNode | null; // \u982d\u7bc0\u9ede front\n    private rear: ListNode | null; // \u5c3e\u7bc0\u9ede rear\n    private queSize: number = 0;\n\n    constructor() {\n        this.front = null;\n        this.rear = null;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        const node = new ListNode(num);\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (!this.front) {\n            this.front = node;\n            this.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            this.rear!.next = node;\n            this.rear = node;\n        }\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        if (!this.front) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        this.front = this.front.next;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.size === 0) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.front!.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue {\n  ListNode? _front; // \u982d\u7bc0\u9ede _front\n  ListNode? _rear; // \u5c3e\u7bc0\u9ede _rear\n  int _queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n  LinkedListQueue() {\n    _front = null;\n    _rear = null;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e _num\n    final node = ListNode(_num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (_front == null) {\n      _front = node;\n      _rear = node;\n    } else {\n      // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n      _rear!.next = node;\n      _rear = node;\n    }\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    final int _num = peek();\n    // \u522a\u9664\u982d\u7bc0\u9ede\n    _front = _front!.next;\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (_queSize == 0) {\n      throw Exception('\u4f47\u5217\u70ba\u7a7a');\n    }\n    return _front!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\n#[allow(dead_code)]\npub struct LinkedListQueue<T> {\n    front: Option<Rc<RefCell<ListNode<T>>>>, // \u982d\u7bc0\u9ede front\n    rear: Option<Rc<RefCell<ListNode<T>>>>,  // \u5c3e\u7bc0\u9ede rear\n    que_size: usize,                         // \u4f47\u5217\u7684\u9577\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    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.que_size;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    pub fn push(&mut self, num: T) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        let new_rear = ListNode::new(num);\n        match self.rear.take() {\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            Some(old_rear) => {\n                old_rear.borrow_mut().next = Some(new_rear.clone());\n                self.rear = Some(new_rear);\n            }\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\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\u5217 */\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    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.front.as_ref()\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    ListNode *front, *rear;\n    int queSize;\n} LinkedListQueue;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delLinkedListQueue(LinkedListQueue *queue) {\n    // \u91cb\u653e\u6240\u6709\u7bc0\u9ede\n    while (queue->front != NULL) {\n        ListNode *tmp = queue->front;\n        queue->front = queue->front->next;\n        free(tmp);\n    }\n    // \u91cb\u653e queue \u7d50\u69cb\u9ad4\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(LinkedListQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(LinkedListQueue *queue) {\n    return (size(queue) == 0);\n}\n\n/* \u5165\u5217 */\nvoid push(LinkedListQueue *queue, int num) {\n    // \u5c3e\u7bc0\u9ede\u8655\u65b0\u589e node\n    ListNode *node = newListNode(num);\n    // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if (queue->front == NULL) {\n        queue->front = node;\n        queue->rear = node;\n    }\n    // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else {\n        queue->rear->next = node;\n        queue->rear = node;\n    }\n    queue->queSize++;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(LinkedListQueue *queue) {\n    assert(size(queue) && queue->front);\n    return queue->front->val;\n}\n\n/* \u51fa\u5217 */\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/* \u5217\u5370\u4f47\u5217 */\nvoid printLinkedListQueue(LinkedListQueue *queue) {\n    int *arr = malloc(sizeof(int) * queue->queSize);\n    // \u8907\u88fd\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u8cc7\u6599\u5230\u9663\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass LinkedListQueue(\n    // \u982d\u7bc0\u9ede front \uff0c\u5c3e\u7bc0\u9ede rear\n    private var front: ListNode? = null,\n    private var rear: ListNode? = null,\n    private var queSize: Int = 0\n) {\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n        val node = ListNode(num)\n        // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n        if (front == null) {\n            front = node\n            rear = node\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n        } else {\n            rear?.next = node\n            rear = node\n        }\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u522a\u9664\u982d\u7bc0\u9ede\n        front = front?.next\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return front!!._val\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u982d\u73fe\u7684\u4f47\u5217 ###\nclass LinkedListQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @front = nil  # \u982d\u7bc0\u9ede front\n    @rear = nil   # \u5c3e\u7bc0\u9ede rear\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @front.nil?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    # \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n    node = ListNode.new(num)\n\n    # \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\uff0c\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n    if @front.nil?\n      @front = node\n      @rear = node\n    # \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u4ee4\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n    else\n      @rear.next = node\n      @rear = node\n    end\n\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u522a\u9664\u982d\u7bc0\u9ede\n    @front = @front.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @front.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn LinkedListQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        front: ?*inc.ListNode(T) = null,                // \u982d\u7bc0\u9ede front\n        rear: ?*inc.ListNode(T) = null,                 // \u5c3e\u7bc0\u9ede rear\n        que_size: usize = 0,                            // \u4f47\u5217\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u4f47\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.que_size;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.front.?.val;\n        }  \n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            var node = try self.mem_allocator.create(inc.ListNode(T));\n            node.init(num);\n            // \u5982\u679c\u4f47\u5217\u70ba\u7a7a\uff0c\u5247\u4ee4\u982d\u3001\u5c3e\u7bc0\u9ede\u90fd\u6307\u5411\u8a72\u7bc0\u9ede\n            if (self.front == null) {\n                self.front = node;\n                self.rear = node;\n            // \u5982\u679c\u4f47\u5217\u4e0d\u70ba\u7a7a\uff0c\u5247\u5c07\u8a72\u7bc0\u9ede\u65b0\u589e\u5230\u5c3e\u7bc0\u9ede\u5f8c\n            } else {\n                self.rear.?.next = node;\n                self.rear = node;\n            }\n            self.que_size += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u522a\u9664\u982d\u7bc0\u9ede\n            self.front = self.front.?.next;\n            self.que_size -= 1;\n            return num;\n        } \n\n        // \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u63db\u70ba\u9663\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/queue/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u5728\u9663\u5217\u4e2d\u522a\u9664\u9996\u5143\u7d20\u7684\u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff0c\u9019\u6703\u5c0e\u81f4\u51fa\u5217\u64cd\u4f5c\u6548\u7387\u8f03\u4f4e\u3002\u7136\u800c\uff0c\u6211\u5011\u53ef\u4ee5\u63a1\u7528\u4ee5\u4e0b\u5de7\u5999\u65b9\u6cd5\u4f86\u907f\u514d\u9019\u500b\u554f\u984c\u3002

    \u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u4e00\u500b\u8b8a\u6578 front \u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\u7684\u7d22\u5f15\uff0c\u4e26\u7dad\u8b77\u4e00\u500b\u8b8a\u6578 size \u7528\u65bc\u8a18\u9304\u4f47\u5217\u9577\u5ea6\u3002\u5b9a\u7fa9 rear = front + size \uff0c\u9019\u500b\u516c\u5f0f\u8a08\u7b97\u51fa\u7684 rear \u6307\u5411\u4f47\u5217\u5c3e\u5143\u7d20\u4e4b\u5f8c\u7684\u4e0b\u4e00\u500b\u4f4d\u7f6e\u3002

    \u57fa\u65bc\u6b64\u8a2d\u8a08\uff0c\u9663\u5217\u4e2d\u5305\u542b\u5143\u7d20\u7684\u6709\u6548\u5340\u9593\u70ba [front, rear - 1]\uff0c\u5404\u7a2e\u64cd\u4f5c\u7684\u5be6\u73fe\u65b9\u6cd5\u5982\u5716 5-6 \u6240\u793a\u3002

    • \u5165\u5217\u64cd\u4f5c\uff1a\u5c07\u8f38\u5165\u5143\u7d20\u8ce6\u503c\u7d66 rear \u7d22\u5f15\u8655\uff0c\u4e26\u5c07 size \u589e\u52a0 1 \u3002
    • \u51fa\u5217\u64cd\u4f5c\uff1a\u53ea\u9700\u5c07 front \u589e\u52a0 1 \uff0c\u4e26\u5c07 size \u6e1b\u5c11 1 \u3002

    \u53ef\u4ee5\u770b\u5230\uff0c\u5165\u5217\u548c\u51fa\u5217\u64cd\u4f5c\u90fd\u53ea\u9700\u9032\u884c\u4e00\u6b21\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(1)\\) \u3002

    ArrayQueuepush()pop()

    \u5716 5-6 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u4f47\u5217\u7684\u5165\u5217\u51fa\u5217\u64cd\u4f5c

    \u4f60\u53ef\u80fd\u6703\u767c\u73fe\u4e00\u500b\u554f\u984c\uff1a\u5728\u4e0d\u65b7\u9032\u884c\u5165\u5217\u548c\u51fa\u5217\u7684\u904e\u7a0b\u4e2d\uff0cfront \u548c rear \u90fd\u5728\u5411\u53f3\u79fb\u52d5\uff0c\u7576\u5b83\u5011\u5230\u9054\u9663\u5217\u5c3e\u90e8\u6642\u5c31\u7121\u6cd5\u7e7c\u7e8c\u79fb\u52d5\u4e86\u3002\u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u8996\u70ba\u9996\u5c3e\u76f8\u63a5\u7684\u201c\u74b0\u5f62\u9663\u5217\u201d\u3002

    \u5c0d\u65bc\u74b0\u5f62\u9663\u5217\uff0c\u6211\u5011\u9700\u8981\u8b93 front \u6216 rear \u5728\u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u6642\uff0c\u76f4\u63a5\u56de\u5230\u9663\u5217\u982d\u90e8\u7e7c\u7e8c\u8d70\u8a2a\u3002\u9019\u7a2e\u9031\u671f\u6027\u898f\u5f8b\u53ef\u4ee5\u900f\u904e\u201c\u53d6\u9918\u64cd\u4f5c\u201d\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_queue.py
    class ArrayQueue:\n    \"\"\"\u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\"\"\"\n\n    def __init__(self, size: int):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._nums: list[int] = [0] * size  # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n        self._front: int = 0  # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        self._size: int = 0  # \u4f47\u5217\u9577\u5ea6\n\n    def capacity(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\"\"\"\n        return len(self._nums)\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, num: int):\n        \"\"\"\u5165\u5217\"\"\"\n        if self._size == self.capacity():\n            raise IndexError(\"\u4f47\u5217\u5df2\u6eff\")\n        # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        rear: int = (self._front + self._size) % self.capacity()\n        # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self._nums[rear] = num\n        self._size += 1\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5217\"\"\"\n        num: int = self.peek()\n        # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self._front = (self._front + 1) % self.capacity()\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u4f47\u5217\u70ba\u7a7a\")\n        return self._nums[self._front]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  private:\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u4f47\u5217\u9577\u5ea6\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n\n  public:\n    ArrayQueue(int capacity) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = new int[capacity];\n        queCapacity = capacity;\n        front = queSize = 0;\n    }\n\n    ~ArrayQueue() {\n        delete[] nums;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int capacity() {\n        return queCapacity;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5217 */\n    void push(int num) {\n        if (queSize == queCapacity) {\n            cout << \"\u4f47\u5217\u5df2\u6eff\" << endl;\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % queCapacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % queCapacity;\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    int peek() {\n        if (isEmpty())\n            throw out_of_range(\"\u4f47\u5217\u70ba\u7a7a\");\n        return nums[front];\n    }\n\n    /* \u5c07\u9663\u5217\u8f49\u5316\u70ba Vector \u4e26\u8fd4\u56de */\n    vector<int> toVector() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private int[] nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private int front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    public int capacity() {\n        return nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void push(int num) {\n        if (queSize == capacity()) {\n            System.out.println(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int pop() {\n        int num = peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    int[] nums;  // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize; // \u4f47\u5217\u9577\u5ea6\n\n    public ArrayQueue(int capacity) {\n        nums = new int[capacity];\n        front = queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    int Capacity() {\n        return nums.Length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    public int Size() {\n        return queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return queSize == 0;\n    }\n\n    /* \u5165\u5217 */\n    public void Push(int num) {\n        if (queSize == Capacity()) {\n            Console.WriteLine(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        int rear = (front + queSize) % Capacity();\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num;\n        queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    public int Pop() {\n        int num = Peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % Capacity();\n        queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return nums[front];\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    public int[] ToArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntype arrayQueue struct {\n    nums        []int // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front       int   // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    queSize     int   // \u4f47\u5217\u9577\u5ea6\n    queCapacity int   // \u4f47\u5217\u5bb9\u91cf\uff08\u5373\u6700\u5927\u5bb9\u7d0d\u5143\u7d20\u6578\u91cf\uff09\n}\n\n/* \u521d\u59cb\u5316\u4f47\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/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nfunc (q *arrayQueue) size() int {\n    return q.queSize\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nfunc (q *arrayQueue) isEmpty() bool {\n    return q.queSize == 0\n}\n\n/* \u5165\u5217 */\nfunc (q *arrayQueue) push(num int) {\n    // \u7576 rear == queCapacity \u8868\u793a\u4f47\u5217\u5df2\u6eff\n    if q.queSize == q.queCapacity {\n        return\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear := (q.front + q.queSize) % q.queCapacity\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    q.nums[rear] = num\n    q.queSize++\n}\n\n/* \u51fa\u5217 */\nfunc (q *arrayQueue) pop() any {\n    num := q.peek()\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    q.front = (q.front + 1) % q.queCapacity\n    q.queSize--\n    return num\n}\n\n/* \u8a2a\u554f\u4f47\u5217\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/* \u7372\u53d6 Slice \u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private var nums: [Int] // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var _size: Int // \u4f47\u5217\u9577\u5ea6\n\n    init(capacity: Int) {\n        // \u521d\u59cb\u5316\u9663\u5217\n        nums = Array(repeating: 0, count: capacity)\n        front = 0\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    func capacity() -> Int {\n        nums.count\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5217 */\n    func push(num: Int) {\n        if size() == capacity() {\n            print(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (front + size()) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        _size += 1\n    }\n\n    /* \u51fa\u5217 */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u4f47\u5217\u70ba\u7a7a\")\n        }\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    func toArray() -> [Int] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\u5143\u7d20\n        (front ..< front + size()).map { nums[$0 % capacity()] }\n    }\n}\n
    array_queue.js
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    #nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    #front = 0; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    #queSize = 0; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity) {\n        this.#nums = new Array(capacity);\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity() {\n        return this.#nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num) {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.#front + this.size) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.#nums[rear] = num;\n        this.#queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop() {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.#front = (this.#front + 1) % this.capacity;\n        this.#queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek() {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.#nums[this.#front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray() {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n    private nums: number[]; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private front: number; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private queSize: number; // \u4f47\u5217\u9577\u5ea6\n\n    constructor(capacity: number) {\n        this.nums = new Array(capacity);\n        this.front = this.queSize = 0;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    get capacity(): number {\n        return this.nums.length;\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.queSize;\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.queSize === 0;\n    }\n\n    /* \u5165\u5217 */\n    push(num: number): void {\n        if (this.size === this.capacity) {\n            console.log('\u4f47\u5217\u5df2\u6eff');\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        const rear = (this.front + this.queSize) % this.capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        this.nums[rear] = num;\n        this.queSize++;\n    }\n\n    /* \u51fa\u5217 */\n    pop(): number {\n        const num = this.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        this.front = (this.front + 1) % this.capacity;\n        this.queSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    peek(): number {\n        if (this.isEmpty()) throw new Error('\u4f47\u5217\u70ba\u7a7a');\n        return this.nums[this.front];\n    }\n\n    /* \u8fd4\u56de Array */\n    toArray(): number[] {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue {\n  late List<int> _nums; // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n  late int _front; // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n  late int _queSize; // \u4f47\u5217\u9577\u5ea6\n\n  ArrayQueue(int capacity) {\n    _nums = List.filled(capacity, 0);\n    _front = _queSize = 0;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n  int capaCity() {\n    return _nums.length;\n  }\n\n  /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n  int size() {\n    return _queSize;\n  }\n\n  /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _queSize == 0;\n  }\n\n  /* \u5165\u5217 */\n  void push(int _num) {\n    if (_queSize == capaCity()) {\n      throw Exception(\"\u4f47\u5217\u5df2\u6eff\");\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (_front + _queSize) % capaCity();\n    // \u5c07 _num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    _nums[rear] = _num;\n    _queSize++;\n  }\n\n  /* \u51fa\u5217 */\n  int pop() {\n    int _num = peek();\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    _front = (_front + 1) % capaCity();\n    _queSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u4f47\u5217\u70ba\u7a7a\");\n    }\n    return _nums[_front];\n  }\n\n  /* \u8fd4\u56de Array */\n  List<int> toArray() {\n    // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nstruct ArrayQueue {\n    nums: Vec<i32>,    // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    front: i32,        // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    que_size: i32,     // \u4f47\u5217\u9577\u5ea6\n    que_capacity: i32, // \u4f47\u5217\u5bb9\u91cf\n}\n\nimpl ArrayQueue {\n    /* \u5efa\u69cb\u5b50 */\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    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fn capacity(&self) -> i32 {\n        self.que_capacity\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fn size(&self) -> i32 {\n        self.que_size\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.que_size == 0\n    }\n\n    /* \u5165\u5217 */\n    fn push(&mut self, num: i32) {\n        if self.que_size == self.capacity() {\n            println!(\"\u4f47\u5217\u5df2\u6eff\");\n            return;\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        let rear = (self.front + self.que_size) % self.que_capacity;\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        self.nums[rear as usize] = num;\n        self.que_size += 1;\n    }\n\n    /* \u51fa\u5217 */\n    fn pop(&mut self) -> i32 {\n        let num = self.peek();\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        self.front = (self.front + 1) % self.que_capacity;\n        self.que_size -= 1;\n        num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\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\u9663\u5217 */\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\ntypedef struct {\n    int *nums;       // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    int front;       // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    int queSize;     // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n    int queCapacity; // \u4f47\u5217\u5bb9\u91cf\n} ArrayQueue;\n\n/* \u5efa\u69cb\u5b50 */\nArrayQueue *newArrayQueue(int capacity) {\n    ArrayQueue *queue = (ArrayQueue *)malloc(sizeof(ArrayQueue));\n    // \u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f */\nvoid delArrayQueue(ArrayQueue *queue) {\n    free(queue->nums);\n    free(queue);\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\nint capacity(ArrayQueue *queue) {\n    return queue->queCapacity;\n}\n\n/* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\nint size(ArrayQueue *queue) {\n    return queue->queSize;\n}\n\n/* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\nbool empty(ArrayQueue *queue) {\n    return queue->queSize == 0;\n}\n\n/* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\nint peek(ArrayQueue *queue) {\n    assert(size(queue) != 0);\n    return queue->nums[queue->front];\n}\n\n/* \u5165\u5217 */\nvoid push(ArrayQueue *queue, int num) {\n    if (size(queue) == capacity(queue)) {\n        printf(\"\u4f47\u5217\u5df2\u6eff\\r\\n\");\n        return;\n    }\n    // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    int rear = (queue->front + queue->queSize) % queue->queCapacity;\n    // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    queue->nums[rear] = num;\n    queue->queSize++;\n}\n\n/* \u51fa\u5217 */\nint pop(ArrayQueue *queue) {\n    int num = peek(queue);\n    // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    queue->front = (queue->front + 1) % queue->queCapacity;\n    queue->queSize--;\n    return num;\n}\n
    array_queue.kt
    /* \u57fa\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 */\nclass ArrayQueue(capacity: Int) {\n    private val nums: IntArray = IntArray(capacity) // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    private var front: Int = 0 // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    private var queSize: Int = 0 // \u4f47\u5217\u9577\u5ea6\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf */\n    fun capacity(): Int {\n        return nums.size\n    }\n\n    /* \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return queSize\n    }\n\n    /* \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return queSize == 0\n    }\n\n    /* \u5165\u5217 */\n    fun push(num: Int) {\n        if (queSize == capacity()) {\n            println(\"\u4f47\u5217\u5df2\u6eff\")\n            return\n        }\n        // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n        // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n        val rear = (front + queSize) % capacity()\n        // \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n        nums[rear] = num\n        queSize++\n    }\n\n    /* \u51fa\u5217 */\n    fun pop(): Int {\n        val num = peek()\n        // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n        front = (front + 1) % capacity()\n        queSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return nums[front]\n    }\n\n    /* \u8fd4\u56de\u9663\u5217 */\n    fun toArray(): IntArray {\n        // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217 ###\nclass ArrayQueue\n  ### \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6 ###\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize(size)\n    @nums = Array.new(size, 0) # \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217\n    @front = 0 # \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n    @size = 0 # \u4f47\u5217\u9577\u5ea6\n  end\n\n  ### \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf ###\n  def capacity\n    @nums.length\n  end\n\n  ### \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    size.zero?\n  end\n\n  ### \u5165\u5217 ###\n  def push(num)\n    raise IndexError, '\u4f47\u5217\u5df2\u6eff' if size == capacity\n\n    # \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n    # \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n    rear = (@front + size) % capacity\n    # \u5c07 num \u65b0\u589e\u81f3\u4f47\u5217\u5c3e\n    @nums[rear] = num\n    @size += 1\n  end\n\n  ### \u51fa\u5217 ###\n  def pop\n    num = peek\n    # \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n    @front = (@front + 1) % capacity\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u4f47\u5217\u70ba\u7a7a' if is_empty?\n\n    @nums[@front]\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u74b0\u5f62\u9663\u5217\u5be6\u73fe\u7684\u4f47\u5217\nfn ArrayQueue(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        nums: []T = undefined,                          // \u7528\u65bc\u5132\u5b58\u4f47\u5217\u5143\u7d20\u7684\u9663\u5217     \n        cap: usize = 0,                                 // \u4f47\u5217\u5bb9\u91cf\n        front: usize = 0,                               // \u4f47\u5217\u9996\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u9996\u5143\u7d20\n        queSize: usize = 0,                             // \u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e + 1\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,   // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u9663\u5217\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u5bb9\u91cf\n        pub fn capacity(self: *Self) usize {\n            return self.cap;\n        }\n\n        // \u7372\u53d6\u4f47\u5217\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.queSize;\n        }\n\n        // \u5224\u65b7\u4f47\u5217\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.queSize == 0;\n        }\n\n        // \u5165\u5217\n        pub fn push(self: *Self, num: T) !void {\n            if (self.size() == self.capacity()) {\n                std.debug.print(\"\u4f47\u5217\u5df2\u6eff\\n\", .{});\n                return;\n            }\n            // \u8a08\u7b97\u4f47\u5217\u5c3e\u6307\u6a19\uff0c\u6307\u5411\u4f47\u5217\u5c3e\u7d22\u5f15 + 1\n            // \u900f\u904e\u53d6\u9918\u64cd\u4f5c\u5be6\u73fe rear \u8d8a\u904e\u9663\u5217\u5c3e\u90e8\u5f8c\u56de\u5230\u982d\u90e8\n            var rear = (self.front + self.queSize) % self.capacity();\n            // \u5728\u5c3e\u7bc0\u9ede\u5f8c\u65b0\u589e num\n            self.nums[rear] = num;\n            self.queSize += 1;\n        } \n\n        // \u51fa\u5217\n        pub fn pop(self: *Self) T {\n            var num = self.peek();\n            // \u4f47\u5217\u9996\u6307\u6a19\u5411\u5f8c\u79fb\u52d5\u4e00\u4f4d\uff0c\u82e5\u8d8a\u904e\u5c3e\u90e8\uff0c\u5247\u8fd4\u56de\u5230\u9663\u5217\u982d\u90e8\n            self.front = (self.front + 1) % self.capacity();\n            self.queSize -= 1;\n            return num;\n        } \n\n        // \u8a2a\u554f\u4f47\u5217\u9996\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u4f47\u5217\u70ba\u7a7a\");\n            return self.nums[self.front];\n        } \n\n        // \u8fd4\u56de\u9663\u5217\n        pub fn toArray(self: *Self) ![]T {\n            // \u50c5\u8f49\u63db\u6709\u6548\u9577\u5ea6\u7bc4\u570d\u5167\u7684\u4e32\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u4ee5\u4e0a\u5be6\u73fe\u7684\u4f47\u5217\u4ecd\u7136\u5177\u6709\u4fb7\u9650\u6027\uff1a\u5176\u9577\u5ea6\u4e0d\u53ef\u8b8a\u3002\u7136\u800c\uff0c\u9019\u500b\u554f\u984c\u4e0d\u96e3\u89e3\u6c7a\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u66ff\u63db\u70ba\u52d5\u614b\u9663\u5217\uff0c\u5f9e\u800c\u5f15\u5165\u64f4\u5bb9\u6a5f\u5236\u3002\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u5617\u8a66\u81ea\u884c\u5be6\u73fe\u3002

    \u5169\u7a2e\u5be6\u73fe\u7684\u5c0d\u6bd4\u7d50\u8ad6\u8207\u5806\u758a\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

    "},{"location":"chapter_stack_and_queue/queue/#523","title":"5.2.3 \u00a0 \u4f47\u5217\u5178\u578b\u61c9\u7528","text":"
    • \u6dd8\u5bf6\u8a02\u55ae\u3002\u8cfc\u7269\u8005\u4e0b\u55ae\u5f8c\uff0c\u8a02\u55ae\u5c07\u52a0\u5165\u5217\u5217\u4e2d\uff0c\u7cfb\u7d71\u96a8\u5f8c\u6703\u6839\u64da\u9806\u5e8f\u8655\u7406\u4f47\u5217\u4e2d\u7684\u8a02\u55ae\u3002\u5728\u96d9\u5341\u4e00\u671f\u9593\uff0c\u77ed\u6642\u9593\u5167\u6703\u7522\u751f\u6d77\u91cf\u8a02\u55ae\uff0c\u9ad8\u4f75\u767c\u6210\u70ba\u5de5\u7a0b\u5e2b\u5011\u9700\u8981\u91cd\u9ede\u653b\u514b\u7684\u554f\u984c\u3002
    • \u5404\u985e\u5f85\u8fa6\u4e8b\u9805\u3002\u4efb\u4f55\u9700\u8981\u5be6\u73fe\u201c\u5148\u4f86\u5f8c\u5230\u201d\u529f\u80fd\u7684\u5834\u666f\uff0c\u4f8b\u5982\u5370\u8868\u6a5f\u7684\u4efb\u52d9\u4f47\u5217\u3001\u9910\u5ef3\u7684\u51fa\u9910\u4f47\u5217\u7b49\uff0c\u4f47\u5217\u5728\u9019\u4e9b\u5834\u666f\u4e2d\u53ef\u4ee5\u6709\u6548\u5730\u7dad\u8b77\u8655\u7406\u9806\u5e8f\u3002
    "},{"location":"chapter_stack_and_queue/stack/","title":"5.1 \u00a0 \u5806\u758a","text":"

    \u5806\u758a\uff08stack\uff09\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u908f\u8f2f\u7684\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\u3002

    \u6211\u5011\u53ef\u4ee5\u5c07\u5806\u758a\u985e\u6bd4\u70ba\u684c\u9762\u4e0a\u7684\u4e00\u758a\u76e4\u5b50\uff0c\u5982\u679c\u60f3\u53d6\u51fa\u5e95\u90e8\u7684\u76e4\u5b50\uff0c\u5247\u9700\u8981\u5148\u5c07\u4e0a\u9762\u7684\u76e4\u5b50\u4f9d\u6b21\u79fb\u8d70\u3002\u6211\u5011\u5c07\u76e4\u5b50\u66ff\u63db\u70ba\u5404\u7a2e\u578b\u5225\u7684\u5143\u7d20\uff08\u5982\u6574\u6578\u3001\u5b57\u5143\u3001\u7269\u4ef6\u7b49\uff09\uff0c\u5c31\u5f97\u5230\u4e86\u5806\u758a\u9019\u7a2e\u8cc7\u6599\u7d50\u69cb\u3002

    \u5982\u5716 5-1 \u6240\u793a\uff0c\u6211\u5011\u628a\u5806\u7a4d\u758a\u5143\u7d20\u7684\u9802\u90e8\u7a31\u70ba\u201c\u5806\u758a\u9802\u201d\uff0c\u5e95\u90e8\u7a31\u70ba\u201c\u5806\u758a\u5e95\u201d\u3002\u5c07\u628a\u5143\u7d20\u65b0\u589e\u5230\u5806\u758a\u9802\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u5165\u5806\u758a\u201d\uff0c\u522a\u9664\u5806\u758a\u9802\u5143\u7d20\u7684\u64cd\u4f5c\u53eb\u4f5c\u201c\u51fa\u5806\u758a\u201d\u3002

    \u5716 5-1 \u00a0 \u5806\u758a\u7684\u5148\u5165\u5f8c\u51fa\u898f\u5247

    "},{"location":"chapter_stack_and_queue/stack/#511","title":"5.1.1 \u00a0 \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c","text":"

    \u5806\u758a\u7684\u5e38\u7528\u64cd\u4f5c\u5982\u8868 5-1 \u6240\u793a\uff0c\u5177\u9ad4\u7684\u65b9\u6cd5\u540d\u9700\u8981\u6839\u64da\u6240\u4f7f\u7528\u7684\u7a0b\u5f0f\u8a9e\u8a00\u4f86\u78ba\u5b9a\u3002\u5728\u6b64\uff0c\u6211\u5011\u4ee5\u5e38\u898b\u7684 push()\u3001pop()\u3001peek() \u547d\u540d\u70ba\u4f8b\u3002

    \u8868 5-1 \u00a0 \u5806\u758a\u7684\u64cd\u4f5c\u6548\u7387

    \u65b9\u6cd5 \u63cf\u8ff0 \u6642\u9593\u8907\u96dc\u5ea6 push() \u5143\u7d20\u5165\u5806\u758a\uff08\u65b0\u589e\u81f3\u5806\u758a\u9802\uff09 \\(O(1)\\) pop() \u5806\u758a\u9802\u5143\u7d20\u51fa\u5806\u758a \\(O(1)\\) peek() \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 \\(O(1)\\)

    \u901a\u5e38\u60c5\u6cc1\u4e0b\uff0c\u6211\u5011\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u7a0b\u5f0f\u8a9e\u8a00\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\u3002\u7136\u800c\uff0c\u67d0\u4e9b\u8a9e\u8a00\u53ef\u80fd\u6c92\u6709\u5c08\u9580\u63d0\u4f9b\u5806\u758a\u985e\u5225\uff0c\u9019\u6642\u6211\u5011\u53ef\u4ee5\u5c07\u8a72\u8a9e\u8a00\u7684\u201c\u9663\u5217\u201d\u6216\u201c\u93c8\u7d50\u4e32\u5217\u201d\u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\uff0c\u4e26\u5728\u7a0b\u5f0f\u908f\u8f2f\u4e0a\u5ffd\u7565\u8207\u5806\u758a\u7121\u95dc\u7684\u64cd\u4f5c\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig stack.py
    # \u521d\u59cb\u5316\u5806\u758a\n# Python \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a list \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack: list[int] = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek: int = stack[-1]\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop: int = stack.pop()\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize: int = len(stack)\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty: bool = len(stack) == 0\n
    stack.cpp
    /* \u521d\u59cb\u5316\u5806\u758a */\nstack<int> stack;\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint top = stack.top();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nstack.pop(); // \u7121\u8fd4\u56de\u503c\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool empty = stack.empty();\n
    stack.java
    /* \u521d\u59cb\u5316\u5806\u758a */\nStack<Integer> stack = new Stack<>();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.size();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nboolean isEmpty = stack.isEmpty();\n
    stack.cs
    /* \u521d\u59cb\u5316\u5806\u758a */\nStack<int> stack = new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.Push(1);\nstack.Push(3);\nstack.Push(2);\nstack.Push(5);\nstack.Push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.Peek();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.Pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.Count;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.Count == 0;\n
    stack_test.go
    /* \u521d\u59cb\u5316\u5806\u758a */\n// \u5728 Go \u4e2d\uff0c\u63a8\u85a6\u5c07 Slice \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack []int\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack = append(stack, 1)\nstack = append(stack, 3)\nstack = append(stack, 2)\nstack = append(stack, 5)\nstack = append(stack, 4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\npeek := stack[len(stack)-1]\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\npop := stack[len(stack)-1]\nstack = stack[:len(stack)-1]\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nsize := len(stack)\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nisEmpty := len(stack) == 0\n
    stack.swift
    /* \u521d\u59cb\u5316\u5806\u758a */\n// Swift \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nvar stack: [Int] = []\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.append(1)\nstack.append(3)\nstack.append(2)\nstack.append(5)\nstack.append(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet peek = stack.last!\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.removeLast()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.count\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet isEmpty = stack.isEmpty\n
    stack.js
    /* \u521d\u59cb\u5316\u5806\u758a */\n// JavaScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length-1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.ts
    /* \u521d\u59cb\u5316\u5806\u758a */\n// TypeScript \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nconst stack: number[] = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nconst peek = stack[stack.length - 1];\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nconst pop = stack.pop();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nconst size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nconst is_empty = stack.length === 0;\n
    stack.dart
    /* \u521d\u59cb\u5316\u5806\u758a */\n// Dart \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a List \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nList<int> stack = [];\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.add(1);\nstack.add(3);\nstack.add(2);\nstack.add(5);\nstack.add(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek = stack.last;\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nint pop = stack.removeLast();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size = stack.length;\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nbool isEmpty = stack.isEmpty;\n
    stack.rs
    /* \u521d\u59cb\u5316\u5806\u758a */\n// \u628a Vec \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nlet mut stack: Vec<i32> = Vec::new();\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1);\nstack.push(3);\nstack.push(2);\nstack.push(5);\nstack.push(4);\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nlet top = stack.last().unwrap();\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nlet pop = stack.pop().unwrap();\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nlet size = stack.len();\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nlet is_empty = stack.is_empty();\n
    stack.c
    // C \u672a\u63d0\u4f9b\u5167\u5efa\u5806\u758a\n
    stack.kt
    /* \u521d\u59cb\u5316\u5806\u758a */\nval stack = Stack<Int>()\n\n/* \u5143\u7d20\u5165\u5806\u758a */\nstack.push(1)\nstack.push(3)\nstack.push(2)\nstack.push(5)\nstack.push(4)\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nval peek = stack.peek()\n\n/* \u5143\u7d20\u51fa\u5806\u758a */\nval pop = stack.pop()\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nval size = stack.size\n\n/* \u5224\u65b7\u662f\u5426\u70ba\u7a7a */\nval isEmpty = stack.isEmpty()\n
    stack.rb
    # \u521d\u59cb\u5316\u5806\u758a\n# Ruby \u6c92\u6709\u5167\u5efa\u7684\u5806\u758a\u985e\u5225\uff0c\u53ef\u4ee5\u628a Array \u7576\u4f5c\u5806\u758a\u4f86\u4f7f\u7528\nstack = []\n\n# \u5143\u7d20\u5165\u5806\u758a\nstack << 1\nstack << 3\nstack << 2\nstack << 5\nstack << 4\n\n# \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\npeek = stack.last\n\n# \u5143\u7d20\u51fa\u5806\u758a\npop = stack.pop\n\n# \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\nsize = stack.length\n\n# \u5224\u65b7\u662f\u5426\u70ba\u7a7a\nis_empty = stack.empty?\n
    stack.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#512","title":"5.1.2 \u00a0 \u5806\u758a\u7684\u5be6\u73fe","text":"

    \u70ba\u4e86\u6df1\u5165\u77ad\u89e3\u5806\u758a\u7684\u57f7\u884c\u6a5f\u5236\uff0c\u6211\u5011\u4f86\u5617\u8a66\u81ea\u5df1\u5be6\u73fe\u4e00\u500b\u5806\u758a\u985e\u5225\u3002

    \u5806\u758a\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u7684\u539f\u5247\uff0c\u56e0\u6b64\u6211\u5011\u53ea\u80fd\u5728\u5806\u758a\u9802\u65b0\u589e\u6216\u522a\u9664\u5143\u7d20\u3002\u7136\u800c\uff0c\u9663\u5217\u548c\u93c8\u7d50\u4e32\u5217\u90fd\u53ef\u4ee5\u5728\u4efb\u610f\u4f4d\u7f6e\u65b0\u589e\u548c\u522a\u9664\u5143\u7d20\uff0c\u56e0\u6b64\u5806\u758a\u53ef\u4ee5\u8996\u70ba\u4e00\u7a2e\u53d7\u9650\u5236\u7684\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u6211\u5011\u53ef\u4ee5\u201c\u906e\u853d\u201d\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u7684\u90e8\u5206\u7121\u95dc\u64cd\u4f5c\uff0c\u4f7f\u5176\u5c0d\u5916\u8868\u73fe\u7684\u908f\u8f2f\u7b26\u5408\u5806\u758a\u7684\u7279\u6027\u3002

    "},{"location":"chapter_stack_and_queue/stack/#1","title":"1. \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe","text":"

    \u4f7f\u7528\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u93c8\u7d50\u4e32\u5217\u7684\u982d\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u9802\uff0c\u5c3e\u7bc0\u9ede\u8996\u70ba\u5806\u758a\u5e95\u3002

    \u5982\u5716 5-2 \u6240\u793a\uff0c\u5c0d\u65bc\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u6211\u5011\u53ea\u9700\u5c07\u5143\u7d20\u63d2\u5165\u93c8\u7d50\u4e32\u5217\u982d\u90e8\uff0c\u9019\u7a2e\u7bc0\u9ede\u63d2\u5165\u65b9\u6cd5\u88ab\u7a31\u70ba\u201c\u982d\u63d2\u6cd5\u201d\u3002\u800c\u5c0d\u65bc\u51fa\u5806\u758a\u64cd\u4f5c\uff0c\u53ea\u9700\u5c07\u982d\u7bc0\u9ede\u5f9e\u93c8\u7d50\u4e32\u5217\u4e2d\u522a\u9664\u5373\u53ef\u3002

    LinkedListStackpush()pop()

    \u5716 5-2 \u00a0 \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

    \u4ee5\u4e0b\u662f\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5806\u758a\u7684\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig linkedlist_stack.py
    class LinkedListStack:\n    \"\"\"\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._peek: ListNode | None = None\n        self._size: int = 0\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return self._size\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, val: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\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\u5806\u758a\"\"\"\n        num = self.peek()\n        self._peek = self._peek.next\n        self._size -= 1\n        return num\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._peek.val\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8f49\u5316\u70ba\u4e32\u5217\u7528\u65bc\u5217\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  private:\n    ListNode *stackTop; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize;        // \u5806\u758a\u7684\u9577\u5ea6\n\n  public:\n    LinkedListStack() {\n        stackTop = nullptr;\n        stkSize = 0;\n    }\n\n    ~LinkedListStack() {\n        // \u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u522a\u9664\u7bc0\u9ede\uff0c\u91cb\u653e\u8a18\u61b6\u9ad4\n        freeMemoryLinkedList(stackTop);\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        ListNode *node = new ListNode(num);\n        node->next = stackTop;\n        stackTop = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        ListNode *tmp = stackTop;\n        stackTop = stackTop->next;\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete tmp;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\u7a7a\");\n        return stackTop->val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private ListNode stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private int stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    public int pop() {\n        int num = peek();\n        stackPeek = stackPeek.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stackPeek.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    ListNode? stackPeek;  // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int stkSize = 0;   // \u5806\u758a\u7684\u9577\u5ea6\n\n    public LinkedListStack() {\n        stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        ListNode node = new(num) {\n            next = stackPeek\n        };\n        stackPeek = node;\n        stkSize++;\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int Pop() {\n        int num = Peek();\n        stackPeek = stackPeek!.next;\n        stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stackPeek!.val;\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype linkedListStack struct {\n    // \u4f7f\u7528\u5167\u5efa\u5305 list \u4f86\u5be6\u73fe\u5806\u758a\n    data *list.List\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newLinkedListStack() *linkedListStack {\n    return &linkedListStack{\n        data: list.New(),\n    }\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *linkedListStack) push(value int) {\n    s.data.PushBack(value)\n}\n\n/* \u51fa\u5806\u758a */\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/* \u8a2a\u554f\u5806\u758a\u9802\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/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *linkedListStack) size() int {\n    return s.data.Len()\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *linkedListStack) isEmpty() bool {\n    return s.data.Len() == 0\n}\n\n/* \u7372\u53d6 List \u7528\u65bc\u5217\u5370 */\nfunc (s *linkedListStack) toList() *list.List {\n    return s.data\n}\n
    linkedlist_stack.swift
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private var _peek: ListNode? // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var _size: Int // \u5806\u758a\u7684\u9577\u5ea6\n\n    init() {\n        _size = 0\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        _size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        let num = peek()\n        _peek = _peek?.next\n        _size -= 1\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return _peek!.val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    #stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    #stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.#stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    pop() {\n        const num = this.peek();\n        this.#stackPeek = this.#stackPeek.next;\n        this.#stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek() {\n        if (!this.#stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n    private stackPeek: ListNode | null; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private stkSize: number = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n    constructor() {\n        this.stackPeek = null;\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stkSize;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.size === 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\n    pop(): number {\n        const num = this.peek();\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        this.stackPeek = this.stackPeek.next;\n        this.stkSize--;\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    peek(): number {\n        if (!this.stackPeek) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stackPeek.val;\n    }\n\n    /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u985e\u5225\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack {\n  ListNode? _stackPeek; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n  int _stkSize = 0; // \u5806\u758a\u7684\u9577\u5ea6\n\n  LinkedListStack() {\n    _stackPeek = null;\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stkSize;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stkSize == 0;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    final ListNode node = ListNode(_num);\n    node.next = _stackPeek;\n    _stackPeek = node;\n    _stkSize++;\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    final int _num = peek();\n    _stackPeek = _stackPeek!.next;\n    _stkSize--;\n    return _num;\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (_stackPeek == null) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stackPeek!.val;\n  }\n\n  /* \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba List \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\n#[allow(dead_code)]\npub struct LinkedListStack<T> {\n    stack_peek: Option<Rc<RefCell<ListNode<T>>>>, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    stk_size: usize,                              // \u5806\u758a\u7684\u9577\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    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    pub fn size(&self) -> usize {\n        return self.stk_size;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    pub fn is_empty(&self) -> bool {\n        return self.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\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\u5806\u758a */\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    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    pub fn peek(&self) -> Option<&Rc<RefCell<ListNode<T>>>> {\n        self.stack_peek.as_ref()\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    ListNode *top; // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    int size;      // \u5806\u758a\u7684\u9577\u5ea6\n} LinkedListStack;\n\n/* \u5efa\u69cb\u5b50 */\nLinkedListStack *newLinkedListStack() {\n    LinkedListStack *s = malloc(sizeof(LinkedListStack));\n    s->top = NULL;\n    s->size = 0;\n    return s;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\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/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(LinkedListStack *s) {\n    return s->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(LinkedListStack *s) {\n    return size(s) == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(LinkedListStack *s, int num) {\n    ListNode *node = (ListNode *)malloc(sizeof(ListNode));\n    node->next = s->top; // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u6307\u6a19\u57df\n    node->val = num;     // \u66f4\u65b0\u65b0\u52a0\u7bc0\u9ede\u8cc7\u6599\u57df\n    s->top = node;       // \u66f4\u65b0\u5806\u758a\u9802\n    s->size++;           // \u66f4\u65b0\u5806\u758a\u5927\u5c0f\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(LinkedListStack *s) {\n    if (s->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return s->top->val;\n}\n\n/* \u51fa\u5806\u758a */\nint pop(LinkedListStack *s) {\n    int val = peek(s);\n    ListNode *tmp = s->top;\n    s->top = s->top->next;\n    // \u91cb\u653e\u8a18\u61b6\u9ad4\n    free(tmp);\n    s->size--;\n    return val;\n}\n
    linkedlist_stack.kt
    /* \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass LinkedListStack(\n    private var stackPeek: ListNode? = null, // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n    private var stkSize: Int = 0 // \u5806\u758a\u7684\u9577\u5ea6\n) {\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stkSize\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        val node = ListNode(num)\n        node.next = stackPeek\n        stackPeek = node\n        stkSize++\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int? {\n        val num = peek()\n        stackPeek = stackPeek?.next\n        stkSize--\n        return num\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int? {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stackPeek?._val\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass LinkedListStack\n  attr_reader :size\n\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @size = 0\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @peek.nil?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(val)\n    node = ListNode.new(val)\n    node.next = @peek\n    @peek = node\n    @size += 1\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    num = peek\n    @peek = @peek.next\n    @size -= 1\n    num\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @peek.val\n  end\n\n  ### \u5c07\u93c8\u7d50\u4e32\u5217\u8f49\u5316\u70ba Array \u4e26\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\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn LinkedListStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack_top: ?*inc.ListNode(T) = null,             // \u5c07\u982d\u7bc0\u9ede\u4f5c\u70ba\u5806\u758a\u9802\n        stk_size: usize = 0,                             // \u5806\u758a\u7684\u9577\u5ea6\n        mem_arena: ?std.heap.ArenaAllocator = null,\n        mem_allocator: std.mem.Allocator = undefined,    // \u8a18\u61b6\u9ad4\u5206\u914d\u5668\n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\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\u69cb\u51fd\u5f0f\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.mem_arena == null) return;\n            self.mem_arena.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stk_size;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.size() == 0) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack_top.?.val;\n        }  \n\n        // \u5165\u5806\u758a\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\u5806\u758a\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        // \u5c07\u5806\u758a\u8f49\u63db\u70ba\u9663\u5217\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#2","title":"2. \u00a0 \u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe","text":"

    \u4f7f\u7528\u9663\u5217\u5be6\u73fe\u5806\u758a\u6642\uff0c\u6211\u5011\u53ef\u4ee5\u5c07\u9663\u5217\u7684\u5c3e\u90e8\u4f5c\u70ba\u5806\u758a\u9802\u3002\u5982\u5716 5-3 \u6240\u793a\uff0c\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u5206\u5225\u5c0d\u61c9\u5728\u9663\u5217\u5c3e\u90e8\u65b0\u589e\u5143\u7d20\u8207\u522a\u9664\u5143\u7d20\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u70ba \\(O(1)\\) \u3002

    ArrayStackpush()pop()

    \u5716 5-3 \u00a0 \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u5806\u758a\u7684\u5165\u5806\u758a\u51fa\u5806\u758a\u64cd\u4f5c

    \u7531\u65bc\u5165\u5806\u758a\u7684\u5143\u7d20\u53ef\u80fd\u6703\u6e90\u6e90\u4e0d\u65b7\u5730\u589e\u52a0\uff0c\u56e0\u6b64\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u52d5\u614b\u9663\u5217\uff0c\u9019\u6a23\u5c31\u7121\u9808\u81ea\u884c\u8655\u7406\u9663\u5217\u64f4\u5bb9\u554f\u984c\u3002\u4ee5\u4e0b\u70ba\u793a\u4f8b\u7a0b\u5f0f\u78bc\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_stack.py
    class ArrayStack:\n    \"\"\"\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\"\"\"\n\n    def __init__(self):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._stack: list[int] = []\n\n    def size(self) -> int:\n        \"\"\"\u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\"\"\"\n        return len(self._stack)\n\n    def is_empty(self) -> bool:\n        \"\"\"\u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\"\"\"\n        return self._size == 0\n\n    def push(self, item: int):\n        \"\"\"\u5165\u5806\u758a\"\"\"\n        self._stack.append(item)\n\n    def pop(self) -> int:\n        \"\"\"\u51fa\u5806\u758a\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack.pop()\n\n    def peek(self) -> int:\n        \"\"\"\u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\"\"\"\n        if self.is_empty():\n            raise IndexError(\"\u5806\u758a\u70ba\u7a7a\")\n        return self._stack[-1]\n\n    def to_list(self) -> list[int]:\n        \"\"\"\u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370\"\"\"\n        return self._stack\n
    array_stack.cpp
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  private:\n    vector<int> stack;\n\n  public:\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    bool isEmpty() {\n        return stack.size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    void push(int num) {\n        stack.push_back(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    int pop() {\n        int num = top();\n        stack.pop_back();\n        return num;\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    int top() {\n        if (isEmpty())\n            throw out_of_range(\"\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private ArrayList<Integer> stack;\n\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = new ArrayList<>();\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int size() {\n        return stack.size();\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public boolean isEmpty() {\n        return size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void push(int num) {\n        stack.add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    public int pop() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.remove(size() - 1);\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int peek() {\n        if (isEmpty())\n            throw new IndexOutOfBoundsException();\n        return stack.get(size() - 1);\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public Object[] toArray() {\n        return stack.toArray();\n    }\n}\n
    array_stack.cs
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    List<int> stack;\n    public ArrayStack() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    public int Size() {\n        return stack.Count;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    public bool IsEmpty() {\n        return Size() == 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    public void Push(int num) {\n        stack.Add(num);\n    }\n\n    /* \u51fa\u5806\u758a */\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    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    public int Peek() {\n        if (IsEmpty())\n            throw new Exception();\n        return stack[Size() - 1];\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    public int[] ToArray() {\n        return [.. stack];\n    }\n}\n
    array_stack.go
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntype arrayStack struct {\n    data []int // \u8cc7\u6599\n}\n\n/* \u521d\u59cb\u5316\u5806\u758a */\nfunc newArrayStack() *arrayStack {\n    return &arrayStack{\n        // \u8a2d\u5b9a\u5806\u758a\u7684\u9577\u5ea6\u70ba 0\uff0c\u5bb9\u91cf\u70ba 16\n        data: make([]int, 0, 16),\n    }\n}\n\n/* \u5806\u758a\u7684\u9577\u5ea6 */\nfunc (s *arrayStack) size() int {\n    return len(s.data)\n}\n\n/* \u5806\u758a\u662f\u5426\u70ba\u7a7a */\nfunc (s *arrayStack) isEmpty() bool {\n    return s.size() == 0\n}\n\n/* \u5165\u5806\u758a */\nfunc (s *arrayStack) push(v int) {\n    // \u5207\u7247\u6703\u81ea\u52d5\u64f4\u5bb9\n    s.data = append(s.data, v)\n}\n\n/* \u51fa\u5806\u758a */\nfunc (s *arrayStack) pop() any {\n    val := s.peek()\n    s.data = s.data[:len(s.data)-1]\n    return val\n}\n\n/* \u7372\u53d6\u5806\u758a\u9802\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/* \u7372\u53d6 Slice \u7528\u65bc\u5217\u5370 */\nfunc (s *arrayStack) toSlice() []int {\n    return s.data\n}\n
    array_stack.swift
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private var stack: [Int]\n\n    init() {\n        // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n        stack = []\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    func size() -> Int {\n        stack.count\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    func isEmpty() -> Bool {\n        stack.isEmpty\n    }\n\n    /* \u5165\u5806\u758a */\n    func push(num: Int) {\n        stack.append(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    @discardableResult\n    func pop() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.removeLast()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    func peek() -> Int {\n        if isEmpty() {\n            fatalError(\"\u5806\u758a\u70ba\u7a7a\")\n        }\n        return stack.last!\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    func toArray() -> [Int] {\n        stack\n    }\n}\n
    array_stack.js
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    #stack;\n    constructor() {\n        this.#stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size() {\n        return this.#stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty() {\n        return this.#stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num) {\n        this.#stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.#stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top() {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    private stack: number[];\n    constructor() {\n        this.stack = [];\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    get size(): number {\n        return this.stack.length;\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    isEmpty(): boolean {\n        return this.stack.length === 0;\n    }\n\n    /* \u5165\u5806\u758a */\n    push(num: number): void {\n        this.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    pop(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\u7a7a');\n        return this.stack.pop();\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    top(): number | undefined {\n        if (this.isEmpty()) throw new Error('\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n  late List<int> _stack;\n  ArrayStack() {\n    _stack = [];\n  }\n\n  /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n  int size() {\n    return _stack.length;\n  }\n\n  /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n  bool isEmpty() {\n    return _stack.isEmpty;\n  }\n\n  /* \u5165\u5806\u758a */\n  void push(int _num) {\n    _stack.add(_num);\n  }\n\n  /* \u51fa\u5806\u758a */\n  int pop() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.removeLast();\n  }\n\n  /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n  int peek() {\n    if (isEmpty()) {\n      throw Exception(\"\u5806\u758a\u70ba\u7a7a\");\n    }\n    return _stack.last;\n  }\n\n  /* \u5c07\u5806\u758a\u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n  List<int> toArray() => _stack;\n}\n
    array_stack.rs
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nstruct ArrayStack<T> {\n    stack: Vec<T>,\n}\n\nimpl<T> ArrayStack<T> {\n    /* \u521d\u59cb\u5316\u5806\u758a */\n    fn new() -> ArrayStack<T> {\n        ArrayStack::<T> {\n            stack: Vec::<T>::new(),\n        }\n    }\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fn size(&self) -> usize {\n        self.stack.len()\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fn is_empty(&self) -> bool {\n        self.size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fn push(&mut self, num: T) {\n        self.stack.push(num);\n    }\n\n    /* \u51fa\u5806\u758a */\n    fn pop(&mut self) -> Option<T> {\n        self.stack.pop()\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fn peek(&self) -> Option<&T> {\n        if self.is_empty() {\n            panic!(\"\u5806\u758a\u70ba\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\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\ntypedef struct {\n    int *data;\n    int size;\n} ArrayStack;\n\n/* \u5efa\u69cb\u5b50 */\nArrayStack *newArrayStack() {\n    ArrayStack *stack = malloc(sizeof(ArrayStack));\n    // \u521d\u59cb\u5316\u4e00\u500b\u5927\u5bb9\u91cf\uff0c\u907f\u514d\u64f4\u5bb9\n    stack->data = malloc(sizeof(int) * MAX_SIZE);\n    stack->size = 0;\n    return stack;\n}\n\n/* \u6790\u69cb\u51fd\u5f0f */\nvoid delArrayStack(ArrayStack *stack) {\n    free(stack->data);\n    free(stack);\n}\n\n/* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\nint size(ArrayStack *stack) {\n    return stack->size;\n}\n\n/* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\nbool isEmpty(ArrayStack *stack) {\n    return stack->size == 0;\n}\n\n/* \u5165\u5806\u758a */\nvoid push(ArrayStack *stack, int num) {\n    if (stack->size == MAX_SIZE) {\n        printf(\"\u5806\u758a\u5df2\u6eff\\n\");\n        return;\n    }\n    stack->data[stack->size] = num;\n    stack->size++;\n}\n\n/* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\nint peek(ArrayStack *stack) {\n    if (stack->size == 0) {\n        printf(\"\u5806\u758a\u70ba\u7a7a\\n\");\n        return INT_MAX;\n    }\n    return stack->data[stack->size - 1];\n}\n\n/* \u51fa\u5806\u758a */\nint pop(ArrayStack *stack) {\n    int val = peek(stack);\n    stack->size--;\n    return val;\n}\n
    array_stack.kt
    /* \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a */\nclass ArrayStack {\n    // \u521d\u59cb\u5316\u4e32\u5217\uff08\u52d5\u614b\u9663\u5217\uff09\n    private val stack = mutableListOf<Int>()\n\n    /* \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 */\n    fun size(): Int {\n        return stack.size\n    }\n\n    /* \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a */\n    fun isEmpty(): Boolean {\n        return size() == 0\n    }\n\n    /* \u5165\u5806\u758a */\n    fun push(num: Int) {\n        stack.add(num)\n    }\n\n    /* \u51fa\u5806\u758a */\n    fun pop(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack.removeAt(size() - 1)\n    }\n\n    /* \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 */\n    fun peek(): Int {\n        if (isEmpty()) throw IndexOutOfBoundsException()\n        return stack[size() - 1]\n    }\n\n    /* \u5c07 List \u8f49\u5316\u70ba Array \u4e26\u8fd4\u56de */\n    fun toArray(): Array<Any> {\n        return stack.toTypedArray()\n    }\n}\n
    array_stack.rb
    ### \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a ###\nclass ArrayStack\n  ### \u5efa\u69cb\u5b50 ###\n  def initialize\n    @stack = []\n  end\n\n  ### \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6 ###\n  def size\n    @stack.length\n  end\n\n  ### \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a ###\n  def is_empty?\n    @stack.empty?\n  end\n\n  ### \u5165\u5806\u758a ###\n  def push(item)\n    @stack << item\n  end\n\n  ### \u51fa\u5806\u758a ###\n  def pop\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.pop\n  end\n\n  ### \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20 ###\n  def peek\n    raise IndexError, '\u5806\u758a\u70ba\u7a7a' if is_empty?\n\n    @stack.last\n  end\n\n  ### \u8fd4\u56de\u4e32\u5217\u7528\u65bc\u5217\u5370 ###\n  def to_array\n    @stack\n  end\nend\n
    array_stack.zig
    // \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\nfn ArrayStack(comptime T: type) type {\n    return struct {\n        const Self = @This();\n\n        stack: ?std.ArrayList(T) = null,     \n\n        // \u5efa\u69cb\u5b50\uff08\u5206\u914d\u8a18\u61b6\u9ad4+\u521d\u59cb\u5316\u5806\u758a\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\u69cb\u65b9\u6cd5\uff08\u91cb\u653e\u8a18\u61b6\u9ad4\uff09\n        pub fn deinit(self: *Self) void {\n            if (self.stack == null) return;\n            self.stack.?.deinit();\n        }\n\n        // \u7372\u53d6\u5806\u758a\u7684\u9577\u5ea6\n        pub fn size(self: *Self) usize {\n            return self.stack.?.items.len;\n        }\n\n        // \u5224\u65b7\u5806\u758a\u662f\u5426\u70ba\u7a7a\n        pub fn isEmpty(self: *Self) bool {\n            return self.size() == 0;\n        }\n\n        // \u8a2a\u554f\u5806\u758a\u9802\u5143\u7d20\n        pub fn peek(self: *Self) T {\n            if (self.isEmpty()) @panic(\"\u5806\u758a\u70ba\u7a7a\");\n            return self.stack.?.items[self.size() - 1];\n        }  \n\n        // \u5165\u5806\u758a\n        pub fn push(self: *Self, num: T) !void {\n            try self.stack.?.append(num);\n        } \n\n        // \u51fa\u5806\u758a\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_stack_and_queue/stack/#513","title":"5.1.3 \u00a0 \u5169\u7a2e\u5be6\u73fe\u5c0d\u6bd4","text":"

    \u652f\u6301\u64cd\u4f5c

    \u5169\u7a2e\u5be6\u73fe\u90fd\u652f\u6301\u5806\u758a\u5b9a\u7fa9\u4e2d\u7684\u5404\u9805\u64cd\u4f5c\u3002\u9663\u5217\u5be6\u73fe\u984d\u5916\u652f\u6301\u96a8\u6a5f\u8a2a\u554f\uff0c\u4f46\u9019\u5df2\u8d85\u51fa\u4e86\u5806\u758a\u7684\u5b9a\u7fa9\u7bc4\u7587\uff0c\u56e0\u6b64\u4e00\u822c\u4e0d\u6703\u7528\u5230\u3002

    \u6642\u9593\u6548\u7387

    \u5728\u57fa\u65bc\u9663\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u5165\u5806\u758a\u548c\u51fa\u5806\u758a\u64cd\u4f5c\u90fd\u5728\u9810\u5148\u5206\u914d\u597d\u7684\u9023\u7e8c\u8a18\u61b6\u9ad4\u4e2d\u9032\u884c\uff0c\u5177\u6709\u5f88\u597d\u7684\u5feb\u53d6\u672c\u5730\u6027\uff0c\u56e0\u6b64\u6548\u7387\u8f03\u9ad8\u3002\u7136\u800c\uff0c\u5982\u679c\u5165\u5806\u758a\u6642\u8d85\u51fa\u9663\u5217\u5bb9\u91cf\uff0c\u6703\u89f8\u767c\u64f4\u5bb9\u6a5f\u5236\uff0c\u5c0e\u81f4\u8a72\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u8b8a\u70ba \\(O(n)\\) \u3002

    \u5728\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u5be6\u73fe\u4e2d\uff0c\u93c8\u7d50\u4e32\u5217\u7684\u64f4\u5bb9\u975e\u5e38\u9748\u6d3b\uff0c\u4e0d\u5b58\u5728\u4e0a\u8ff0\u9663\u5217\u64f4\u5bb9\u6642\u6548\u7387\u964d\u4f4e\u7684\u554f\u984c\u3002\u4f46\u662f\uff0c\u5165\u5806\u758a\u64cd\u4f5c\u9700\u8981\u521d\u59cb\u5316\u7bc0\u9ede\u7269\u4ef6\u4e26\u4fee\u6539\u6307\u6a19\uff0c\u56e0\u6b64\u6548\u7387\u76f8\u5c0d\u8f03\u4f4e\u3002\u4e0d\u904e\uff0c\u5982\u679c\u5165\u5806\u758a\u5143\u7d20\u672c\u8eab\u5c31\u662f\u7bc0\u9ede\u7269\u4ef6\uff0c\u90a3\u9ebc\u53ef\u4ee5\u7701\u53bb\u521d\u59cb\u5316\u6b65\u9a5f\uff0c\u5f9e\u800c\u63d0\u9ad8\u6548\u7387\u3002

    \u7d9c\u4e0a\u6240\u8ff0\uff0c\u7576\u5165\u5806\u758a\u8207\u51fa\u5806\u758a\u64cd\u4f5c\u7684\u5143\u7d20\u662f\u57fa\u672c\u8cc7\u6599\u578b\u5225\u6642\uff0c\u4f8b\u5982 int \u6216 double \uff0c\u6211\u5011\u53ef\u4ee5\u5f97\u51fa\u4ee5\u4e0b\u7d50\u8ad6\u3002

    • \u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u5728\u89f8\u767c\u64f4\u5bb9\u6642\u6548\u7387\u6703\u964d\u4f4e\uff0c\u4f46\u7531\u65bc\u64f4\u5bb9\u662f\u4f4e\u983b\u64cd\u4f5c\uff0c\u56e0\u6b64\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    • \u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u4ee5\u63d0\u4f9b\u66f4\u52a0\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002

    \u7a7a\u9593\u6548\u7387

    \u5728\u521d\u59cb\u5316\u4e32\u5217\u6642\uff0c\u7cfb\u7d71\u6703\u70ba\u4e32\u5217\u5206\u914d\u201c\u521d\u59cb\u5bb9\u91cf\u201d\uff0c\u8a72\u5bb9\u91cf\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\uff1b\u4e26\u4e14\uff0c\u64f4\u5bb9\u6a5f\u5236\u901a\u5e38\u662f\u6309\u7167\u7279\u5b9a\u500d\u7387\uff08\u4f8b\u5982 2 \u500d\uff09\u9032\u884c\u64f4\u5bb9\u7684\uff0c\u64f4\u5bb9\u5f8c\u7684\u5bb9\u91cf\u4e5f\u53ef\u80fd\u8d85\u51fa\u5be6\u969b\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u57fa\u65bc\u9663\u5217\u5be6\u73fe\u7684\u5806\u758a\u53ef\u80fd\u9020\u6210\u4e00\u5b9a\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002

    \u7136\u800c\uff0c\u7531\u65bc\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u9700\u8981\u984d\u5916\u5132\u5b58\u6307\u6a19\uff0c\u56e0\u6b64\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u4f54\u7528\u7684\u7a7a\u9593\u76f8\u5c0d\u8f03\u5927\u3002

    \u7d9c\u4e0a\uff0c\u6211\u5011\u4e0d\u80fd\u7c21\u55ae\u5730\u78ba\u5b9a\u54ea\u7a2e\u5be6\u73fe\u66f4\u52a0\u7bc0\u7701\u8a18\u61b6\u9ad4\uff0c\u9700\u8981\u91dd\u5c0d\u5177\u9ad4\u60c5\u6cc1\u9032\u884c\u5206\u6790\u3002

    "},{"location":"chapter_stack_and_queue/stack/#514","title":"5.1.4 \u00a0 \u5806\u758a\u7684\u5178\u578b\u61c9\u7528","text":"
    • \u700f\u89bd\u5668\u4e2d\u7684\u5f8c\u9000\u8207\u524d\u9032\u3001\u8edf\u9ad4\u4e2d\u7684\u64a4\u92b7\u8207\u53cd\u64a4\u92b7\u3002\u6bcf\u7576\u6211\u5011\u958b\u555f\u65b0\u7684\u7db2\u9801\uff0c\u700f\u89bd\u5668\u5c31\u6703\u5c0d\u4e0a\u4e00\u500b\u7db2\u9801\u57f7\u884c\u5165\u5806\u758a\uff0c\u9019\u6a23\u6211\u5011\u5c31\u53ef\u4ee5\u901a\u904e\u5f8c\u9000\u64cd\u4f5c\u56de\u5230\u4e0a\u4e00\u500b\u7db2\u9801\u3002\u5f8c\u9000\u64cd\u4f5c\u5be6\u969b\u4e0a\u662f\u5728\u57f7\u884c\u51fa\u5806\u758a\u3002\u5982\u679c\u8981\u540c\u6642\u652f\u6301\u5f8c\u9000\u548c\u524d\u9032\uff0c\u90a3\u9ebc\u9700\u8981\u5169\u500b\u5806\u758a\u4f86\u914d\u5408\u5be6\u73fe\u3002
    • \u7a0b\u5f0f\u8a18\u61b6\u9ad4\u7ba1\u7406\u3002\u6bcf\u6b21\u547c\u53eb\u51fd\u5f0f\u6642\uff0c\u7cfb\u7d71\u90fd\u6703\u5728\u5806\u758a\u9802\u65b0\u589e\u4e00\u500b\u5806\u758a\u5e40\uff0c\u7528\u65bc\u8a18\u9304\u51fd\u5f0f\u7684\u4e0a\u4e0b\u6587\u8cc7\u8a0a\u3002\u5728\u905e\u8ff4\u51fd\u5f0f\u4e2d\uff0c\u5411\u4e0b\u905e\u63a8\u968e\u6bb5\u6703\u4e0d\u65b7\u57f7\u884c\u5165\u5806\u758a\u64cd\u4f5c\uff0c\u800c\u5411\u4e0a\u56de\u6eaf\u968e\u6bb5\u5247\u6703\u4e0d\u65b7\u57f7\u884c\u51fa\u5806\u758a\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/","title":"5.4 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_stack_and_queue/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u5806\u758a\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5f8c\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u53ef\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002
    • \u5728\u6642\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u5177\u6709\u8f03\u9ad8\u7684\u5e73\u5747\u6548\u7387\uff0c\u4f46\u5728\u64f4\u5bb9\u904e\u7a0b\u4e2d\uff0c\u55ae\u6b21\u5165\u5806\u758a\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002\u76f8\u6bd4\u4e4b\u4e0b\uff0c\u5806\u758a\u7684\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\u5177\u6709\u66f4\u70ba\u7a69\u5b9a\u7684\u6548\u7387\u8868\u73fe\u3002
    • \u5728\u7a7a\u9593\u6548\u7387\u65b9\u9762\uff0c\u5806\u758a\u7684\u9663\u5217\u5be6\u73fe\u53ef\u80fd\u5c0e\u81f4\u4e00\u5b9a\u7a0b\u5ea6\u7684\u7a7a\u9593\u6d6a\u8cbb\u3002\u4f46\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u93c8\u7d50\u4e32\u5217\u7bc0\u9ede\u6240\u4f54\u7528\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u6bd4\u9663\u5217\u5143\u7d20\u66f4\u5927\u3002
    • \u4f47\u5217\u662f\u4e00\u7a2e\u9075\u5faa\u5148\u5165\u5148\u51fa\u539f\u5247\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u540c\u6a23\u53ef\u4ee5\u900f\u904e\u9663\u5217\u6216\u93c8\u7d50\u4e32\u5217\u4f86\u5be6\u73fe\u3002\u5728\u6642\u9593\u6548\u7387\u548c\u7a7a\u9593\u6548\u7387\u7684\u5c0d\u6bd4\u4e0a\uff0c\u4f47\u5217\u7684\u7d50\u8ad6\u8207\u524d\u8ff0\u5806\u758a\u7684\u7d50\u8ad6\u76f8\u4f3c\u3002
    • \u96d9\u5411\u4f47\u5217\u662f\u4e00\u7a2e\u5177\u6709\u66f4\u9ad8\u81ea\u7531\u5ea6\u7684\u4f47\u5217\uff0c\u5b83\u5141\u8a31\u5728\u5169\u7aef\u9032\u884c\u5143\u7d20\u7684\u65b0\u589e\u548c\u522a\u9664\u64cd\u4f5c\u3002
    "},{"location":"chapter_stack_and_queue/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u662f\u5426\u662f\u96d9\u5411\u93c8\u7d50\u4e32\u5217\u5be6\u73fe\uff1f

    \u700f\u89bd\u5668\u7684\u524d\u9032\u5f8c\u9000\u529f\u80fd\u672c\u8cea\u4e0a\u662f\u201c\u5806\u758a\u201d\u7684\u9ad4\u73fe\u3002\u7576\u7528\u6236\u8a2a\u554f\u4e00\u500b\u65b0\u9801\u9762\u6642\uff0c\u8a72\u9801\u9762\u6703\u88ab\u65b0\u589e\u5230\u5806\u758a\u9802\uff1b\u7576\u7528\u6236\u9ede\u9078\u5f8c\u9000\u6309\u9215\u6642\uff0c\u8a72\u9801\u9762\u6703\u5f9e\u5806\u758a\u9802\u5f48\u51fa\u3002\u4f7f\u7528\u96d9\u5411\u4f47\u5217\u53ef\u4ee5\u65b9\u4fbf\u5730\u5be6\u73fe\u4e00\u4e9b\u984d\u5916\u64cd\u4f5c\uff0c\u9019\u500b\u5728\u201c\u96d9\u5411\u4f47\u5217\u201d\u7ae0\u7bc0\u6709\u63d0\u5230\u3002

    Q\uff1a\u5728\u51fa\u5806\u758a\u5f8c\uff0c\u662f\u5426\u9700\u8981\u91cb\u653e\u51fa\u5806\u758a\u7bc0\u9ede\u7684\u8a18\u61b6\u9ad4\uff1f

    \u5982\u679c\u5f8c\u7e8c\u4ecd\u9700\u8981\u4f7f\u7528\u5f48\u51fa\u7bc0\u9ede\uff0c\u5247\u4e0d\u9700\u8981\u91cb\u653e\u8a18\u61b6\u9ad4\u3002\u82e5\u4e4b\u5f8c\u4e0d\u9700\u8981\u7528\u5230\uff0cJava \u548c Python \u7b49\u8a9e\u8a00\u64c1\u6709\u81ea\u52d5\u5783\u573e\u56de\u6536\u6a5f\u5236\uff0c\u56e0\u6b64\u4e0d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\uff1b\u5728 C \u548c C++ \u4e2d\u9700\u8981\u624b\u52d5\u91cb\u653e\u8a18\u61b6\u9ad4\u3002

    Q\uff1a\u96d9\u5411\u4f47\u5217\u50cf\u662f\u5169\u500b\u5806\u758a\u62fc\u63a5\u5728\u4e86\u4e00\u8d77\uff0c\u5b83\u7684\u7528\u9014\u662f\u4ec0\u9ebc\uff1f

    \u96d9\u5411\u4f47\u5217\u5c31\u50cf\u662f\u5806\u758a\u548c\u4f47\u5217\u7684\u7d44\u5408\u6216\u5169\u500b\u5806\u758a\u62fc\u5728\u4e86\u4e00\u8d77\u3002\u5b83\u8868\u73fe\u7684\u662f\u5806\u758a + \u4f47\u5217\u7684\u908f\u8f2f\uff0c\u56e0\u6b64\u53ef\u4ee5\u5be6\u73fe\u5806\u758a\u8207\u4f47\u5217\u7684\u6240\u6709\u61c9\u7528\uff0c\u4e26\u4e14\u66f4\u52a0\u9748\u6d3b\u3002

    Q\uff1a\u64a4\u92b7\uff08undo\uff09\u548c\u53cd\u64a4\u92b7\uff08redo\uff09\u5177\u9ad4\u662f\u5982\u4f55\u5be6\u73fe\u7684\uff1f

    \u4f7f\u7528\u5169\u500b\u5806\u758a\uff0c\u5806\u758a A \u7528\u65bc\u64a4\u92b7\uff0c\u5806\u758a B \u7528\u65bc\u53cd\u64a4\u92b7\u3002

    1. \u6bcf\u7576\u4f7f\u7528\u8005\u57f7\u884c\u4e00\u500b\u64cd\u4f5c\uff0c\u5c07\u9019\u500b\u64cd\u4f5c\u58d3\u5165\u5806\u758a A \uff0c\u4e26\u6e05\u7a7a\u5806\u758a B \u3002
    2. \u7576\u7528\u6236\u57f7\u884c\u201c\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a A \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a B \u3002
    3. \u7576\u7528\u6236\u57f7\u884c\u201c\u53cd\u64a4\u92b7\u201d\u6642\uff0c\u5f9e\u5806\u758a B \u4e2d\u5f48\u51fa\u6700\u8fd1\u7684\u64cd\u4f5c\uff0c\u4e26\u5c07\u5176\u58d3\u5165\u5806\u758a A \u3002
    "},{"location":"chapter_tree/","title":"\u7b2c 7 \u7ae0 \u00a0 \u6a39","text":"

    Abstract

    \u53c3\u5929\u5927\u6a39\u5145\u6eff\u751f\u547d\u529b\uff0c\u6839\u6df1\u8449\u8302\uff0c\u5206\u679d\u6276\u758f\u3002

    \u5b83\u70ba\u6211\u5011\u5c55\u73fe\u4e86\u8cc7\u6599\u5206\u6cbb\u7684\u751f\u52d5\u5f62\u614b\u3002

    "},{"location":"chapter_tree/#_1","title":"\u672c\u7ae0\u5167\u5bb9","text":"
    • 7.1 \u00a0 \u4e8c\u5143\u6a39
    • 7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a
    • 7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a
    • 7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39
    • 7.5 \u00a0 AVL *
    • 7.6 \u00a0 \u5c0f\u7d50
    "},{"location":"chapter_tree/array_representation_of_tree/","title":"7.3 \u00a0 \u4e8c\u5143\u6a39\u9663\u5217\u8868\u793a","text":"

    \u5728\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u5132\u5b58\u55ae\u5143\u70ba\u7bc0\u9ede TreeNode \uff0c\u7bc0\u9ede\u4e4b\u9593\u900f\u904e\u6307\u6a19\u76f8\u9023\u7dda\u3002\u4e0a\u4e00\u7bc0\u4ecb\u7d39\u4e86\u93c8\u7d50\u4e32\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7684\u5404\u9805\u57fa\u672c\u64cd\u4f5c\u3002

    \u90a3\u9ebc\uff0c\u6211\u5011\u80fd\u5426\u7528\u9663\u5217\u4f86\u8868\u793a\u4e8c\u5143\u6a39\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\u5143\u6a39","text":"

    \u5148\u5206\u6790\u4e00\u500b\u7c21\u55ae\u6848\u4f8b\u3002\u7d66\u5b9a\u4e00\u68f5\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u6211\u5011\u5c07\u6240\u6709\u7bc0\u9ede\u6309\u7167\u5c64\u5e8f\u8d70\u8a2a\u7684\u9806\u5e8f\u5132\u5b58\u5728\u4e00\u500b\u9663\u5217\u4e2d\uff0c\u5247\u6bcf\u500b\u7bc0\u9ede\u90fd\u5c0d\u61c9\u552f\u4e00\u7684\u9663\u5217\u7d22\u5f15\u3002

    \u6839\u64da\u5c64\u5e8f\u8d70\u8a2a\u7684\u7279\u6027\uff0c\u6211\u5011\u53ef\u4ee5\u63a8\u5c0e\u51fa\u7236\u7bc0\u9ede\u7d22\u5f15\u8207\u5b50\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u201c\u5c0d\u6620\u516c\u5f0f\u201d\uff1a\u82e5\u67d0\u7bc0\u9ede\u7684\u7d22\u5f15\u70ba \\(i\\) \uff0c\u5247\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 1\\) \uff0c\u53f3\u5b50\u7bc0\u9ede\u7d22\u5f15\u70ba \\(2i + 2\\) \u3002\u5716 7-12 \u5c55\u793a\u4e86\u5404\u500b\u7bc0\u9ede\u7d22\u5f15\u4e4b\u9593\u7684\u5c0d\u6620\u95dc\u4fc2\u3002

    \u5716 7-12 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u5c0d\u6620\u516c\u5f0f\u7684\u89d2\u8272\u76f8\u7576\u65bc\u93c8\u7d50\u4e32\u5217\u4e2d\u7684\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002\u7d66\u5b9a\u9663\u5217\u4e2d\u7684\u4efb\u610f\u4e00\u500b\u7bc0\u9ede\uff0c\u6211\u5011\u90fd\u53ef\u4ee5\u900f\u904e\u5c0d\u6620\u516c\u5f0f\u4f86\u8a2a\u554f\u5b83\u7684\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3002

    "},{"location":"chapter_tree/array_representation_of_tree/#732","title":"7.3.2 \u00a0 \u8868\u793a\u4efb\u610f\u4e8c\u5143\u6a39","text":"

    \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u4e00\u500b\u7279\u4f8b\uff0c\u5728\u4e8c\u5143\u6a39\u7684\u4e2d\u9593\u5c64\u901a\u5e38\u5b58\u5728\u8a31\u591a None \u3002\u7531\u65bc\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e26\u4e0d\u5305\u542b\u9019\u4e9b None \uff0c\u56e0\u6b64\u6211\u5011\u7121\u6cd5\u50c5\u6191\u8a72\u5e8f\u5217\u4f86\u63a8\u6e2c None \u7684\u6578\u91cf\u548c\u5206\u4f48\u4f4d\u7f6e\u3002\u9019\u610f\u5473\u8457\u5b58\u5728\u591a\u7a2e\u4e8c\u5143\u6a39\u7d50\u69cb\u90fd\u7b26\u5408\u8a72\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002

    \u5982\u5716 7-13 \u6240\u793a\uff0c\u7d66\u5b9a\u4e00\u68f5\u975e\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff0c\u4e0a\u8ff0\u9663\u5217\u8868\u793a\u65b9\u6cd5\u5df2\u7d93\u5931\u6548\u3002

    \u5716 7-13 \u00a0 \u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c0d\u61c9\u591a\u7a2e\u4e8c\u5143\u6a39\u53ef\u80fd\u6027

    \u70ba\u4e86\u89e3\u6c7a\u6b64\u554f\u984c\uff0c\u6211\u5011\u53ef\u4ee5\u8003\u616e\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u4e2d\u986f\u5f0f\u5730\u5beb\u51fa\u6240\u6709 None \u3002\u5982\u5716 7-14 \u6240\u793a\uff0c\u9019\u6a23\u8655\u7406\u5f8c\uff0c\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u5c31\u53ef\u4ee5\u552f\u4e00\u8868\u793a\u4e8c\u5143\u6a39\u4e86\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    # \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\n# \u4f7f\u7528 None \u4f86\u8868\u793a\u7a7a\u4f4d\ntree = [1, 2, 3, 4, None, 6, 7, 8, 9, None, None, 12, None, None, 15]\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c INT_MAX \u6a19\u8a18\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u7684\u5305\u88dd\u985e\u5225 Integer \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nInteger[] tree = { 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 };\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nint?[] tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 any \u578b\u5225\u7684\u5207\u7247, \u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\ntree := []any{1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15}\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 Int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 nil \u4f86\u6a19\u8a18\u7a7a\u4f4d\nlet tree: [Int?] = [1, 2, 3, 4, nil, 6, 7, 8, 9, nil, nil, 12, nil, nil, 15]\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nlet tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int? \u53ef\u7a7a\u578b\u5225 \uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528 null \u4f86\u6a19\u8a18\u7a7a\u4f4d\nList<int?> tree = [1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15];\n
    /* \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 None \u4f86\u6a19\u8a18\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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 int \u6700\u5927\u503c\u6a19\u8a18\u7a7a\u4f4d\uff0c\u56e0\u6b64\u8981\u6c42\u7bc0\u9ede\u503c\u4e0d\u80fd\u70ba 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\u5143\u6a39\u7684\u9663\u5217\u8868\u793a */\n// \u4f7f\u7528 null \u4f86\u8868\u793a\u7a7a\u4f4d\nval tree = arrayOf( 1, 2, 3, 4, null, 6, 7, 8, 9, null, null, 12, null, null, 15 )\n
    \n
    \n

    \u5716 7-14 \u00a0 \u4efb\u610f\u578b\u5225\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u503c\u5f97\u8aaa\u660e\u7684\u662f\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\u975e\u5e38\u9069\u5408\u4f7f\u7528\u9663\u5217\u4f86\u8868\u793a\u3002\u56de\u9867\u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u5b9a\u7fa9\uff0cNone \u53ea\u51fa\u73fe\u5728\u6700\u5e95\u5c64\u4e14\u9760\u53f3\u7684\u4f4d\u7f6e\uff0c\u56e0\u6b64\u6240\u6709 None \u4e00\u5b9a\u51fa\u73fe\u5728\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u672b\u5c3e\u3002

    \u9019\u610f\u5473\u8457\u4f7f\u7528\u9663\u5217\u8868\u793a\u5b8c\u5168\u4e8c\u5143\u6a39\u6642\uff0c\u53ef\u4ee5\u7701\u7565\u5132\u5b58\u6240\u6709 None \uff0c\u975e\u5e38\u65b9\u4fbf\u3002\u5716 7-15 \u7d66\u51fa\u4e86\u4e00\u500b\u4f8b\u5b50\u3002

    \u5716 7-15 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a

    \u4ee5\u4e0b\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e86\u4e00\u68f5\u57fa\u65bc\u9663\u5217\u8868\u793a\u7684\u4e8c\u5143\u6a39\uff0c\u5305\u62ec\u4ee5\u4e0b\u5e7e\u7a2e\u64cd\u4f5c\u3002

    • \u7d66\u5b9a\u67d0\u7bc0\u9ede\uff0c\u7372\u53d6\u5b83\u7684\u503c\u3001\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u3001\u7236\u7bc0\u9ede\u3002
    • \u7372\u53d6\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u3001\u5f8c\u5e8f\u8d70\u8a2a\u3001\u5c64\u5e8f\u8d70\u8a2a\u5e8f\u5217\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig array_binary_tree.py
    class ArrayBinaryTree:\n    \"\"\"\u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225\"\"\"\n\n    def __init__(self, arr: list[int | None]):\n        \"\"\"\u5efa\u69cb\u5b50\"\"\"\n        self._tree = list(arr)\n\n    def size(self):\n        \"\"\"\u4e32\u5217\u5bb9\u91cf\"\"\"\n        return len(self._tree)\n\n    def val(self, i: int) -> int:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c\"\"\"\n        # \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 1\n\n    def right(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return 2 * i + 2\n\n    def parent(self, i: int) -> int | None:\n        \"\"\"\u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15\"\"\"\n        return (i - 1) // 2\n\n    def level_order(self) -> list[int]:\n        \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        # \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a\"\"\"\n        if self.val(i) is None:\n            return\n        # \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\":\n            self.res.append(self.val(i))\n        self.dfs(self.left(i), order)\n        # \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\":\n            self.res.append(self.val(i))\n        self.dfs(self.right(i), order)\n        # \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\":\n            self.res.append(self.val(i))\n\n    def pre_order(self) -> list[int]:\n        \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"pre\")\n        return self.res\n\n    def in_order(self) -> list[int]:\n        \"\"\"\u4e2d\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"in\")\n        return self.res\n\n    def post_order(self) -> list[int]:\n        \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n        self.res = []\n        self.dfs(0, order=\"post\")\n        return self.res\n
    array_binary_tree.cpp
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  public:\n    /* \u5efa\u69cb\u5b50 */\n    ArrayBinaryTree(vector<int> arr) {\n        tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    int val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    int parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    vector<int> levelOrder() {\n        vector<int> res;\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u8d70\u8a2a */\n    vector<int> preOrder() {\n        vector<int> res;\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    vector<int> inOrder() {\n        vector<int> res;\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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\u512a\u5148\u8d70\u8a2a */\n    void dfs(int i, string order, vector<int> &res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == INT_MAX)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.push_back(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.push_back(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.push_back(val(i));\n    }\n};\n
    array_binary_tree.java
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private List<Integer> tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    public ArrayBinaryTree(List<Integer> arr) {\n        tree = new ArrayList<>(arr);\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int size() {\n        return tree.size();\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public Integer val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public Integer parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<Integer> levelOrder() {\n        List<Integer> res = new ArrayList<>();\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    private void dfs(Integer i, String order, List<Integer> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (val(i) == null)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\".equals(order))\n            res.add(val(i));\n        dfs(left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\".equals(order))\n            res.add(val(i));\n        dfs(right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\".equals(order))\n            res.add(val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<Integer> preOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<Integer> inOrder() {\n        List<Integer> res = new ArrayList<>();\n        dfs(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(List<int?> arr) {\n    List<int?> tree = new(arr);\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    public int Size() {\n        return tree.Count;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    public int? Val(int i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= Size())\n            return null;\n        return tree[i];\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Left(int i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Right(int i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    public int Parent(int i) {\n        return (i - 1) / 2;\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    public List<int> LevelOrder() {\n        List<int> res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    void DFS(int i, string order, List<int> res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (!Val(i).HasValue)\n            return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order == \"pre\")\n            res.Add(Val(i)!.Value);\n        DFS(Left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order == \"in\")\n            res.Add(Val(i)!.Value);\n        DFS(Right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order == \"post\")\n            res.Add(Val(i)!.Value);\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    public List<int> PreOrder() {\n        List<int> res = [];\n        DFS(0, \"pre\", res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    public List<int> InOrder() {\n        List<int> res = [];\n        DFS(0, \"in\", res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    public List<int> PostOrder() {\n        List<int> res = [];\n        DFS(0, \"post\", res);\n        return res;\n    }\n}\n
    array_binary_tree.go
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\ntype arrayBinaryTree struct {\n    tree []any\n}\n\n/* \u5efa\u69cb\u5b50 */\nfunc newArrayBinaryTree(arr []any) *arrayBinaryTree {\n    return &arrayBinaryTree{\n        tree: arr,\n    }\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nfunc (abt *arrayBinaryTree) size() int {\n    return len(abt.tree)\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nfunc (abt *arrayBinaryTree) val(i int) any {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) left(i int) int {\n    return 2*i + 1\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) right(i int) int {\n    return 2*i + 2\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\nfunc (abt *arrayBinaryTree) parent(i int) int {\n    return (i - 1) / 2\n}\n\n/* \u5c64\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) levelOrder() []any {\n    var res []any\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) dfs(i int, order string, res *[]any) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if abt.val(i) == nil {\n        return\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if order == \"pre\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.left(i), order, res)\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if order == \"in\" {\n        *res = append(*res, abt.val(i))\n    }\n    abt.dfs(abt.right(i), order, res)\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if order == \"post\" {\n        *res = append(*res, abt.val(i))\n    }\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) preOrder() []any {\n    var res []any\n    abt.dfs(0, \"pre\", &res)\n    return res\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) inOrder() []any {\n    var res []any\n    abt.dfs(0, \"in\", &res)\n    return res\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc (abt *arrayBinaryTree) postOrder() []any {\n    var res []any\n    abt.dfs(0, \"post\", &res)\n    return res\n}\n
    array_binary_tree.swift
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    private var tree: [Int?]\n\n    /* \u5efa\u69cb\u5b50 */\n    init(arr: [Int?]) {\n        tree = arr\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    func size() -> Int {\n        tree.count\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    func val(i: Int) -> Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func left(i: Int) -> Int {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func right(i: Int) -> Int {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    func parent(i: Int) -> Int {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    func levelOrder() -> [Int] {\n        var res: [Int] = []\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    private func dfs(i: Int, order: String, res: inout [Int]) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        guard let val = val(i: i) else {\n            return\n        }\n        // \u524d\u5e8f\u8d70\u8a2a\n        if order == \"pre\" {\n            res.append(val)\n        }\n        dfs(i: left(i: i), order: order, res: &res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.append(val)\n        }\n        dfs(i: right(i: i), order: order, res: &res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.append(val)\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    func preOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"pre\", res: &res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    func inOrder() -> [Int] {\n        var res: [Int] = []\n        dfs(i: 0, order: \"in\", res: &res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree;\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size() {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i) {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i) {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i) {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i) {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder() {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    #dfs(i, order, res) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder() {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder() {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder() {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.ts
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n    #tree: (number | null)[];\n\n    /* \u5efa\u69cb\u5b50 */\n    constructor(arr: (number | null)[]) {\n        this.#tree = arr;\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    size(): number {\n        return this.#tree.length;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    val(i: number): number | null {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    left(i: number): number {\n        return 2 * i + 1;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    right(i: number): number {\n        return 2 * i + 2;\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    parent(i: number): number {\n        return Math.floor((i - 1) / 2); // \u5411\u4e0b\u6574\u9664\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    levelOrder(): number[] {\n        let res = [];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    #dfs(i: number, order: Order, res: (number | null)[]): void {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (this.val(i) === null) return;\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (order === 'pre') res.push(this.val(i));\n        this.#dfs(this.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (order === 'in') res.push(this.val(i));\n        this.#dfs(this.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (order === 'post') res.push(this.val(i));\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    preOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'pre', res);\n        return res;\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    inOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'in', res);\n        return res;\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\n    postOrder(): (number | null)[] {\n        const res = [];\n        this.#dfs(0, 'post', res);\n        return res;\n    }\n}\n
    array_binary_tree.dart
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree {\n  late List<int?> _tree;\n\n  /* \u5efa\u69cb\u5b50 */\n  ArrayBinaryTree(this._tree);\n\n  /* \u4e32\u5217\u5bb9\u91cf */\n  int size() {\n    return _tree.length;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n  int? val(int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? left(int i) {\n    return 2 * i + 1;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? right(int i) {\n    return 2 * i + 2;\n  }\n\n  /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n  int? parent(int i) {\n    return (i - 1) ~/ 2;\n  }\n\n  /* \u5c64\u5e8f\u8d70\u8a2a */\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\u512a\u5148\u8d70\u8a2a */\n  void dfs(int i, String order, List<int?> res) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(i) == null) {\n      return;\n    }\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (order == 'pre') {\n      res.add(val(i));\n    }\n    dfs(left(i)!, order, res);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (order == 'in') {\n      res.add(val(i));\n    }\n    dfs(right(i)!, order, res);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (order == 'post') {\n      res.add(val(i));\n    }\n  }\n\n  /* \u524d\u5e8f\u8d70\u8a2a */\n  List<int?> preOrder() {\n    List<int?> res = [];\n    dfs(0, 'pre', res);\n    return res;\n  }\n\n  /* \u4e2d\u5e8f\u8d70\u8a2a */\n  List<int?> inOrder() {\n    List<int?> res = [];\n    dfs(0, 'in', res);\n    return res;\n  }\n\n  /* \u5f8c\u5e8f\u8d70\u8a2a */\n  List<int?> postOrder() {\n    List<int?> res = [];\n    dfs(0, 'post', res);\n    return res;\n  }\n}\n
    array_binary_tree.rs
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nstruct ArrayBinaryTree {\n    tree: Vec<Option<i32>>,\n}\n\nimpl ArrayBinaryTree {\n    /* \u5efa\u69cb\u5b50 */\n    fn new(arr: Vec<Option<i32>>) -> Self {\n        Self { tree: arr }\n    }\n\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fn size(&self) -> i32 {\n        self.tree.len() as i32\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fn val(&self, i: i32) -> Option<i32> {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn left(&self, i: i32) -> i32 {\n        2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn right(&self, i: i32) -> i32 {\n        2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fn parent(&self, i: i32) -> i32 {\n        (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fn level_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\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\u8d70\u8a2a\n        if order == \"pre\" {\n            res.push(val);\n        }\n        self.dfs(self.left(i), order, res);\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if order == \"in\" {\n            res.push(val);\n        }\n        self.dfs(self.right(i), order, res);\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if order == \"post\" {\n            res.push(val);\n        }\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\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\u8d70\u8a2a */\n    fn in_order(&self) -> Vec<i32> {\n        let mut res = vec![];\n        self.dfs(0, \"in\", &mut res);\n        res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u7d50\u69cb\u9ad4 */\ntypedef struct {\n    int *tree;\n    int size;\n} ArrayBinaryTree;\n\n/* \u5efa\u69cb\u5b50 */\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\u69cb\u51fd\u5f0f */\nvoid delArrayBinaryTree(ArrayBinaryTree *abt) {\n    free(abt->tree);\n    free(abt);\n}\n\n/* \u4e32\u5217\u5bb9\u91cf */\nint size(ArrayBinaryTree *abt) {\n    return abt->size;\n}\n\n/* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\nint val(ArrayBinaryTree *abt, int i) {\n    // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\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/* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(ArrayBinaryTree *abt, int *returnSize) {\n    int *res = (int *)malloc(sizeof(int) * size(abt));\n    int index = 0;\n    // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\nvoid dfs(ArrayBinaryTree *abt, int i, char *order, int *res, int *index) {\n    // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n    if (val(abt, i) == INT_MAX)\n        return;\n    // \u524d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"pre\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, left(i), order, res, index);\n    // \u4e2d\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"in\") == 0)\n        res[(*index)++] = val(abt, i);\n    dfs(abt, right(i), order, res, index);\n    // \u5f8c\u5e8f\u8d70\u8a2a\n    if (strcmp(order, \"post\") == 0)\n        res[(*index)++] = val(abt, i);\n}\n\n/* \u524d\u5e8f\u8d70\u8a2a */\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\u8d70\u8a2a */\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/* \u5f8c\u5e8f\u8d70\u8a2a */\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
    /* \u9663\u5217\u8868\u793a\u4e0b\u7684\u4e8c\u5143\u6a39\u985e\u5225 */\nclass ArrayBinaryTree(val tree: MutableList<Int?>) {\n    /* \u4e32\u5217\u5bb9\u91cf */\n    fun size(): Int {\n        return tree.size\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u503c */\n    fun _val(i: Int): Int? {\n        // \u82e5\u7d22\u5f15\u8d8a\u754c\uff0c\u5247\u8fd4\u56de null \uff0c\u4ee3\u8868\u7a7a\u4f4d\n        if (i < 0 || i >= size()) return null\n        return tree[i]\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun left(i: Int): Int {\n        return 2 * i + 1\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u53f3\u5b50\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun right(i: Int): Int {\n        return 2 * i + 2\n    }\n\n    /* \u7372\u53d6\u7d22\u5f15\u70ba i \u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\u7684\u7d22\u5f15 */\n    fun parent(i: Int): Int {\n        return (i - 1) / 2\n    }\n\n    /* \u5c64\u5e8f\u8d70\u8a2a */\n    fun levelOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        // \u76f4\u63a5\u8d70\u8a2a\u9663\u5217\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\u512a\u5148\u8d70\u8a2a */\n    fun dfs(i: Int, order: String, res: MutableList<Int?>) {\n        // \u82e5\u70ba\u7a7a\u4f4d\uff0c\u5247\u8fd4\u56de\n        if (_val(i) == null)\n            return\n        // \u524d\u5e8f\u8d70\u8a2a\n        if (\"pre\" == order)\n            res.add(_val(i))\n        dfs(left(i), order, res)\n        // \u4e2d\u5e8f\u8d70\u8a2a\n        if (\"in\" == order)\n            res.add(_val(i))\n        dfs(right(i), order, res)\n        // \u5f8c\u5e8f\u8d70\u8a2a\n        if (\"post\" == order)\n            res.add(_val(i))\n    }\n\n    /* \u524d\u5e8f\u8d70\u8a2a */\n    fun preOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"pre\", res)\n        return res\n    }\n\n    /* \u4e2d\u5e8f\u8d70\u8a2a */\n    fun inOrder(): MutableList<Int?> {\n        val res = mutableListOf<Int?>()\n        dfs(0, \"in\", res)\n        return res\n    }\n\n    /* \u5f8c\u5e8f\u8d70\u8a2a */\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
    [class]{ArrayBinaryTree}-[func]{}\n
    array_binary_tree.zig
    [class]{ArrayBinaryTree}-[func]{}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/array_representation_of_tree/#733","title":"7.3.3 \u00a0 \u512a\u9ede\u8207\u4fb7\u9650\u6027","text":"

    \u4e8c\u5143\u6a39\u7684\u9663\u5217\u8868\u793a\u4e3b\u8981\u6709\u4ee5\u4e0b\u512a\u9ede\u3002

    • \u9663\u5217\u5132\u5b58\u5728\u9023\u7e8c\u7684\u8a18\u61b6\u9ad4\u7a7a\u9593\u4e2d\uff0c\u5c0d\u5feb\u53d6\u53cb\u597d\uff0c\u8a2a\u554f\u8207\u8d70\u8a2a\u901f\u5ea6\u8f03\u5feb\u3002
    • \u4e0d\u9700\u8981\u5132\u5b58\u6307\u6a19\uff0c\u6bd4\u8f03\u7bc0\u7701\u7a7a\u9593\u3002
    • \u5141\u8a31\u96a8\u6a5f\u8a2a\u554f\u7bc0\u9ede\u3002

    \u7136\u800c\uff0c\u9663\u5217\u8868\u793a\u4e5f\u5b58\u5728\u4e00\u4e9b\u4fb7\u9650\u6027\u3002

    • \u9663\u5217\u5132\u5b58\u9700\u8981\u9023\u7e8c\u8a18\u61b6\u9ad4\u7a7a\u9593\uff0c\u56e0\u6b64\u4e0d\u9069\u5408\u5132\u5b58\u8cc7\u6599\u91cf\u904e\u5927\u7684\u6a39\u3002
    • \u589e\u522a\u7bc0\u9ede\u9700\u8981\u900f\u904e\u9663\u5217\u63d2\u5165\u8207\u522a\u9664\u64cd\u4f5c\u5be6\u73fe\uff0c\u6548\u7387\u8f03\u4f4e\u3002
    • \u7576\u4e8c\u5143\u6a39\u4e2d\u5b58\u5728\u5927\u91cf None \u6642\uff0c\u9663\u5217\u4e2d\u5305\u542b\u7684\u7bc0\u9ede\u8cc7\u6599\u6bd4\u91cd\u8f03\u4f4e\uff0c\u7a7a\u9593\u5229\u7528\u7387\u8f03\u4f4e\u3002
    "},{"location":"chapter_tree/avl_tree/","title":"7.5 \u00a0 AVL \u6a39 *","text":"

    \u5728\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7ae0\u7bc0\u4e2d\u6211\u5011\u63d0\u5230\uff0c\u5728\u591a\u6b21\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u53ef\u80fd\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u6240\u6709\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5c07\u5f9e \\(O(\\log n)\\) \u52a3\u5316\u70ba \\(O(n)\\) \u3002

    \u5982\u5716 7-24 \u6240\u793a\uff0c\u7d93\u904e\u5169\u6b21\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\uff0c\u9019\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\u4fbf\u6703\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u3002

    \u5716 7-24 \u00a0 AVL \u6a39\u5728\u522a\u9664\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

    \u518d\u4f8b\u5982\uff0c\u5728\u5716 7-25 \u6240\u793a\u7684\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u5169\u500b\u7bc0\u9ede\u5f8c\uff0c\u6a39\u5c07\u56b4\u91cd\u5411\u5de6\u50be\u659c\uff0c\u67e5\u8a62\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u96a8\u4e4b\u52a3\u5316\u3002

    \u5716 7-25 \u00a0 AVL \u6a39\u5728\u63d2\u5165\u7bc0\u9ede\u5f8c\u767c\u751f\u9000\u5316

    1962 \u5e74 G. M. Adelson-Velsky \u548c E. M. Landis \u5728\u8ad6\u6587\u201cAn algorithm for the organization of information\u201d\u4e2d\u63d0\u51fa\u4e86 AVL \u6a39\u3002\u8ad6\u6587\u4e2d\u8a73\u7d30\u63cf\u8ff0\u4e86\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u78ba\u4fdd\u5728\u6301\u7e8c\u65b0\u589e\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u4e0d\u6703\u9000\u5316\uff0c\u5f9e\u800c\u4f7f\u5f97\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4fdd\u6301\u5728 \\(O(\\log n)\\) \u7d1a\u5225\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u5728\u9700\u8981\u983b\u7e41\u9032\u884c\u589e\u522a\u67e5\u6539\u64cd\u4f5c\u7684\u5834\u666f\u4e2d\uff0cAVL \u6a39\u80fd\u59cb\u7d42\u4fdd\u6301\u9ad8\u6548\u7684\u8cc7\u6599\u64cd\u4f5c\u6548\u80fd\uff0c\u5177\u6709\u5f88\u597d\u7684\u61c9\u7528\u50f9\u503c\u3002

    "},{"location":"chapter_tree/avl_tree/#751-avl","title":"7.5.1 \u00a0 AVL \u6a39\u5e38\u898b\u8853\u8a9e","text":"

    AVL \u6a39\u65e2\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u4e5f\u662f\u5e73\u8861\u4e8c\u5143\u6a39\uff0c\u540c\u6642\u6eff\u8db3\u9019\u5169\u985e\u4e8c\u5143\u6a39\u7684\u6240\u6709\u6027\u8cea\uff0c\u56e0\u6b64\u662f\u4e00\u7a2e\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff08balanced binary search tree\uff09\u3002

    "},{"location":"chapter_tree/avl_tree/#1","title":"1. \u00a0 \u7bc0\u9ede\u9ad8\u5ea6","text":"

    \u7531\u65bc AVL \u6a39\u7684\u76f8\u95dc\u64cd\u4f5c\u9700\u8981\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u56e0\u6b64\u6211\u5011\u9700\u8981\u70ba\u7bc0\u9ede\u985e\u5225\u65b0\u589e height \u8b8a\u6578\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"AVL \u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                 # \u7bc0\u9ede\u503c\n        self.height: int = 0                # \u7bc0\u9ede\u9ad8\u5ea6\n        self.left: TreeNode | None = None   # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None  # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nstruct TreeNode {\n    int val{};          // \u7bc0\u9ede\u503c\n    int height = 0;     // \u7bc0\u9ede\u9ad8\u5ea6\n    TreeNode *left{};   // \u5de6\u5b50\u7bc0\u9ede\n    TreeNode *right{};  // \u53f3\u5b50\u7bc0\u9ede\n    TreeNode() = default;\n    explicit TreeNode(int x) : val(x){}\n};\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    public int val;        // \u7bc0\u9ede\u503c\n    public int height;     // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode left;  // \u5de6\u5b50\u7bc0\u9ede\n    public TreeNode right; // \u53f3\u5b50\u7bc0\u9ede\n    public TreeNode(int x) { val = x; }\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val    int       // \u7bc0\u9ede\u503c\n    Height int       // \u7bc0\u9ede\u9ad8\u5ea6\n    Left   *TreeNode // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    Right  *TreeNode // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var height: Int // \u7bc0\u9ede\u9ad8\u5ea6\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\n\n    init(x: Int) {\n        val = x\n        height = 0\n    }\n}\n
    /* AVL \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    height; //\u7bc0\u9ede\u9ad8\u5ea6\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val: number;            // \u7bc0\u9ede\u503c\n    height: number;         // \u7bc0\u9ede\u9ad8\u5ea6\n    left: TreeNode | null;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right: TreeNode | null; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  int height;      // \u7bc0\u9ede\u9ad8\u5ea6\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\n  TreeNode(this.val, [this.height = 0, this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* AVL \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    height: i32,                            // \u7bc0\u9ede\u9ad8\u5ea6\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\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 \u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nTreeNode struct TreeNode {\n    int val;\n    int height;\n    struct TreeNode *left;\n    struct TreeNode *right;\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\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 \u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val height: Int = 0          // \u7bc0\u9ede\u9ad8\u5ea6\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\n}\n
    \n
    \n

    \u201c\u7bc0\u9ede\u9ad8\u5ea6\u201d\u662f\u6307\u5f9e\u8a72\u7bc0\u9ede\u5230\u5b83\u7684\u6700\u9060\u8449\u7bc0\u9ede\u7684\u8ddd\u96e2\uff0c\u5373\u6240\u7d93\u904e\u7684\u201c\u908a\u201d\u7684\u6578\u91cf\u3002\u9700\u8981\u7279\u5225\u6ce8\u610f\u7684\u662f\uff0c\u8449\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(0\\) \uff0c\u800c\u7a7a\u7bc0\u9ede\u7684\u9ad8\u5ea6\u70ba \\(-1\\) \u3002\u6211\u5011\u5c07\u5efa\u7acb\u5169\u500b\u5de5\u5177\u51fd\u5f0f\uff0c\u5206\u5225\u7528\u65bc\u7372\u53d6\u548c\u66f4\u65b0\u7bc0\u9ede\u7684\u9ad8\u5ea6\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def height(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 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\u7bc0\u9ede\u9ad8\u5ea6\"\"\"\n    # \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = max([self.height(node.left), self.height(node.right)]) + 1\n
    avl_tree.cpp
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == nullptr ? -1 : node->height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node->height = max(height(node->left), height(node->right)) + 1;\n}\n
    avl_tree.java
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.cs
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint Height(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid UpdateHeight(TreeNode node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height = Math.Max(Height(node.left), Height(node.right)) + 1;\n}\n
    avl_tree.go
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) height(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if node != nil {\n        return node.Height\n    }\n    return -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc (t *aVLTree) updateHeight(node *TreeNode) {\n    lh := t.height(node.Left)\n    rh := t.height(node.Right)\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc height(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    node?.height ?? -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfunc updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node: node?.left), height(node: node?.right)) + 1\n}\n
    avl_tree.js
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\n#updateHeight(node) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.ts
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nheight(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node === null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nupdateHeight(node: TreeNode): void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node.height =\n        Math.max(this.height(node.left), this.height(node.right)) + 1;\n}\n
    avl_tree.dart
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n  return node == null ? -1 : node.height;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode? node) {\n  // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n  node!.height = max(height(node.left), height(node.right)) + 1;\n}\n
    avl_tree.rs
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfn height(node: OptionTreeNodeRc) -> i32 {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    match node {\n        Some(node) => node.borrow().height,\n        None => -1,\n    }\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\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        // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n        node.borrow_mut().height = std::cmp::max(Self::height(left), Self::height(right)) + 1;\n    }\n}\n
    avl_tree.c
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nint height(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    if (node != NULL) {\n        return node->height;\n    }\n    return -1;\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nvoid updateHeight(TreeNode *node) {\n    int lh = height(node->left);\n    int rh = height(node->right);\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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
    /* \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6 */\nfun height(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return node?.height ?: -1\n}\n\n/* \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6 */\nfun updateHeight(node: TreeNode?) {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\u9ad8\u5ea6 + 1\n    node?.height = max(height(node?.left), height(node?.right)) + 1\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{height}\n\n[class]{AVLTree}-[func]{update_height}\n
    avl_tree.zig
    // \u7372\u53d6\u7bc0\u9ede\u9ad8\u5ea6\nfn height(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    _ = self;\n    // \u7a7a\u7bc0\u9ede\u9ad8\u5ea6\u70ba -1 \uff0c\u8449\u7bc0\u9ede\u9ad8\u5ea6\u70ba 0\n    return if (node == null) -1 else node.?.height;\n}\n\n// \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\nfn updateHeight(self: *Self, node: ?*inc.TreeNode(T)) void {\n    // \u7bc0\u9ede\u9ad8\u5ea6\u7b49\u65bc\u6700\u9ad8\u5b50\u6a39\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 \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50","text":"

    \u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\uff08balance factor\uff09\u5b9a\u7fa9\u70ba\u7bc0\u9ede\u5de6\u5b50\u6a39\u7684\u9ad8\u5ea6\u6e1b\u53bb\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\uff0c\u540c\u6642\u898f\u5b9a\u7a7a\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u70ba \\(0\\) \u3002\u6211\u5011\u540c\u6a23\u5c07\u7372\u53d6\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u7684\u529f\u80fd\u5c01\u88dd\u6210\u51fd\u5f0f\uff0c\u65b9\u4fbf\u5f8c\u7e8c\u4f7f\u7528\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def balance_factor(self, node: TreeNode | None) -> int:\n    \"\"\"\u7372\u53d6\u5e73\u8861\u56e0\u5b50\"\"\"\n    # \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node is None:\n        return 0\n    # \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.left) - self.height(node.right)\n
    avl_tree.cpp
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == nullptr)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.java
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null)\n        return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right);\n}\n
    avl_tree.cs
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint BalanceFactor(TreeNode? node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return Height(node.left) - Height(node.right);\n}\n
    avl_tree.go
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc (t *aVLTree) balanceFactor(node *TreeNode) int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if node == nil {\n        return 0\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return t.height(node.Left) - t.height(node.Right)\n}\n
    avl_tree.swift
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfunc balanceFactor(node: TreeNode?) -> Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    guard let node = node else { return 0 }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node: node.left) - height(node: node.right)\n}\n
    avl_tree.js
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.ts
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nbalanceFactor(node: TreeNode): number {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node === null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return this.height(node.left) - this.height(node.right);\n}\n
    avl_tree.dart
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode? node) {\n  // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n  if (node == null) return 0;\n  // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n  return height(node.left) - height(node.right);\n}\n
    avl_tree.rs
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfn balance_factor(node: OptionTreeNodeRc) -> i32 {\n    match node {\n        // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n        None => 0,\n        // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\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
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nint balanceFactor(TreeNode *node) {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == NULL) {\n        return 0;\n    }\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node->left) - height(node->right);\n}\n
    avl_tree.kt
    /* \u7372\u53d6\u5e73\u8861\u56e0\u5b50 */\nfun balanceFactor(node: TreeNode?): Int {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return height(node.left) - height(node.right)\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{balance_factor}\n
    avl_tree.zig
    // \u7372\u53d6\u5e73\u8861\u56e0\u5b50\nfn balanceFactor(self: *Self, node: ?*inc.TreeNode(T)) i32 {\n    // \u7a7a\u7bc0\u9ede\u5e73\u8861\u56e0\u5b50\u70ba 0\n    if (node == null) return 0;\n    // \u7bc0\u9ede\u5e73\u8861\u56e0\u5b50 = \u5de6\u5b50\u6a39\u9ad8\u5ea6 - \u53f3\u5b50\u6a39\u9ad8\u5ea6\n    return self.height(node.?.left) - self.height(node.?.right);\n}\n

    Note

    \u8a2d\u5e73\u8861\u56e0\u5b50\u70ba \\(f\\) \uff0c\u5247\u4e00\u68f5 AVL \u6a39\u7684\u4efb\u610f\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7686\u6eff\u8db3 \\(-1 \\le f \\le 1\\) \u3002

    "},{"location":"chapter_tree/avl_tree/#752-avl","title":"7.5.2 \u00a0 AVL \u6a39\u65cb\u8f49","text":"

    AVL \u6a39\u7684\u7279\u9ede\u5728\u65bc\u201c\u65cb\u8f49\u201d\u64cd\u4f5c\uff0c\u5b83\u80fd\u5920\u5728\u4e0d\u5f71\u97ff\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u7684\u524d\u63d0\u4e0b\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u63db\u53e5\u8a71\u8aaa\uff0c\u65cb\u8f49\u64cd\u4f5c\u65e2\u80fd\u4fdd\u6301\u201c\u4e8c\u5143\u641c\u5c0b\u6a39\u201d\u7684\u6027\u8cea\uff0c\u4e5f\u80fd\u4f7f\u6a39\u91cd\u65b0\u8b8a\u70ba\u201c\u5e73\u8861\u4e8c\u5143\u6a39\u201d\u3002

    \u6211\u5011\u5c07\u5e73\u8861\u56e0\u5b50\u7d55\u5c0d\u503c \\(> 1\\) \u7684\u7bc0\u9ede\u7a31\u70ba\u201c\u5931\u8861\u7bc0\u9ede\u201d\u3002\u6839\u64da\u7bc0\u9ede\u5931\u8861\u60c5\u6cc1\u7684\u4e0d\u540c\uff0c\u65cb\u8f49\u64cd\u4f5c\u5206\u70ba\u56db\u7a2e\uff1a\u53f3\u65cb\u3001\u5de6\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3002\u4e0b\u9762\u8a73\u7d30\u4ecb\u7d39\u9019\u4e9b\u65cb\u8f49\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/avl_tree/#1_1","title":"1. \u00a0 \u53f3\u65cb","text":"

    \u5982\u5716 7-26 \u6240\u793a\uff0c\u7bc0\u9ede\u4e0b\u65b9\u70ba\u5e73\u8861\u56e0\u5b50\u3002\u5f9e\u5e95\u81f3\u9802\u770b\uff0c\u4e8c\u5143\u6a39\u4e2d\u9996\u500b\u5931\u8861\u7bc0\u9ede\u662f\u201c\u7bc0\u9ede 3\u201d\u3002\u6211\u5011\u95dc\u6ce8\u4ee5\u8a72\u5931\u8861\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\u7684\u5b50\u6a39\uff0c\u5c07\u8a72\u7bc0\u9ede\u8a18\u70ba node \uff0c\u5176\u5de6\u5b50\u7bc0\u9ede\u8a18\u70ba child \uff0c\u57f7\u884c\u201c\u53f3\u65cb\u201d\u64cd\u4f5c\u3002\u5b8c\u6210\u53f3\u65cb\u5f8c\uff0c\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\uff0c\u4e26\u4e14\u4ecd\u7136\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u3002

    <1><2><3><4>

    \u5716 7-26 \u00a0 \u53f3\u65cb\u64cd\u4f5c\u6b65\u9a5f

    \u5982\u5716 7-27 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u53f3\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u53f3\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u5de6\u5b50\u7bc0\u9ede\u3002

    \u5716 7-27 \u00a0 \u6709 grand_child \u7684\u53f3\u65cb\u64cd\u4f5c

    \u201c\u5411\u53f3\u65cb\u8f49\u201d\u662f\u4e00\u7a2e\u5f62\u8c61\u5316\u7684\u8aaa\u6cd5\uff0c\u5be6\u969b\u4e0a\u9700\u8981\u900f\u904e\u4fee\u6539\u7bc0\u9ede\u6307\u6a19\u4f86\u5be6\u73fe\uff0c\u7a0b\u5f0f\u78bc\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.Right = node\n    node.Left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child?.right = node\n    node?.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node;\n    node.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n  child.right = node;\n  node.left = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n            child.borrow_mut().right = Some(node.clone());\n            node.borrow_mut().left = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child->right = node;\n    node->left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.right = node\n    node.left = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{right_rotate}\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u53f3\u65cb\u8f49\n    child.?.right = node;\n    node.?.left = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_1","title":"2. \u00a0 \u5de6\u65cb","text":"

    \u76f8\u61c9\u5730\uff0c\u5982\u679c\u8003\u616e\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u201c\u6620\u8c61\u201d\uff0c\u5247\u9700\u8981\u57f7\u884c\u5716 7-28 \u6240\u793a\u7684\u201c\u5de6\u65cb\u201d\u64cd\u4f5c\u3002

    \u5716 7-28 \u00a0 \u5de6\u65cb\u64cd\u4f5c

    \u540c\u7406\uff0c\u5982\u5716 7-29 \u6240\u793a\uff0c\u7576\u7bc0\u9ede child \u6709\u5de6\u5b50\u7bc0\u9ede\uff08\u8a18\u70ba grand_child \uff09\u6642\uff0c\u9700\u8981\u5728\u5de6\u65cb\u4e2d\u65b0\u589e\u4e00\u6b65\uff1a\u5c07 grand_child \u4f5c\u70ba node \u7684\u53f3\u5b50\u7bc0\u9ede\u3002

    \u5716 7-29 \u00a0 \u6709 grand_child \u7684\u5de6\u65cb\u64cd\u4f5c

    \u53ef\u4ee5\u89c0\u5bdf\u5230\uff0c\u53f3\u65cb\u548c\u5de6\u65cb\u64cd\u4f5c\u5728\u908f\u8f2f\u4e0a\u662f\u6620\u8c61\u5c0d\u7a31\u7684\uff0c\u5b83\u5011\u5206\u5225\u89e3\u6c7a\u7684\u5169\u7a2e\u5931\u8861\u60c5\u6cc1\u4e5f\u662f\u5c0d\u7a31\u7684\u3002\u57fa\u65bc\u5c0d\u7a31\u6027\uff0c\u6211\u5011\u53ea\u9700\u5c07\u53f3\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\u4e2d\u7684\u6240\u6709\u7684 left \u66ff\u63db\u70ba right \uff0c\u5c07\u6240\u6709\u7684 right \u66ff\u63db\u70ba left \uff0c\u5373\u53ef\u5f97\u5230\u5de6\u65cb\u7684\u5be6\u73fe\u7a0b\u5f0f\u78bc\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grand_child\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    self.update_height(child)\n    # \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    UpdateHeight(node);\n    UpdateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.Left = node\n    node.Right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    t.updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child?.left = node\n    node?.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node: node)\n    updateHeight(node: child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.#updateHeight(node);\n    this.#updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node;\n    node.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    this.updateHeight(node);\n    this.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n  child.left = node;\n  node.right = grandChild;\n  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  updateHeight(node);\n  updateHeight(child);\n  // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n            child.borrow_mut().left = Some(node.clone());\n            node.borrow_mut().right = grand_child;\n            // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n            Self::update_height(Some(node));\n            Self::update_height(Some(child.clone()));\n            // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child->left = node;\n    node->right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.left = node\n    node.right = grandChild\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node)\n    updateHeight(child)\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{left_rotate}\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 \u70ba\u539f\u9ede\uff0c\u5c07 node \u5411\u5de6\u65cb\u8f49\n    child.?.left = node;\n    node.?.right = grandChild;\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.updateHeight(node);\n    self.updateHeight(child);\n    // \u8fd4\u56de\u65cb\u8f49\u5f8c\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return child;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3","title":"3. \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb","text":"

    \u5c0d\u65bc\u5716 7-30 \u4e2d\u7684\u5931\u8861\u7bc0\u9ede 3 \uff0c\u50c5\u4f7f\u7528\u5de6\u65cb\u6216\u53f3\u65cb\u90fd\u7121\u6cd5\u4f7f\u5b50\u6a39\u6062\u5fa9\u5e73\u8861\u3002\u6b64\u6642\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u5de6\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u53f3\u65cb\u201d\u3002

    \u5716 7-30 \u00a0 \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb

    "},{"location":"chapter_tree/avl_tree/#4","title":"4. \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb","text":"

    \u5982\u5716 7-31 \u6240\u793a\uff0c\u5c0d\u65bc\u4e0a\u8ff0\u5931\u8861\u4e8c\u5143\u6a39\u7684\u6620\u8c61\u60c5\u6cc1\uff0c\u9700\u8981\u5148\u5c0d child \u57f7\u884c\u201c\u53f3\u65cb\u201d\uff0c\u518d\u5c0d node \u57f7\u884c\u201c\u5de6\u65cb\u201d\u3002

    \u5716 7-31 \u00a0 \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

    "},{"location":"chapter_tree/avl_tree/#5","title":"5. \u00a0 \u65cb\u8f49\u7684\u9078\u64c7","text":"

    \u5716 7-32 \u5c55\u793a\u7684\u56db\u7a2e\u5931\u8861\u60c5\u6cc1\u8207\u4e0a\u8ff0\u6848\u4f8b\u9010\u500b\u5c0d\u61c9\uff0c\u5206\u5225\u9700\u8981\u63a1\u7528\u53f3\u65cb\u3001\u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\u3001\u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\u3001\u5de6\u65cb\u7684\u64cd\u4f5c\u3002

    \u5716 7-32 \u00a0 AVL \u6a39\u7684\u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1

    \u5982\u4e0b\u8868\u6240\u793a\uff0c\u6211\u5011\u900f\u904e\u5224\u65b7\u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u4ee5\u53ca\u8f03\u9ad8\u4e00\u5074\u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50\u7684\u6b63\u8ca0\u865f\uff0c\u4f86\u78ba\u5b9a\u5931\u8861\u7bc0\u9ede\u5c6c\u65bc\u5716 7-32 \u4e2d\u7684\u54ea\u7a2e\u60c5\u6cc1\u3002

    \u8868 7-3 \u00a0 \u56db\u7a2e\u65cb\u8f49\u60c5\u6cc1\u7684\u9078\u64c7\u689d\u4ef6

    \u5931\u8861\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u5b50\u7bc0\u9ede\u7684\u5e73\u8861\u56e0\u5b50 \u61c9\u63a1\u7528\u7684\u65cb\u8f49\u65b9\u6cd5 \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(\\geq 0\\) \u53f3\u65cb \\(> 1\\) \uff08\u5de6\u504f\u6a39\uff09 \\(<0\\) \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(\\leq 0\\) \u5de6\u65cb \\(< -1\\) \uff08\u53f3\u504f\u6a39\uff09 \\(>0\\) \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb

    \u70ba\u4e86\u4fbf\u65bc\u4f7f\u7528\uff0c\u6211\u5011\u5c07\u65cb\u8f49\u64cd\u4f5c\u5c01\u88dd\u6210\u4e00\u500b\u51fd\u5f0f\u3002\u6709\u4e86\u9019\u500b\u51fd\u5f0f\uff0c\u6211\u5011\u5c31\u80fd\u5c0d\u5404\u7a2e\u5931\u8861\u60c5\u6cc1\u9032\u884c\u65cb\u8f49\uff0c\u4f7f\u5931\u8861\u7bc0\u9ede\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def rotate(self, node: TreeNode | None) -> TreeNode | None:\n    \"\"\"\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\"\"\"\n    # \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    balance_factor = self.balance_factor(node)\n    # \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = self.left_rotate(node.left)\n            return self.right_rotate(node)\n    # \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = self.right_rotate(node.right)\n            return self.left_rotate(node)\n    # \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n
    avl_tree.cpp
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int _balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (_balanceFactor > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (_balanceFactor < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.java
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode rotate(TreeNode node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactor = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.cs
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? Rotate(TreeNode? node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int balanceFactorInt = BalanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (balanceFactorInt > 1) {\n        if (BalanceFactor(node?.left) >= 0) {\n            // \u53f3\u65cb\n            return RightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node!.left = LeftRotate(node!.left);\n            return RightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactorInt < -1) {\n        if (BalanceFactor(node?.right) <= 0) {\n            // \u5de6\u65cb\n            return LeftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node!.right = RightRotate(node!.right);\n            return LeftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.go
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc (t *aVLTree) rotate(node *TreeNode) *TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    // Go \u63a8\u85a6\u77ed\u8b8a\u6578\uff0c\u9019\u88e1 bf \u6307\u4ee3 t.balanceFactor\n    bf := t.balanceFactor(node)\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.Left = t.leftRotate(node.Left)\n            return t.rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.Right = t.rightRotate(node.Right)\n            return t.leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.swift
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfunc rotate(node: TreeNode?) -> TreeNode? {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balanceFactor = balanceFactor(node: node)\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node?.left = leftRotate(node: node?.left)\n            return rightRotate(node: node)\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node?.right = rightRotate(node: node?.right)\n            return leftRotate(node: node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.js
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n#rotate(node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = this.#leftRotate(node.left);\n            return this.#rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = this.#rightRotate(node.right);\n            return this.#leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.ts
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nrotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    const balanceFactor = this.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.left = this.leftRotate(node.left);\n            return this.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.right = this.rightRotate(node.right);\n            return this.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.dart
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode? rotate(TreeNode? node) {\n  // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n  int factor = balanceFactor(node);\n  // \u5de6\u504f\u6a39\n  if (factor > 1) {\n    if (balanceFactor(node!.left) >= 0) {\n      // \u53f3\u65cb\n      return rightRotate(node);\n    } else {\n      // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n      node.left = leftRotate(node.left);\n      return rightRotate(node);\n    }\n  }\n  // \u53f3\u504f\u6a39\n  if (factor < -1) {\n    if (balanceFactor(node!.right) <= 0) {\n      // \u5de6\u65cb\n      return leftRotate(node);\n    } else {\n      // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n      node.right = rightRotate(node.right);\n      return leftRotate(node);\n    }\n  }\n  // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n  return node;\n}\n
    avl_tree.rs
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfn rotate(node: OptionTreeNodeRc) -> OptionTreeNodeRc {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    let balance_factor = Self::balance_factor(node.clone());\n    // \u5de6\u504f\u6a39\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\u5f8c\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\u6a39\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\u5f8c\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\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n        node\n    }\n}\n
    avl_tree.c
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nTreeNode *rotate(TreeNode *node) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    int bf = balanceFactor(node);\n    // \u5de6\u504f\u6a39\n    if (bf > 1) {\n        if (balanceFactor(node->left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node);\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node->left = leftRotate(node->left);\n            return rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (bf < -1) {\n        if (balanceFactor(node->right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node);\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node->right = rightRotate(node->right);\n            return leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    avl_tree.kt
    /* \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\nfun rotate(node: TreeNode): TreeNode {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    val balanceFactor = balanceFactor(node)\n    // \u5de6\u504f\u6a39\n    if (balanceFactor > 1) {\n        if (balanceFactor(node.left) >= 0) {\n            // \u53f3\u65cb\n            return rightRotate(node)\n        } else {\n            // \u5148\u5de6\u65cb\u5f8c\u53f3\u65cb\n            node.left = leftRotate(node.left)\n            return rightRotate(node)\n        }\n    }\n    // \u53f3\u504f\u6a39\n    if (balanceFactor < -1) {\n        if (balanceFactor(node.right) <= 0) {\n            // \u5de6\u65cb\n            return leftRotate(node)\n        } else {\n            // \u5148\u53f3\u65cb\u5f8c\u5de6\u65cb\n            node.right = rightRotate(node.right)\n            return leftRotate(node)\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{rotate}\n
    avl_tree.zig
    // \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\nfn rotate(self: *Self, node: ?*inc.TreeNode(T)) ?*inc.TreeNode(T) {\n    // \u7372\u53d6\u7bc0\u9ede node \u7684\u5e73\u8861\u56e0\u5b50\n    var balance_factor = self.balanceFactor(node);\n    // \u5de6\u504f\u6a39\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\u5f8c\u53f3\u65cb\n            node.?.left = self.leftRotate(node.?.left);\n            return self.rightRotate(node);\n        }\n    }\n    // \u53f3\u504f\u6a39\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\u5f8c\u5de6\u65cb\n            node.?.right = self.rightRotate(node.?.right);\n            return self.leftRotate(node);\n        }\n    }\n    // \u5e73\u8861\u6a39\uff0c\u7121\u9808\u65cb\u8f49\uff0c\u76f4\u63a5\u8fd4\u56de\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#753-avl","title":"7.5.3 \u00a0 AVL \u6a39\u5e38\u7528\u64cd\u4f5c","text":""},{"location":"chapter_tree/avl_tree/#1_2","title":"1. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

    AVL \u6a39\u7684\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u5728\u4e3b\u9ad4\u4e0a\u985e\u4f3c\u3002\u552f\u4e00\u7684\u5340\u5225\u5728\u65bc\uff0c\u5728 AVL \u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede\u5f8c\uff0c\u5f9e\u8a72\u7bc0\u9ede\u5230\u6839\u7bc0\u9ede\u7684\u8def\u5f91\u4e0a\u53ef\u80fd\u6703\u51fa\u73fe\u4e00\u7cfb\u5217\u5931\u8861\u7bc0\u9ede\u3002\u56e0\u6b64\uff0c\u6211\u5011\u9700\u8981\u5f9e\u9019\u500b\u7bc0\u9ede\u958b\u59cb\uff0c\u81ea\u5e95\u5411\u4e0a\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def insert(self, val):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    self._root = self.insert_helper(self._root, val)\n\ndef insert_helper(self, node: TreeNode | None, val: int) -> TreeNode:\n    \"\"\"\u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return TreeNode(val)\n    # 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    # \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.java
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n    root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode insertHelper(TreeNode node, int val) {\n    if (node == null)\n        return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.cs
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid Insert(int val) {\n    root = InsertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? InsertHelper(TreeNode? node, int val) {\n    if (node == null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    UpdateHeight(node);  // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.go
    /* \u63d2\u5165\u7bc0\u9ede */\nfunc (t *aVLTree) insert(val int) {\n    t.root = t.insertHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) insertHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return NewTreeNode(val)\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.swift
    /* \u63d2\u5165\u7bc0\u9ede */\nfunc insert(val: Int) {\n    root = insertHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    updateHeight(node: node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.js
    /* \u63d2\u5165\u7bc0\u9ede */\ninsert(val) {\n    this.root = this.#insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#insertHelper(node, val) {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    this.#updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.ts
    /* \u63d2\u5165\u7bc0\u9ede */\ninsert(val: number): void {\n    this.root = this.insertHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\ninsertHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return new TreeNode(val);\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    this.updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.dart
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(int val) {\n  root = insertHelper(root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? insertHelper(TreeNode? node, int val) {\n  if (node == null) return TreeNode(val);\n  /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n  updateHeight(node); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
    avl_tree.rs
    /* \u63d2\u5165\u7bc0\u9ede */\nfn insert(&mut self, val: i32) {\n    self.root = Self::insert_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn insert_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n                }\n            }\n            Self::update_height(Some(node.clone())); // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => Some(TreeNode::new(val)),\n    }\n}\n
    avl_tree.c
    /* \u63d2\u5165\u7bc0\u9ede */\nvoid insert(AVLTree *tree, int val) {\n    tree->root = insertHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *insertHelper(TreeNode *node, int val) {\n    if (node == NULL) {\n        return newTreeNode(val);\n    }\n    /* 1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n        return node;\n    }\n    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.kt
    /* \u63d2\u5165\u7bc0\u9ede */\nfun insert(_val: Int) {\n    root = insertHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede */\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    updateHeight(node) // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{insert}\n\n[class]{AVLTree}-[func]{insert_helper}\n
    avl_tree.zig
    // \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, val: T) !void {\n    self.root = (try self.insertHelper(self.root, val)).?;\n}\n\n// \u905e\u8ff4\u63d2\u5165\u7bc0\u9ede\uff08\u8f14\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\u8a62\u63d2\u5165\u4f4d\u7f6e\u4e26\u63d2\u5165\u7bc0\u9ede\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\u8907\u7bc0\u9ede\u4e0d\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\n    }\n    self.updateHeight(node);    // \u66f4\u65b0\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#2_2","title":"2. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u985e\u4f3c\u5730\uff0c\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u522a\u9664\u7bc0\u9ede\u65b9\u6cd5\u7684\u57fa\u790e\u4e0a\uff0c\u9700\u8981\u5f9e\u5e95\u81f3\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6240\u6709\u5931\u8861\u7bc0\u9ede\u6062\u5fa9\u5e73\u8861\u3002\u7a0b\u5f0f\u78bc\u5982\u4e0b\u6240\u793a\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig avl_tree.py
    def remove(self, val: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    self._root = self.remove_helper(self._root, val)\n\ndef remove_helper(self, node: TreeNode | None, val: int) -> TreeNode | None:\n    \"\"\"\u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09\"\"\"\n    if node is None:\n        return None\n    # 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child is None:\n                return None\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else:\n                node = child\n        else:\n            # \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    self.update_height(node)\n    # 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    return self.rotate(node)\n
    avl_tree.cpp
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    if (node == nullptr)\n        return nullptr;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == nullptr) {\n                delete node;\n                return nullptr;\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                delete node;\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.java
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n    root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode removeHelper(TreeNode node, int val) {\n    if (node == null)\n        return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.cs
    /* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int val) {\n    root = RemoveHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? RemoveHelper(TreeNode? node, int val) {\n    if (node == null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = Rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.go
    /* \u522a\u9664\u7bc0\u9ede */\nfunc (t *aVLTree) remove(val int) {\n    t.root = t.removeHelper(t.root, val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nfunc (t *aVLTree) removeHelper(node *TreeNode, val int) *TreeNode {\n    if node == nil {\n        return nil\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                return nil\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    t.updateHeight(node)\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = t.rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.swift
    /* \u522a\u9664\u7bc0\u9ede */\nfunc remove(val: Int) {\n    root = removeHelper(node: root, val: val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\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\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if child == nil {\n                return nil\n            }\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else {\n                node = child\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node: node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.js
    /* \u522a\u9664\u7bc0\u9ede */\nremove(val) {\n    this.root = this.#removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\n#removeHelper(node, val) {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else node = child;\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.#rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.ts
    /* \u522a\u9664\u7bc0\u9ede */\nremove(val: number): void {\n    this.root = this.removeHelper(this.root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nremoveHelper(node: TreeNode, val: number): TreeNode {\n    if (node === null) return null;\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child === null) {\n                return null;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = this.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.dart
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int val) {\n  root = removeHelper(root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nTreeNode? removeHelper(TreeNode? node, int val) {\n  if (node == null) return null;\n  /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n      if (child == null)\n        return null;\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n      else\n        node = child;\n    } else {\n      // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n  /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n  node = rotate(node);\n  // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n  return node;\n}\n
    avl_tree.rs
    /* \u522a\u9664\u7bc0\u9ede */\nfn remove(&self, val: i32) {\n    Self::remove_helper(self.root.clone(), val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfn remove_helper(node: OptionTreeNodeRc, val: i32) -> OptionTreeNodeRc {\n    match node {\n        Some(mut node) => {\n            /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n                    None => {\n                        return None;\n                    }\n                    // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                    Some(child) => node = child,\n                }\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n\n            /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n            node = Self::rotate(Some(node)).unwrap();\n            // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n            Some(node)\n        }\n        None => None,\n    }\n}\n
    avl_tree.c
    /* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(AVLTree *tree, int val) {\n    TreeNode *root = removeHelper(tree->root, val);\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u51fd\u5f0f\uff09 */\nTreeNode *removeHelper(TreeNode *node, int val) {\n    TreeNode *child, *grandChild;\n    if (node == NULL) {\n        return NULL;\n    }\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == NULL) {\n                return NULL;\n            } else {\n                // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    updateHeight(node);\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    avl_tree.kt
    /* \u522a\u9664\u7bc0\u9ede */\nfun remove(_val: Int) {\n    root = removeHelper(root, _val)\n}\n\n/* \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\u52a9\u65b9\u6cd5\uff09 */\nfun removeHelper(n: TreeNode?, _val: Int): TreeNode? {\n    var node = n ?: return null\n    /* 1. \u67e5\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null)\n                return null\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            else\n                node = child\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    /* 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861 */\n    node = rotate(node)\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node\n}\n
    avl_tree.rb
    [class]{AVLTree}-[func]{remove}\n\n[class]{AVLTree}-[func]{remove_helper}\n
    avl_tree.zig
    // \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, val: T) void {\n   self.root = self.removeHelper(self.root, val).?;\n}\n\n// \u905e\u8ff4\u522a\u9664\u7bc0\u9ede\uff08\u8f14\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\u8a62\u7bc0\u9ede\u4e26\u522a\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\u7bc0\u9ede\u6578\u91cf = 0 \uff0c\u76f4\u63a5\u522a\u9664 node \u4e26\u8fd4\u56de\n            if (child == null) {\n                return null;\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 1 \uff0c\u76f4\u63a5\u522a\u9664 node\n            } else {\n                node = child;\n            }\n        } else {\n            // \u5b50\u7bc0\u9ede\u6578\u91cf = 2 \uff0c\u5247\u5c07\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u500b\u7bc0\u9ede\u522a\u9664\uff0c\u4e26\u7528\u8a72\u7bc0\u9ede\u66ff\u63db\u7576\u524d\u7bc0\u9ede\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\u7bc0\u9ede\u9ad8\u5ea6\n    // 2. \u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u8a72\u5b50\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\n    node = self.rotate(node);\n    // \u8fd4\u56de\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\n    return node;\n}\n
    "},{"location":"chapter_tree/avl_tree/#3_1","title":"3. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    AVL \u6a39\u7684\u7bc0\u9ede\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5143\u641c\u5c0b\u6a39\u4e00\u81f4\uff0c\u5728\u6b64\u4e0d\u518d\u8d05\u8ff0\u3002

    "},{"location":"chapter_tree/avl_tree/#754-avl","title":"7.5.4 \u00a0 AVL \u6a39\u5178\u578b\u61c9\u7528","text":"
    • \u7d44\u7e54\u548c\u5132\u5b58\u5927\u578b\u8cc7\u6599\uff0c\u9069\u7528\u65bc\u9ad8\u983b\u67e5\u8a62\u3001\u4f4e\u983b\u589e\u522a\u7684\u5834\u666f\u3002
    • \u7528\u65bc\u69cb\u5efa\u8cc7\u6599\u5eab\u4e2d\u7684\u7d22\u5f15\u7cfb\u7d71\u3002
    • \u7d05\u9ed1\u6a39\u4e5f\u662f\u4e00\u7a2e\u5e38\u898b\u7684\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\u3002\u76f8\u8f03\u65bc AVL \u6a39\uff0c\u7d05\u9ed1\u6a39\u7684\u5e73\u8861\u689d\u4ef6\u66f4\u5bec\u9b06\uff0c\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u6240\u9700\u7684\u65cb\u8f49\u64cd\u4f5c\u66f4\u5c11\uff0c\u7bc0\u9ede\u589e\u522a\u64cd\u4f5c\u7684\u5e73\u5747\u6548\u7387\u66f4\u9ad8\u3002
    "},{"location":"chapter_tree/binary_search_tree/","title":"7.4 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39","text":"

    \u5982\u5716 7-16 \u6240\u793a\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\uff08binary search tree\uff09\u6eff\u8db3\u4ee5\u4e0b\u689d\u4ef6\u3002

    1. \u5c0d\u65bc\u6839\u7bc0\u9ede\uff0c\u5de6\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c \\(<\\) \u6839\u7bc0\u9ede\u7684\u503c \\(<\\) \u53f3\u5b50\u6a39\u4e2d\u6240\u6709\u7bc0\u9ede\u7684\u503c\u3002
    2. \u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u3001\u53f3\u5b50\u6a39\u4e5f\u662f\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5373\u540c\u6a23\u6eff\u8db3\u689d\u4ef6 1. \u3002

    \u5716 7-16 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39

    "},{"location":"chapter_tree/binary_search_tree/#741","title":"7.4.1 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u64cd\u4f5c","text":"

    \u6211\u5011\u5c07\u4e8c\u5143\u641c\u5c0b\u6a39\u5c01\u88dd\u70ba\u4e00\u500b\u985e\u5225 BinarySearchTree \uff0c\u4e26\u5ba3\u544a\u4e00\u500b\u6210\u54e1\u8b8a\u6578 root \uff0c\u6307\u5411\u6a39\u7684\u6839\u7bc0\u9ede\u3002

    "},{"location":"chapter_tree/binary_search_tree/#1","title":"1. \u00a0 \u67e5\u8a62\u7bc0\u9ede","text":"

    \u7d66\u5b9a\u76ee\u6a19\u7bc0\u9ede\u503c num \uff0c\u53ef\u4ee5\u6839\u64da\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6027\u8cea\u4f86\u67e5\u8a62\u3002\u5982\u5716 7-17 \u6240\u793a\uff0c\u6211\u5011\u5ba3\u544a\u4e00\u500b\u7bc0\u9ede cur \uff0c\u5f9e\u4e8c\u5143\u6a39\u7684\u6839\u7bc0\u9ede root \u51fa\u767c\uff0c\u8ff4\u5708\u6bd4\u8f03\u7bc0\u9ede\u503c cur.val \u548c num \u4e4b\u9593\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

    • \u82e5 cur.val < num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.right \u3002
    • \u82e5 cur.val > num \uff0c\u8aaa\u660e\u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\uff0c\u56e0\u6b64\u57f7\u884c cur = cur.left \u3002
    • \u82e5 cur.val = num \uff0c\u8aaa\u660e\u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\u4e26\u8fd4\u56de\u8a72\u7bc0\u9ede\u3002
    <1><2><3><4>

    \u5716 7-17 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u67e5\u8a62\u7bc0\u9ede\u793a\u4f8b

    \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u67e5\u8a62\u64cd\u4f5c\u8207\u4e8c\u5206\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5de5\u4f5c\u539f\u7406\u4e00\u81f4\uff0c\u90fd\u662f\u6bcf\u8f2a\u6392\u9664\u4e00\u534a\u60c5\u6cc1\u3002\u8ff4\u5708\u6b21\u6578\u6700\u591a\u70ba\u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff0c\u7576\u4e8c\u5143\u6a39\u5e73\u8861\u6642\uff0c\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def search(self, num: int) -> TreeNode | None:\n    \"\"\"\u67e5\u8a62\u7bc0\u9ede\"\"\"\n    cur = self._root\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur is not None:\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        elif cur.val > num:\n            cur = cur.left\n        # \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else:\n            break\n    return cur\n
    binary_search_tree.cpp
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(int num) {\n    TreeNode *cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur->val > num)\n            cur = cur->left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.java
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode search(int num) {\n    TreeNode cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.cs
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? Search(int num) {\n    TreeNode? cur = root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur =\n            cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num)\n            cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.go
    /* \u67e5\u8a62\u7bc0\u9ede */\nfunc (bst *binarySearchTree) search(num int) *TreeNode {\n    node := bst.root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    for node != nil {\n        if node.Val.(int) < num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            node = node.Right\n        } else if node.Val.(int) > num {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            node = node.Left\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return node\n}\n
    binary_search_tree.swift
    /* \u67e5\u8a62\u7bc0\u9ede */\nfunc search(num: Int) -> TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if cur!.val > num {\n            cur = cur?.left\n        }\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else {\n            break\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
    binary_search_tree.js
    /* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num) {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.ts
    /* \u67e5\u8a62\u7bc0\u9ede */\nsearch(num: number): TreeNode | null {\n    let cur = this.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur.val > num) cur = cur.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else break;\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.dart
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode? search(int _num) {\n  TreeNode? cur = _root;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else if (cur.val > _num)\n      cur = cur.left;\n    // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    else\n      break;\n  }\n  // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n  return cur;\n}\n
    binary_search_tree.rs
    /* \u67e5\u8a62\u7bc0\u9ede */\npub fn search(&self, num: i32) -> OptionTreeNodeRc {\n    let mut cur = self.root.clone();\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => cur = node.borrow().right.clone(),\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => cur = node.borrow().left.clone(),\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n        }\n    }\n\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    cur\n}\n
    binary_search_tree.c
    /* \u67e5\u8a62\u7bc0\u9ede */\nTreeNode *search(BinarySearchTree *bst, int num) {\n    TreeNode *cur = bst->root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        if (cur->val < num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else if (cur->val > num) {\n            // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        } else {\n            // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    binary_search_tree.kt
    /* \u67e5\u8a62\u7bc0\u9ede */\nfun search(num: Int): TreeNode? {\n    var cur = root\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else if (cur._val > num)\n            cur.left\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        else\n            break\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur\n}\n
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{search}\n
    binary_search_tree.zig
    // \u67e5\u8a62\u7bc0\u9ede\nfn search(self: *Self, num: T) ?*inc.TreeNode(T) {\n    var cur = self.root;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u76ee\u6a19\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else if (cur.?.val > num) {\n            cur = cur.?.left;\n        // \u627e\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        } else {\n            break;\n        }\n    }\n    // \u8fd4\u56de\u76ee\u6a19\u7bc0\u9ede\n    return cur;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#2","title":"2. \u00a0 \u63d2\u5165\u7bc0\u9ede","text":"

    \u7d66\u5b9a\u4e00\u500b\u5f85\u63d2\u5165\u5143\u7d20 num \uff0c\u70ba\u4e86\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u63d2\u5165\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-18 \u6240\u793a\u3002

    1. \u67e5\u8a62\u63d2\u5165\u4f4d\u7f6e\uff1a\u8207\u67e5\u8a62\u64cd\u4f5c\u76f8\u4f3c\uff0c\u5f9e\u6839\u7bc0\u9ede\u51fa\u767c\uff0c\u6839\u64da\u7576\u524d\u7bc0\u9ede\u503c\u548c num \u7684\u5927\u5c0f\u95dc\u4fc2\u8ff4\u5708\u5411\u4e0b\u641c\u5c0b\uff0c\u76f4\u5230\u8d8a\u904e\u8449\u7bc0\u9ede\uff08\u8d70\u8a2a\u81f3 None \uff09\u6642\u8df3\u51fa\u8ff4\u5708\u3002
    2. \u5728\u8a72\u4f4d\u7f6e\u63d2\u5165\u7bc0\u9ede\uff1a\u521d\u59cb\u5316\u7bc0\u9ede num \uff0c\u5c07\u8a72\u7bc0\u9ede\u7f6e\u65bc None \u7684\u4f4d\u7f6e\u3002

    \u5716 7-18 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u63d2\u5165\u7bc0\u9ede

    \u5728\u7a0b\u5f0f\u78bc\u5be6\u73fe\u4e2d\uff0c\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u5169\u9ede\u3002

    • \u4e8c\u5143\u641c\u5c0b\u6a39\u4e0d\u5141\u8a31\u5b58\u5728\u91cd\u8907\u7bc0\u9ede\uff0c\u5426\u5247\u5c07\u9055\u53cd\u5176\u5b9a\u7fa9\u3002\u56e0\u6b64\uff0c\u82e5\u5f85\u63d2\u5165\u7bc0\u9ede\u5728\u6a39\u4e2d\u5df2\u5b58\u5728\uff0c\u5247\u4e0d\u57f7\u884c\u63d2\u5165\uff0c\u76f4\u63a5\u8fd4\u56de\u3002
    • \u70ba\u4e86\u5be6\u73fe\u63d2\u5165\u7bc0\u9ede\uff0c\u6211\u5011\u9700\u8981\u85c9\u52a9\u7bc0\u9ede pre \u5132\u5b58\u4e0a\u4e00\u8f2a\u8ff4\u5708\u7684\u7bc0\u9ede\u3002\u9019\u6a23\u5728\u8d70\u8a2a\u81f3 None \u6642\uff0c\u6211\u5011\u53ef\u4ee5\u7372\u53d6\u5230\u5176\u7236\u7bc0\u9ede\uff0c\u5f9e\u800c\u5b8c\u6210\u7bc0\u9ede\u63d2\u5165\u64cd\u4f5c\u3002
    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def insert(self, num: int):\n    \"\"\"\u63d2\u5165\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if self._root is None:\n        self._root = TreeNode(num)\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == nullptr) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid Insert(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = new TreeNode(num);\n        return;\n    }\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nfunc (bst *binarySearchTree) insert(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if cur == nil {\n        bst.root = NewTreeNode(num)\n        return\n    }\n    // \u5f85\u63d2\u5165\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\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\u7bc0\u9ede\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\u7bc0\u9ede */\nfunc insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if root == nil {\n        root = TreeNode(x: num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\ninsert(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (this.root === null) {\n        this.root = new TreeNode(num);\n        return;\n    }\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\ninsert(num: number): void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.val === num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n  if (_root == null) {\n    _root = TreeNode(_num);\n    return;\n  }\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n    if (cur.val == _num) return;\n    pre = cur;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\npub fn insert(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n            Ordering::Equal => return,\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\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\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nvoid insert(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (bst->root == NULL) {\n        bst->root = newTreeNode(num);\n        return;\n    }\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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\u7bc0\u9ede */\nfun insert(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\n    if (root == null) {\n        root = TreeNode(num)\n        return\n    }\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\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\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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
    [class]{BinarySearchTree}-[func]{insert}\n
    binary_search_tree.zig
    // \u63d2\u5165\u7bc0\u9ede\nfn insert(self: *Self, num: T) !void {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u5247\u521d\u59cb\u5316\u6839\u7bc0\u9ede\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u91cd\u8907\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n        if (cur.?.val == num) return;\n        pre = cur;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u63d2\u5165\u4f4d\u7f6e\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u63d2\u5165\u7bc0\u9ede\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
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    \u8207\u67e5\u8a62\u7bc0\u9ede\u76f8\u540c\uff0c\u63d2\u5165\u7bc0\u9ede\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\u3002

    "},{"location":"chapter_tree/binary_search_tree/#3","title":"3. \u00a0 \u522a\u9664\u7bc0\u9ede","text":"

    \u5148\u5728\u4e8c\u5143\u6a39\u4e2d\u67e5\u8a62\u5230\u76ee\u6a19\u7bc0\u9ede\uff0c\u518d\u5c07\u5176\u522a\u9664\u3002\u8207\u63d2\u5165\u7bc0\u9ede\u985e\u4f3c\uff0c\u6211\u5011\u9700\u8981\u4fdd\u8b49\u5728\u522a\u9664\u64cd\u4f5c\u5b8c\u6210\u5f8c\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u201c\u5de6\u5b50\u6a39 < \u6839\u7bc0\u9ede < \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\u4ecd\u7136\u6eff\u8db3\u3002\u56e0\u6b64\uff0c\u6211\u5011\u6839\u64da\u76ee\u6a19\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u6578\u91cf\uff0c\u5206 0\u30011 \u548c 2 \u4e09\u7a2e\u60c5\u6cc1\uff0c\u57f7\u884c\u5c0d\u61c9\u7684\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u3002

    \u5982\u5716 7-19 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \u6642\uff0c\u8868\u793a\u8a72\u7bc0\u9ede\u662f\u8449\u7bc0\u9ede\uff0c\u53ef\u4ee5\u76f4\u63a5\u522a\u9664\u3002

    \u5716 7-19 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 0 \uff09

    \u5982\u5716 7-20 \u6240\u793a\uff0c\u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(1\\) \u6642\uff0c\u5c07\u5f85\u522a\u9664\u7bc0\u9ede\u66ff\u63db\u70ba\u5176\u5b50\u7bc0\u9ede\u5373\u53ef\u3002

    \u5716 7-20 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 1 \uff09

    \u7576\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5ea6\u70ba \\(2\\) \u6642\uff0c\u6211\u5011\u7121\u6cd5\u76f4\u63a5\u522a\u9664\u5b83\uff0c\u800c\u9700\u8981\u4f7f\u7528\u4e00\u500b\u7bc0\u9ede\u66ff\u63db\u8a72\u7bc0\u9ede\u3002\u7531\u65bc\u8981\u4fdd\u6301\u4e8c\u5143\u641c\u5c0b\u6a39\u201c\u5de6\u5b50\u6a39 \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u6a39\u201d\u7684\u6027\u8cea\uff0c\u56e0\u6b64\u9019\u500b\u7bc0\u9ede\u53ef\u4ee5\u662f\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\u6216\u5de6\u5b50\u6a39\u7684\u6700\u5927\u7bc0\u9ede\u3002

    \u5047\u8a2d\u6211\u5011\u9078\u64c7\u53f3\u5b50\u6a39\u7684\u6700\u5c0f\u7bc0\u9ede\uff08\u4e2d\u5e8f\u8d70\u8a2a\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff09\uff0c\u5247\u522a\u9664\u64cd\u4f5c\u6d41\u7a0b\u5982\u5716 7-21 \u6240\u793a\u3002

    1. \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\u5728\u201c\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u201d\u4e2d\u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\uff0c\u8a18\u70ba tmp \u3002
    2. \u7528 tmp \u7684\u503c\u8986\u84cb\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u503c\uff0c\u4e26\u5728\u6a39\u4e2d\u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp \u3002
    <1><2><3><4>

    \u5716 7-21 \u00a0 \u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u522a\u9664\u7bc0\u9ede\uff08\u5ea6\u70ba 2 \uff09

    \u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u540c\u6a23\u4f7f\u7528 \\(O(\\log n)\\) \u6642\u9593\uff0c\u5176\u4e2d\u67e5\u8a62\u5f85\u522a\u9664\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\uff0c\u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u5f8c\u7e7c\u7bc0\u9ede\u9700\u8981 \\(O(\\log n)\\) \u6642\u9593\u3002\u793a\u4f8b\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_search_tree.py
    def remove(self, num: int):\n    \"\"\"\u522a\u9664\u7bc0\u9ede\"\"\"\n    # \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if self._root is None:\n        return\n    # \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    cur, pre = self._root, None\n    while cur is not None:\n        # \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur.val == num:\n            break\n        pre = cur\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur.val < num:\n            cur = cur.right\n        # \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else:\n            cur = cur.left\n    # \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur is None:\n        return\n\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur.left is None or cur.right is None:\n        # \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        child = cur.left or cur.right\n        # \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            self._root = child\n    # \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else:\n        # \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp: TreeNode = cur.right\n        while tmp.left is not None:\n            tmp = tmp.left\n        # \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.val)\n        # \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val\n
    binary_search_tree.cpp
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == nullptr)\n        return;\n    TreeNode *cur = root, *pre = nullptr;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != nullptr) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur->val < num)\n            cur = cur->right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur->left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == nullptr)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur->left == nullptr || cur->right == nullptr) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != nullptr ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre->left == cur)\n                pre->left = child;\n            else\n                pre->right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        delete cur;\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != nullptr) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.java
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode child = cur.left != null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.cs
    /* \u522a\u9664\u7bc0\u9ede */\nvoid Remove(int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return;\n    TreeNode? cur = root, pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val == num)\n            break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num)\n            cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode? child = cur.left ?? cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!.left == cur)\n                pre.left = child;\n            else\n                pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode? tmp = cur.right;\n        while (tmp.left != null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        Remove(tmp.val!.Value);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.go
    /* \u522a\u9664\u7bc0\u9ede */\nfunc (bst *binarySearchTree) remove(num int) {\n    cur := bst.root\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u4e4b\u524d\u7684\u7bc0\u9ede\u4f4d\u7f6e\n    var pre *TreeNode = nil\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\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\u522a\u9664\u7bc0\u9ede\u5728\u53f3\u5b50\u6a39\u4e2d\n            cur = cur.Right\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728\u5de6\u5b50\u6a39\u4e2d\n            cur = cur.Left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u70ba 0 \u6216 1\n    if cur.Left == nil || cur.Right == nil {\n        var child *TreeNode = nil\n        // \u53d6\u51fa\u5f85\u522a\u9664\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\n        if cur.Left != nil {\n            child = cur.Left\n        } else {\n            child = cur.Right\n        }\n        // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            bst.root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u70ba 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d\u5f85\u522a\u9664\u7bc0\u9ede cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        tmp := cur.Right\n        for tmp.Left != nil {\n            tmp = tmp.Left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        bst.remove(tmp.Val.(int))\n        // \u7528 tmp \u8986\u84cb cur\n        cur.Val = tmp.Val\n    }\n}\n
    binary_search_tree.swift
    /* \u522a\u9664\u7bc0\u9ede */\nfunc remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if root == nil {\n        return\n    }\n    var cur = root\n    var pre: TreeNode?\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while cur != nil {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if cur!.val == num {\n            break\n        }\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if cur!.val < num {\n            cur = cur?.right\n        }\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else {\n            cur = cur?.left\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if cur == nil {\n        return\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if cur?.left == nil || cur?.right == nil {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        let child = cur?.left ?? cur?.right\n        // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur?.right\n        while tmp?.left != nil {\n            tmp = tmp?.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(num: tmp!.val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur?.val = tmp!.val\n    }\n}\n
    binary_search_tree.js
    /* \u522a\u9664\u7bc0\u9ede */\nremove(num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (this.root === null) return;\n    let cur = this.root,\n        pre = null;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child = cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre.left === cur) pre.left = child;\n            else pre.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp = cur.right;\n        while (tmp.left !== null) {\n            tmp = tmp.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp.val;\n    }\n}\n
    binary_search_tree.ts
    /* \u522a\u9664\u7bc0\u9ede */\nremove(num: number): void {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur !== null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.val === num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.val < num) cur = cur.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else cur = cur.left;\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur === null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left === null || cur.right === null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        const child: TreeNode | null =\n            cur.left !== null ? cur.left : cur.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur !== this.root) {\n            if (pre!.left === cur) pre!.left = child;\n            else pre!.right = child;\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            this.root = child;\n        }\n    }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        let tmp: TreeNode | null = cur.right;\n        while (tmp!.left !== null) {\n            tmp = tmp!.left;\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        this.remove(tmp!.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.val = tmp!.val;\n    }\n}\n
    binary_search_tree.dart
    /* \u522a\u9664\u7bc0\u9ede */\nvoid remove(int _num) {\n  // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n  if (_root == null) return;\n  TreeNode? cur = _root;\n  TreeNode? pre = null;\n  // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n  while (cur != null) {\n    // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n    if (cur.val == _num) break;\n    pre = cur;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n    if (cur.val < _num)\n      cur = cur.right;\n    // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n    else\n      cur = cur.left;\n  }\n  // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u76f4\u63a5\u8fd4\u56de\n  if (cur == null) return;\n  // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n  if (cur.left == null || cur.right == null) {\n    // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n    TreeNode? child = cur.left ?? cur.right;\n    // \u522a\u9664\u7bc0\u9ede cur\n    if (cur != _root) {\n      if (pre!.left == cur)\n        pre.left = child;\n      else\n        pre.right = child;\n    } else {\n      // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n      _root = child;\n    }\n  } else {\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n    TreeNode? tmp = cur.right;\n    while (tmp!.left != null) {\n      tmp = tmp.left;\n    }\n    // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n    remove(tmp.val);\n    // \u7528 tmp \u8986\u84cb cur\n    cur.val = tmp.val;\n  }\n}\n
    binary_search_tree.rs
    /* \u522a\u9664\u7bc0\u9ede */\npub fn remove(&mut self, num: i32) {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while let Some(node) = cur.clone() {\n        match num.cmp(&node.borrow().val) {\n            // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n            Ordering::Equal => break,\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n            Ordering::Greater => {\n                pre = cur.clone();\n                cur = node.borrow().right.clone();\n            }\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n            Ordering::Less => {\n                pre = cur.clone();\n                cur = node.borrow().left.clone();\n            }\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\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\u7bc0\u9ede\u6578\u91cf = 0 or 1\n        (None, None) | (Some(_), None) | (None, Some(_)) => {\n            // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n            let child = left_child.or(right_child);\n            let pre = pre.unwrap();\n            // \u522a\u9664\u7bc0\u9ede 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\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n                self.root = child;\n            }\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n        (Some(_), Some(_)) => {\n            // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\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            // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n            self.remove(tmpval);\n            // \u7528 tmp \u8986\u84cb cur\n            cur.borrow_mut().val = tmpval;\n        }\n    }\n}\n
    binary_search_tree.c
    /* \u522a\u9664\u7bc0\u9ede */\n// \u7531\u65bc\u5f15\u5165\u4e86 stdio.h \uff0c\u6b64\u8655\u7121\u6cd5\u4f7f\u7528 remove \u95dc\u9375\u8a5e\nvoid removeItem(BinarySearchTree *bst, int num) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (bst->root == NULL)\n        return;\n    TreeNode *cur = bst->root, *pre = NULL;\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != NULL) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur->val == num)\n            break;\n        pre = cur;\n        if (cur->val < num) {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u53f3\u5b50\u6a39\u4e2d\n            cur = cur->right;\n        } else {\n            // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 root \u7684\u5de6\u5b50\u6a39\u4e2d\n            cur = cur->left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == NULL)\n        return;\n    // \u5224\u65b7\u5f85\u522a\u9664\u7bc0\u9ede\u662f\u5426\u5b58\u5728\u5b50\u7bc0\u9ede\n    if (cur->left == NULL || cur->right == NULL) {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1 */\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = nullptr / \u8a72\u5b50\u7bc0\u9ede\n        TreeNode *child = cur->left != NULL ? cur->left : cur->right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre->left == cur) {\n            pre->left = child;\n        } else {\n            pre->right = child;\n        }\n        // \u91cb\u653e\u8a18\u61b6\u9ad4\n        free(cur);\n    } else {\n        /* \u5b50\u7bc0\u9ede\u6578\u91cf = 2 */\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        TreeNode *tmp = cur->right;\n        while (tmp->left != NULL) {\n            tmp = tmp->left;\n        }\n        int tmpVal = tmp->val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        removeItem(bst, tmp->val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur->val = tmpVal;\n    }\n}\n
    binary_search_tree.kt
    /* \u522a\u9664\u7bc0\u9ede */\nfun remove(num: Int) {\n    // \u82e5\u6a39\u70ba\u7a7a\uff0c\u76f4\u63a5\u63d0\u524d\u8fd4\u56de\n    if (root == null)\n        return\n    var cur = root\n    var pre: TreeNode? = null\n    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur._val == num)\n            break\n        pre = cur\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        cur = if (cur._val < num)\n            cur.right\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        else\n            cur.left\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null)\n        return\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.left == null || cur.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        val child = if (cur.left != null)\n            cur.left\n        else\n            cur.right\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (cur != root) {\n            if (pre!!.left == cur)\n                pre.left = child\n            else\n                pre.right = child\n        } else {\n            // \u82e5\u522a\u9664\u7bc0\u9ede\u70ba\u6839\u7bc0\u9ede\uff0c\u5247\u91cd\u65b0\u6307\u5b9a\u6839\u7bc0\u9ede\n            root = child\n        }\n        // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.right\n        while (tmp!!.left != null) {\n            tmp = tmp.left\n        }\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        remove(tmp._val)\n        // \u7528 tmp \u8986\u84cb cur\n        cur._val = tmp._val\n    }\n}\n
    binary_search_tree.rb
    [class]{BinarySearchTree}-[func]{remove}\n
    binary_search_tree.zig
    // \u522a\u9664\u7bc0\u9ede\nfn remove(self: *Self, num: T) void {\n    // \u82e5\u6a39\u70ba\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    // \u8ff4\u5708\u67e5\u8a62\uff0c\u8d8a\u904e\u8449\u7bc0\u9ede\u5f8c\u8df3\u51fa\n    while (cur != null) {\n        // \u627e\u5230\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u8df3\u51fa\u8ff4\u5708\n        if (cur.?.val == num) break;\n        pre = cur;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u53f3\u5b50\u6a39\u4e2d\n        if (cur.?.val < num) {\n            cur = cur.?.right;\n        // \u5f85\u522a\u9664\u7bc0\u9ede\u5728 cur \u7684\u5de6\u5b50\u6a39\u4e2d\n        } else {\n            cur = cur.?.left;\n        }\n    }\n    // \u82e5\u7121\u5f85\u522a\u9664\u7bc0\u9ede\uff0c\u5247\u76f4\u63a5\u8fd4\u56de\n    if (cur == null) return;\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 0 or 1\n    if (cur.?.left == null or cur.?.right == null) {\n        // \u7576\u5b50\u7bc0\u9ede\u6578\u91cf = 0 / 1 \u6642\uff0c child = null / \u8a72\u5b50\u7bc0\u9ede\n        var child = if (cur.?.left != null) cur.?.left else cur.?.right;\n        // \u522a\u9664\u7bc0\u9ede cur\n        if (pre.?.left == cur) {\n            pre.?.left = child;\n        } else {\n            pre.?.right = child;\n        }\n    // \u5b50\u7bc0\u9ede\u6578\u91cf = 2\n    } else {\n        // \u7372\u53d6\u4e2d\u5e8f\u8d70\u8a2a\u4e2d cur \u7684\u4e0b\u4e00\u500b\u7bc0\u9ede\n        var tmp = cur.?.right;\n        while (tmp.?.left != null) {\n            tmp = tmp.?.left;\n        }\n        var tmp_val = tmp.?.val;\n        // \u905e\u8ff4\u522a\u9664\u7bc0\u9ede tmp\n        self.remove(tmp.?.val);\n        // \u7528 tmp \u8986\u84cb cur\n        cur.?.val = tmp_val;\n    }\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_search_tree/#4","title":"4. \u00a0 \u4e2d\u5e8f\u8d70\u8a2a\u6709\u5e8f","text":"

    \u5982\u5716 7-22 \u6240\u793a\uff0c\u4e8c\u5143\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u9075\u5faa\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u8d70\u8a2a\u9806\u5e8f\uff0c\u800c\u4e8c\u5143\u641c\u5c0b\u6a39\u6eff\u8db3\u201c\u5de6\u5b50\u7bc0\u9ede \\(<\\) \u6839\u7bc0\u9ede \\(<\\) \u53f3\u5b50\u7bc0\u9ede\u201d\u7684\u5927\u5c0f\u95dc\u4fc2\u3002

    \u9019\u610f\u5473\u8457\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u9032\u884c\u4e2d\u5e8f\u8d70\u8a2a\u6642\uff0c\u7e3d\u662f\u6703\u512a\u5148\u8d70\u8a2a\u4e0b\u4e00\u500b\u6700\u5c0f\u7bc0\u9ede\uff0c\u5f9e\u800c\u5f97\u51fa\u4e00\u500b\u91cd\u8981\u6027\u8cea\uff1a\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217\u662f\u5347\u5e8f\u7684\u3002

    \u5229\u7528\u4e2d\u5e8f\u8d70\u8a2a\u5347\u5e8f\u7684\u6027\u8cea\uff0c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u7372\u53d6\u6709\u5e8f\u8cc7\u6599\u50c5\u9700 \\(O(n)\\) \u6642\u9593\uff0c\u7121\u9808\u9032\u884c\u984d\u5916\u7684\u6392\u5e8f\u64cd\u4f5c\uff0c\u975e\u5e38\u9ad8\u6548\u3002

    \u5716 7-22 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u4e2d\u5e8f\u8d70\u8a2a\u5e8f\u5217

    "},{"location":"chapter_tree/binary_search_tree/#742","title":"7.4.2 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387","text":"

    \u7d66\u5b9a\u4e00\u7d44\u8cc7\u6599\uff0c\u6211\u5011\u8003\u616e\u4f7f\u7528\u9663\u5217\u6216\u4e8c\u5143\u641c\u5c0b\u6a39\u5132\u5b58\u3002\u89c0\u5bdf\u8868 7-2 \uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u5404\u9805\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u90fd\u662f\u5c0d\u6578\u968e\uff0c\u5177\u6709\u7a69\u5b9a\u4e14\u9ad8\u6548\u7684\u6548\u80fd\u3002\u53ea\u6709\u5728\u9ad8\u983b\u65b0\u589e\u3001\u4f4e\u983b\u67e5\u8a62\u522a\u9664\u8cc7\u6599\u7684\u5834\u666f\u4e0b\uff0c\u9663\u5217\u6bd4\u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u6548\u7387\u66f4\u9ad8\u3002

    \u8868 7-2 \u00a0 \u9663\u5217\u8207\u641c\u5c0b\u6a39\u7684\u6548\u7387\u5c0d\u6bd4

    \u7121\u5e8f\u9663\u5217 \u4e8c\u5143\u641c\u5c0b\u6a39 \u67e5\u8a62\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\) \u63d2\u5165\u5143\u7d20 \\(O(1)\\) \\(O(\\log n)\\) \u522a\u9664\u5143\u7d20 \\(O(n)\\) \\(O(\\log n)\\)

    \u5728\u7406\u60f3\u60c5\u6cc1\u4e0b\uff0c\u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u201c\u5e73\u8861\u201d\u7684\uff0c\u9019\u6a23\u5c31\u53ef\u4ee5\u5728 \\(\\log n\\) \u8f2a\u8ff4\u5708\u5167\u67e5\u8a62\u4efb\u610f\u7bc0\u9ede\u3002

    \u7136\u800c\uff0c\u5982\u679c\u6211\u5011\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\u4e0d\u65b7\u5730\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\uff0c\u53ef\u80fd\u5c0e\u81f4\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u5716 7-23 \u6240\u793a\u7684\u93c8\u7d50\u4e32\u5217\uff0c\u9019\u6642\u5404\u7a2e\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u4e5f\u6703\u9000\u5316\u70ba \\(O(n)\\) \u3002

    \u5716 7-23 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316

    "},{"location":"chapter_tree/binary_search_tree/#743","title":"7.4.3 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u5e38\u898b\u61c9\u7528","text":"
    • \u7528\u4f5c\u7cfb\u7d71\u4e2d\u7684\u591a\u7d1a\u7d22\u5f15\uff0c\u5be6\u73fe\u9ad8\u6548\u7684\u67e5\u8a62\u3001\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u3002
    • \u4f5c\u70ba\u67d0\u4e9b\u641c\u5c0b\u6f14\u7b97\u6cd5\u7684\u5e95\u5c64\u8cc7\u6599\u7d50\u69cb\u3002
    • \u7528\u65bc\u5132\u5b58\u8cc7\u6599\u6d41\uff0c\u4ee5\u4fdd\u6301\u5176\u6709\u5e8f\u72c0\u614b\u3002
    "},{"location":"chapter_tree/binary_tree/","title":"7.1 \u00a0 \u4e8c\u5143\u6a39","text":"

    \u4e8c\u5143\u6a39\uff08binary tree\uff09\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u4ee3\u8868\u201c\u7956\u5148\u201d\u8207\u201c\u5f8c\u4ee3\u201d\u4e4b\u9593\u7684\u6d3e\u751f\u95dc\u4fc2\uff0c\u9ad4\u73fe\u4e86\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u4e8c\u5143\u6a39\u7684\u57fa\u672c\u55ae\u5143\u662f\u7bc0\u9ede\uff0c\u6bcf\u500b\u7bc0\u9ede\u5305\u542b\u503c\u3001\u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\u548c\u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig
    class TreeNode:\n    \"\"\"\u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225\"\"\"\n    def __init__(self, val: int):\n        self.val: int = val                # \u7bc0\u9ede\u503c\n        self.left: TreeNode | None = None  # \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        self.right: TreeNode | None = None # \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    int val;          // \u7bc0\u9ede\u503c\n    TreeNode *left;   // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode *right;  // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}\n};\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    int val;         // \u7bc0\u9ede\u503c\n    TreeNode left;   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode right;  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    TreeNode(int x) { val = x; }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(int? x) {\n    public int? val = x;    // \u7bc0\u9ede\u503c\n    public TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    public TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntype TreeNode struct {\n    Val   int\n    Left  *TreeNode\n    Right *TreeNode\n}\n/* \u5efa\u69cb\u5b50 */\nfunc NewTreeNode(v int) *TreeNode {\n    return &TreeNode{\n        Left:  nil, // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n        Right: nil, // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n        Val:   v,   // \u7bc0\u9ede\u503c\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    var val: Int // \u7bc0\u9ede\u503c\n    var left: TreeNode? // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    var right: TreeNode? // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n\n    init(x: Int) {\n        val = x\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n    val; // \u7bc0\u9ede\u503c\n    left; // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\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\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\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; // \u7bc0\u9ede\u503c\n        this.left = left === undefined ? null : left; // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n        this.right = right === undefined ? null : right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n    }\n}\n
    /* \u4e8c\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode {\n  int val;         // \u7bc0\u9ede\u503c\n  TreeNode? left;  // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode? right; // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n  TreeNode(this.val, [this.left, this.right]);\n}\n
    use std::rc::Rc;\nuse std::cell::RefCell;\n\n/* \u4e8c\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\nstruct TreeNode {\n    val: i32,                               // \u7bc0\u9ede\u503c\n    left: Option<Rc<RefCell<TreeNode>>>,    // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    right: Option<Rc<RefCell<TreeNode>>>,   // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n\nimpl TreeNode {\n    /* \u5efa\u69cb\u5b50 */\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\u5143\u6a39\u7bc0\u9ede\u7d50\u69cb\u9ad4 */\ntypedef struct TreeNode {\n    int val;                // \u7bc0\u9ede\u503c\n    int height;             // \u7bc0\u9ede\u9ad8\u5ea6\n    struct TreeNode *left;  // \u5de6\u5b50\u7bc0\u9ede\u6307\u6a19\n    struct TreeNode *right; // \u53f3\u5b50\u7bc0\u9ede\u6307\u6a19\n} TreeNode;\n\n/* \u5efa\u69cb\u5b50 */\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\u5143\u6a39\u7bc0\u9ede\u985e\u5225 */\nclass TreeNode(val _val: Int) {  // \u7bc0\u9ede\u503c\n    val left: TreeNode? = null   // \u5de6\u5b50\u7bc0\u9ede\u5f15\u7528\n    val right: TreeNode? = null  // \u53f3\u5b50\u7bc0\u9ede\u5f15\u7528\n}\n
    \n
    \n

    \u6bcf\u500b\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5f15\u7528\uff08\u6307\u6a19\uff09\uff0c\u5206\u5225\u6307\u5411\u5de6\u5b50\u7bc0\u9ede\uff08left-child node\uff09\u548c\u53f3\u5b50\u7bc0\u9ede\uff08right-child node\uff09\uff0c\u8a72\u7bc0\u9ede\u88ab\u7a31\u70ba\u9019\u5169\u500b\u5b50\u7bc0\u9ede\u7684\u7236\u7bc0\u9ede\uff08parent node\uff09\u3002\u7576\u7d66\u5b9a\u4e00\u500b\u4e8c\u5143\u6a39\u7684\u7bc0\u9ede\u6642\uff0c\u6211\u5011\u5c07\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\uff08left subtree\uff09\uff0c\u540c\u7406\u53ef\u5f97\u53f3\u5b50\u6a39\uff08right subtree\uff09\u3002

    \u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u9664\u8449\u7bc0\u9ede\u5916\uff0c\u5176\u4ed6\u6240\u6709\u7bc0\u9ede\u90fd\u5305\u542b\u5b50\u7bc0\u9ede\u548c\u975e\u7a7a\u5b50\u6a39\u3002\u5982\u5716 7-1 \u6240\u793a\uff0c\u5982\u679c\u5c07\u201c\u7bc0\u9ede 2\u201d\u8996\u70ba\u7236\u7bc0\u9ede\uff0c\u5247\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u5206\u5225\u662f\u201c\u7bc0\u9ede 4\u201d\u548c\u201c\u7bc0\u9ede 5\u201d\uff0c\u5de6\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 4 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\uff0c\u53f3\u5b50\u6a39\u662f\u201c\u7bc0\u9ede 5 \u53ca\u5176\u4ee5\u4e0b\u7bc0\u9ede\u5f62\u6210\u7684\u6a39\u201d\u3002

    \u5716 7-1 \u00a0 \u7236\u7bc0\u9ede\u3001\u5b50\u7bc0\u9ede\u3001\u5b50\u6a39

    "},{"location":"chapter_tree/binary_tree/#711","title":"7.1.1 \u00a0 \u4e8c\u5143\u6a39\u5e38\u898b\u8853\u8a9e","text":"

    \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e\u5982\u5716 7-2 \u6240\u793a\u3002

    • \u6839\u7bc0\u9ede\uff08root node\uff09\uff1a\u4f4d\u65bc\u4e8c\u5143\u6a39\u9802\u5c64\u7684\u7bc0\u9ede\uff0c\u6c92\u6709\u7236\u7bc0\u9ede\u3002
    • \u8449\u7bc0\u9ede\uff08leaf node\uff09\uff1a\u6c92\u6709\u5b50\u7bc0\u9ede\u7684\u7bc0\u9ede\uff0c\u5176\u5169\u500b\u6307\u6a19\u5747\u6307\u5411 None \u3002
    • \u908a\uff08edge\uff09\uff1a\u9023\u7dda\u5169\u500b\u7bc0\u9ede\u7684\u7dda\u6bb5\uff0c\u5373\u7bc0\u9ede\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002
    • \u7bc0\u9ede\u6240\u5728\u7684\u5c64\uff08level\uff09\uff1a\u5f9e\u9802\u81f3\u5e95\u905e\u589e\uff0c\u6839\u7bc0\u9ede\u6240\u5728\u5c64\u70ba 1 \u3002
    • \u7bc0\u9ede\u7684\u5ea6\uff08degree\uff09\uff1a\u7bc0\u9ede\u7684\u5b50\u7bc0\u9ede\u7684\u6578\u91cf\u3002\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u5ea6\u7684\u53d6\u503c\u7bc4\u570d\u662f 0\u30011\u30012 \u3002
    • \u4e8c\u5143\u6a39\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u6700\u9060\u8449\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
    • \u7bc0\u9ede\u7684\u6df1\u5ea6\uff08depth\uff09\uff1a\u5f9e\u6839\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002
    • \u7bc0\u9ede\u7684\u9ad8\u5ea6\uff08height\uff09\uff1a\u5f9e\u8ddd\u96e2\u8a72\u7bc0\u9ede\u6700\u9060\u7684\u8449\u7bc0\u9ede\u5230\u8a72\u7bc0\u9ede\u6240\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u3002

    \u5716 7-2 \u00a0 \u4e8c\u5143\u6a39\u7684\u5e38\u7528\u8853\u8a9e

    Tip

    \u8acb\u6ce8\u610f\uff0c\u6211\u5011\u901a\u5e38\u5c07\u201c\u9ad8\u5ea6\u201d\u548c\u201c\u6df1\u5ea6\u201d\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\uff0c\u4f46\u6709\u4e9b\u984c\u76ee\u6216\u6559\u6750\u53ef\u80fd\u6703\u5c07\u5176\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u7bc0\u9ede\u7684\u6578\u91cf\u201d\u3002\u5728\u9019\u7a2e\u60c5\u6cc1\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\u5143\u6a39\u57fa\u672c\u64cd\u4f5c","text":""},{"location":"chapter_tree/binary_tree/#1","title":"1. \u00a0 \u521d\u59cb\u5316\u4e8c\u5143\u6a39","text":"

    \u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u9996\u5148\u521d\u59cb\u5316\u7bc0\u9ede\uff0c\u7136\u5f8c\u69cb\u5efa\u5f15\u7528\uff08\u6307\u6a19\uff09\u3002

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u521d\u59cb\u5316\u4e8c\u5143\u6a39\n# \u521d\u59cb\u5316\u7bc0\u9ede\nn1 = TreeNode(val=1)\nn2 = TreeNode(val=2)\nn3 = TreeNode(val=3)\nn4 = TreeNode(val=4)\nn5 = TreeNode(val=5)\n# \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.cpp
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.java
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.cs
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode n1 = new(1);\nTreeNode n2 = new(2);\nTreeNode n3 = new(3);\nTreeNode n4 = new(4);\nTreeNode n5 = new(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.go
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nn1 := NewTreeNode(1)\nn2 := NewTreeNode(2)\nn3 := NewTreeNode(3)\nn4 := NewTreeNode(4)\nn5 := NewTreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.Left = n2\nn1.Right = n3\nn2.Left = n4\nn2.Right = n5\n
    binary_tree.swift
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.js
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.ts
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.dart
    /* \u521d\u59cb\u5316\u4e8c\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2;\nn1.right = n3;\nn2.left = n4;\nn2.right = n5;\n
    binary_tree.rs
    // \u521d\u59cb\u5316\u7bc0\u9ede\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// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\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\u5143\u6a39 */\n// \u521d\u59cb\u5316\u7bc0\u9ede\nTreeNode *n1 = newTreeNode(1);\nTreeNode *n2 = newTreeNode(2);\nTreeNode *n3 = newTreeNode(3);\nTreeNode *n4 = newTreeNode(4);\nTreeNode *n5 = newTreeNode(5);\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1->left = n2;\nn1->right = n3;\nn2->left = n4;\nn2->right = n5;\n
    binary_tree.kt
    // \u521d\u59cb\u5316\u7bc0\u9ede\nval n1 = TreeNode(1)\nval n2 = TreeNode(2)\nval n3 = TreeNode(3)\nval n4 = TreeNode(4)\nval n5 = TreeNode(5)\n// \u69cb\u5efa\u7bc0\u9ede\u4e4b\u9593\u7684\u5f15\u7528\uff08\u6307\u6a19\uff09\nn1.left = n2\nn1.right = n3\nn2.left = n4\nn2.right = n5\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_tree/#2","title":"2. \u00a0 \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede","text":"

    \u8207\u93c8\u7d50\u4e32\u5217\u985e\u4f3c\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\u53ef\u4ee5\u900f\u904e\u4fee\u6539\u6307\u6a19\u4f86\u5be6\u73fe\u3002\u5716 7-3 \u7d66\u51fa\u4e86\u4e00\u500b\u793a\u4f8b\u3002

    \u5716 7-3 \u00a0 \u5728\u4e8c\u5143\u6a39\u4e2d\u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree.py
    # \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede\np = TreeNode(0)\n# \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = p\np.left = n2\n# \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.cpp
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode* P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
    binary_tree.java
    TreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.cs
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.go
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\np := NewTreeNode(0)\nn1.Left = p\np.Left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.Left = n2\n
    binary_tree.swift
    let P = TreeNode(x: 0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.js
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nlet P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.ts
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nconst P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.dart
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode P = new TreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P;\nP.left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2;\n
    binary_tree.rs
    let p = TreeNode::new(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.borrow_mut().left = Some(p.clone());\np.borrow_mut().left = Some(n2.clone());\n// \u522a\u9664\u7bc0\u9ede p\nn1.borrow_mut().left = Some(n2);\n
    binary_tree.c
    /* \u63d2\u5165\u8207\u522a\u9664\u7bc0\u9ede */\nTreeNode *P = newTreeNode(0);\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1->left = P;\nP->left = n2;\n// \u522a\u9664\u7bc0\u9ede P\nn1->left = n2;\n
    binary_tree.kt
    val P = TreeNode(0)\n// \u5728 n1 -> n2 \u4e2d\u9593\u63d2\u5165\u7bc0\u9ede P\nn1.left = P\nP.left = n2\n// \u522a\u9664\u7bc0\u9ede P\nn1.left = n2\n
    binary_tree.rb
    \n
    binary_tree.zig
    \n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Note

    \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u63d2\u5165\u7bc0\u9ede\u53ef\u80fd\u6703\u6539\u8b8a\u4e8c\u5143\u6a39\u7684\u539f\u6709\u908f\u8f2f\u7d50\u69cb\uff0c\u800c\u522a\u9664\u7bc0\u9ede\u901a\u5e38\u610f\u5473\u8457\u522a\u9664\u8a72\u7bc0\u9ede\u53ca\u5176\u6240\u6709\u5b50\u6a39\u3002\u56e0\u6b64\uff0c\u5728\u4e8c\u5143\u6a39\u4e2d\uff0c\u63d2\u5165\u8207\u522a\u9664\u901a\u5e38\u662f\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\u7684\uff0c\u4ee5\u5be6\u73fe\u6709\u5be6\u969b\u610f\u7fa9\u7684\u64cd\u4f5c\u3002

    "},{"location":"chapter_tree/binary_tree/#713","title":"7.1.3 \u00a0 \u5e38\u898b\u4e8c\u5143\u6a39\u578b\u5225","text":""},{"location":"chapter_tree/binary_tree/#1_1","title":"1. \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-4 \u6240\u793a\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\uff08perfect binary tree\uff09\u6240\u6709\u5c64\u7684\u7bc0\u9ede\u90fd\u88ab\u5b8c\u5168\u586b\u6eff\u3002\u5728\u5b8c\u7f8e\u4e8c\u5143\u6a39\u4e2d\uff0c\u8449\u7bc0\u9ede\u7684\u5ea6\u70ba \\(0\\) \uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u7684\u5ea6\u90fd\u70ba \\(2\\) \uff1b\u82e5\u6a39\u7684\u9ad8\u5ea6\u70ba \\(h\\) \uff0c\u5247\u7bc0\u9ede\u7e3d\u6578\u70ba \\(2^{h+1} - 1\\) \uff0c\u5448\u73fe\u6a19\u6e96\u7684\u6307\u6578\u7d1a\u95dc\u4fc2\uff0c\u53cd\u6620\u4e86\u81ea\u7136\u754c\u4e2d\u5e38\u898b\u7684\u7d30\u80de\u5206\u88c2\u73fe\u8c61\u3002

    Tip

    \u8acb\u6ce8\u610f\uff0c\u5728\u4e2d\u6587\u793e\u7fa4\u4e2d\uff0c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u5e38\u88ab\u7a31\u70ba\u6eff\u4e8c\u5143\u6a39\u3002

    \u5716 7-4 \u00a0 \u5b8c\u7f8e\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#2_1","title":"2. \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-5 \u6240\u793a\uff0c\u5b8c\u5168\u4e8c\u5143\u6a39\uff08complete binary tree\uff09\u53ea\u6709\u6700\u5e95\u5c64\u7684\u7bc0\u9ede\u672a\u88ab\u586b\u6eff\uff0c\u4e14\u6700\u5e95\u5c64\u7bc0\u9ede\u5118\u91cf\u9760\u5de6\u586b\u5145\u3002

    \u5716 7-5 \u00a0 \u5b8c\u5168\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#3","title":"3. \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-6 \u6240\u793a\uff0c\u5b8c\u6eff\u4e8c\u5143\u6a39\uff08full binary tree\uff09\u9664\u4e86\u8449\u7bc0\u9ede\u4e4b\u5916\uff0c\u5176\u9918\u6240\u6709\u7bc0\u9ede\u90fd\u6709\u5169\u500b\u5b50\u7bc0\u9ede\u3002

    \u5716 7-6 \u00a0 \u5b8c\u6eff\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#4","title":"4. \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39","text":"

    \u5982\u5716 7-7 \u6240\u793a\uff0c\u5e73\u8861\u4e8c\u5143\u6a39\uff08balanced binary tree\uff09\u4e2d\u4efb\u610f\u7bc0\u9ede\u7684\u5de6\u5b50\u6a39\u548c\u53f3\u5b50\u6a39\u7684\u9ad8\u5ea6\u4e4b\u5dee\u7684\u7d55\u5c0d\u503c\u4e0d\u8d85\u904e 1 \u3002

    \u5716 7-7 \u00a0 \u5e73\u8861\u4e8c\u5143\u6a39

    "},{"location":"chapter_tree/binary_tree/#714","title":"7.1.4 \u00a0 \u4e8c\u5143\u6a39\u7684\u9000\u5316","text":"

    \u5716 7-8 \u5c55\u793a\u4e86\u4e8c\u5143\u6a39\u7684\u7406\u60f3\u7d50\u69cb\u8207\u9000\u5316\u7d50\u69cb\u3002\u7576\u4e8c\u5143\u6a39\u7684\u6bcf\u5c64\u7bc0\u9ede\u90fd\u88ab\u586b\u6eff\u6642\uff0c\u9054\u5230\u201c\u5b8c\u7f8e\u4e8c\u5143\u6a39\u201d\uff1b\u800c\u7576\u6240\u6709\u7bc0\u9ede\u90fd\u504f\u5411\u4e00\u5074\u6642\uff0c\u4e8c\u5143\u6a39\u9000\u5316\u70ba\u201c\u93c8\u7d50\u4e32\u5217\u201d\u3002

    • \u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u7406\u60f3\u60c5\u6cc1\uff0c\u53ef\u4ee5\u5145\u5206\u767c\u63ee\u4e8c\u5143\u6a39\u201c\u5206\u6cbb\u201d\u7684\u512a\u52e2\u3002
    • \u93c8\u7d50\u4e32\u5217\u5247\u662f\u53e6\u4e00\u500b\u6975\u7aef\uff0c\u5404\u9805\u64cd\u4f5c\u90fd\u8b8a\u70ba\u7dda\u6027\u64cd\u4f5c\uff0c\u6642\u9593\u8907\u96dc\u5ea6\u9000\u5316\u81f3 \\(O(n)\\) \u3002

    \u5716 7-8 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

    \u5982\u8868 7-1 \u6240\u793a\uff0c\u5728\u6700\u4f73\u7d50\u69cb\u548c\u6700\u5dee\u7d50\u69cb\u4e0b\uff0c\u4e8c\u5143\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf\u3001\u7bc0\u9ede\u7e3d\u6578\u3001\u9ad8\u5ea6\u7b49\u9054\u5230\u6975\u5927\u503c\u6216\u6975\u5c0f\u503c\u3002

    \u8868 7-1 \u00a0 \u4e8c\u5143\u6a39\u7684\u6700\u4f73\u7d50\u69cb\u8207\u6700\u5dee\u7d50\u69cb

    \u5b8c\u7f8e\u4e8c\u5143\u6a39 \u93c8\u7d50\u4e32\u5217 \u7b2c \\(i\\) \u5c64\u7684\u7bc0\u9ede\u6578\u91cf \\(2^{i-1}\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u8449\u7bc0\u9ede\u6578\u91cf \\(2^h\\) \\(1\\) \u9ad8\u5ea6\u70ba \\(h\\) \u7684\u6a39\u7684\u7bc0\u9ede\u7e3d\u6578 \\(2^{h+1} - 1\\) \\(h + 1\\) \u7bc0\u9ede\u7e3d\u6578\u70ba \\(n\\) \u7684\u6a39\u7684\u9ad8\u5ea6 \\(\\log_2 (n+1) - 1\\) \\(n - 1\\)"},{"location":"chapter_tree/binary_tree_traversal/","title":"7.2 \u00a0 \u4e8c\u5143\u6a39\u8d70\u8a2a","text":"

    \u5f9e\u7269\u7406\u7d50\u69cb\u7684\u89d2\u5ea6\u4f86\u770b\uff0c\u6a39\u662f\u4e00\u7a2e\u57fa\u65bc\u93c8\u7d50\u4e32\u5217\u7684\u8cc7\u6599\u7d50\u69cb\uff0c\u56e0\u6b64\u5176\u8d70\u8a2a\u65b9\u5f0f\u662f\u900f\u904e\u6307\u6a19\u9010\u500b\u8a2a\u554f\u7bc0\u9ede\u3002\u7136\u800c\uff0c\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9019\u4f7f\u5f97\u8d70\u8a2a\u6a39\u6bd4\u8d70\u8a2a\u93c8\u7d50\u4e32\u5217\u66f4\u52a0\u8907\u96dc\uff0c\u9700\u8981\u85c9\u52a9\u641c\u5c0b\u6f14\u7b97\u6cd5\u4f86\u5be6\u73fe\u3002

    \u4e8c\u5143\u6a39\u5e38\u898b\u7684\u8d70\u8a2a\u65b9\u5f0f\u5305\u62ec\u5c64\u5e8f\u8d70\u8a2a\u3001\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u7b49\u3002

    "},{"location":"chapter_tree/binary_tree_traversal/#721","title":"7.2.1 \u00a0 \u5c64\u5e8f\u8d70\u8a2a","text":"

    \u5982\u5716 7-9 \u6240\u793a\uff0c\u5c64\u5e8f\u8d70\u8a2a\uff08level-order traversal\uff09\u5f9e\u9802\u90e8\u5230\u5e95\u90e8\u9010\u5c64\u8d70\u8a2a\u4e8c\u5143\u6a39\uff0c\u4e26\u5728\u6bcf\u4e00\u5c64\u6309\u7167\u5f9e\u5de6\u5230\u53f3\u7684\u9806\u5e8f\u8a2a\u554f\u7bc0\u9ede\u3002

    \u5c64\u5e8f\u8d70\u8a2a\u672c\u8cea\u4e0a\u5c6c\u65bc\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\uff08breadth-first traversal\uff09\uff0c\u4e5f\u7a31\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\uff08breadth-first search, BFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\u3002

    \u5716 7-9 \u00a0 \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a

    "},{"location":"chapter_tree/binary_tree_traversal/#1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u901a\u5e38\u85c9\u52a9\u201c\u4f47\u5217\u201d\u4f86\u5be6\u73fe\u3002\u4f47\u5217\u9075\u5faa\u201c\u5148\u9032\u5148\u51fa\u201d\u7684\u898f\u5247\uff0c\u800c\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5247\u9075\u5faa\u201c\u9010\u5c64\u63a8\u9032\u201d\u7684\u898f\u5247\uff0c\u5169\u8005\u80cc\u5f8c\u7684\u601d\u60f3\u662f\u4e00\u81f4\u7684\u3002\u5be6\u73fe\u7a0b\u5f0f\u78bc\u5982\u4e0b\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_bfs.py
    def level_order(root: TreeNode | None) -> list[int]:\n    \"\"\"\u5c64\u5e8f\u8d70\u8a2a\"\"\"\n    # \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue: deque[TreeNode] = deque()\n    queue.append(root)\n    # \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    res = []\n    while queue:\n        node: TreeNode = queue.popleft()  # \u968a\u5217\u51fa\u968a\n        res.append(node.val)  # \u5132\u5b58\u7bc0\u9ede\u503c\n        if node.left is not None:\n            queue.append(node.left)  # \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if node.right is not None:\n            queue.append(node.right)  # \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    return res\n
    binary_tree_bfs.cpp
    /* \u5c64\u5e8f\u8d70\u8a2a */\nvector<int> levelOrder(TreeNode *root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue<TreeNode *> queue;\n    queue.push(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    vector<int> vec;\n    while (!queue.empty()) {\n        TreeNode *node = queue.front();\n        queue.pop();              // \u968a\u5217\u51fa\u968a\n        vec.push_back(node->val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node->left != nullptr)\n            queue.push(node->left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node->right != nullptr)\n            queue.push(node->right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return vec;\n}\n
    binary_tree_bfs.java
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<Integer> levelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new LinkedList<>();\n    queue.add(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<Integer> list = new ArrayList<>();\n    while (!queue.isEmpty()) {\n        TreeNode node = queue.poll(); // \u968a\u5217\u51fa\u968a\n        list.add(node.val);           // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left);   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right);  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.cs
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> LevelOrder(TreeNode root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    Queue<TreeNode> queue = new();\n    queue.Enqueue(root);\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    List<int> list = [];\n    while (queue.Count != 0) {\n        TreeNode node = queue.Dequeue(); // \u968a\u5217\u51fa\u968a\n        list.Add(node.val!.Value);       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.Enqueue(node.left);    // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.Enqueue(node.right);   // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.go
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root *TreeNode) []any {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    queue := list.New()\n    queue.PushBack(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u5207\u7247\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    nums := make([]any, 0)\n    for queue.Len() > 0 {\n        // \u968a\u5217\u51fa\u968a\n        node := queue.Remove(queue.Front()).(*TreeNode)\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        nums = append(nums, node.Val)\n        if node.Left != nil {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Left)\n        }\n        if node.Right != nil {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue.PushBack(node.Right)\n        }\n    }\n    return nums\n}\n
    binary_tree_bfs.swift
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunc levelOrder(root: TreeNode) -> [Int] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    var queue: [TreeNode] = [root]\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list: [Int] = []\n    while !queue.isEmpty {\n        let node = queue.removeFirst() // \u968a\u5217\u51fa\u968a\n        list.append(node.val) // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let left = node.left {\n            queue.append(left) // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let right = node.right {\n            queue.append(right) // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list\n}\n
    binary_tree_bfs.js
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list = [];\n    while (queue.length) {\n        let node = queue.shift(); // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right) queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list;\n}\n
    binary_tree_bfs.ts
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfunction levelOrder(root: TreeNode | null): number[] {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    const queue = [root];\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    const list: number[] = [];\n    while (queue.length) {\n        let node = queue.shift() as TreeNode; // \u968a\u5217\u51fa\u968a\n        list.push(node.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left) {\n            queue.push(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if (node.right) {\n            queue.push(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n    }\n    return list;\n}\n
    binary_tree_bfs.dart
    /* \u5c64\u5e8f\u8d70\u8a2a */\nList<int> levelOrder(TreeNode? root) {\n  // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n  Queue<TreeNode?> queue = Queue();\n  queue.add(root);\n  // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n  List<int> res = [];\n  while (queue.isNotEmpty) {\n    TreeNode? node = queue.removeFirst(); // \u968a\u5217\u51fa\u968a\n    res.add(node!.val); // \u5132\u5b58\u7bc0\u9ede\u503c\n    if (node.left != null) queue.add(node.left); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n    if (node.right != null) queue.add(node.right); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n  }\n  return res;\n}\n
    binary_tree_bfs.rs
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfn level_order(root: &Rc<RefCell<TreeNode>>) -> Vec<i32> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    let mut que = VecDeque::new();\n    que.push_back(root.clone());\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    let mut vec = Vec::new();\n\n    while let Some(node) = que.pop_front() {\n        // \u968a\u5217\u51fa\u968a\n        vec.push(node.borrow().val); // \u5132\u5b58\u7bc0\u9ede\u503c\n        if let Some(left) = node.borrow().left.as_ref() {\n            que.push_back(left.clone()); // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        }\n        if let Some(right) = node.borrow().right.as_ref() {\n            que.push_back(right.clone()); // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n        };\n    }\n    vec\n}\n
    binary_tree_bfs.c
    /* \u5c64\u5e8f\u8d70\u8a2a */\nint *levelOrder(TreeNode *root, int *size) {\n    /* \u8f14\u52a9\u4f47\u5217 */\n    int front, rear;\n    int index, *arr;\n    TreeNode *node;\n    TreeNode **queue;\n\n    /* \u8f14\u52a9\u4f47\u5217 */\n    queue = (TreeNode **)malloc(sizeof(TreeNode *) * MAX_SIZE);\n    // \u4f47\u5217\u6307\u6a19\n    front = 0, rear = 0;\n    // \u52a0\u5165\u6839\u7bc0\u9ede\n    queue[rear++] = root;\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    /* \u8f14\u52a9\u9663\u5217 */\n    arr = (int *)malloc(sizeof(int) * MAX_SIZE);\n    // \u9663\u5217\u6307\u6a19\n    index = 0;\n    while (front < rear) {\n        // \u968a\u5217\u51fa\u968a\n        node = queue[front++];\n        // \u5132\u5b58\u7bc0\u9ede\u503c\n        arr[index++] = node->val;\n        if (node->left != NULL) {\n            // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->left;\n        }\n        if (node->right != NULL) {\n            // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n            queue[rear++] = node->right;\n        }\n    }\n    // \u66f4\u65b0\u9663\u5217\u9577\u5ea6\u7684\u503c\n    *size = index;\n    arr = realloc(arr, sizeof(int) * (*size));\n\n    // \u91cb\u653e\u8f14\u52a9\u9663\u5217\u7a7a\u9593\n    free(queue);\n    return arr;\n}\n
    binary_tree_bfs.kt
    /* \u5c64\u5e8f\u8d70\u8a2a */\nfun levelOrder(root: TreeNode?): MutableList<Int> {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\n    val queue = LinkedList<TreeNode?>()\n    queue.add(root)\n    // \u521d\u59cb\u5316\u4e00\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    val list = mutableListOf<Int>()\n    while (queue.isNotEmpty()) {\n        val node = queue.poll()      // \u968a\u5217\u51fa\u968a\n        list.add(node?._val!!)       // \u5132\u5b58\u7bc0\u9ede\u503c\n        if (node.left != null)\n            queue.offer(node.left)   // \u5de6\u5b50\u7bc0\u9ede\u5165\u5217\n        if (node.right != null)\n            queue.offer(node.right)  // \u53f3\u5b50\u7bc0\u9ede\u5165\u5217\n    }\n    return list\n}\n
    binary_tree_bfs.rb
    [class]{}-[func]{level_order}\n
    binary_tree_bfs.zig
    // \u5c64\u5e8f\u8d70\u8a2a\nfn levelOrder(comptime T: type, mem_allocator: std.mem.Allocator, root: *inc.TreeNode(T)) !std.ArrayList(T) {\n    // \u521d\u59cb\u5316\u4f47\u5217\uff0c\u52a0\u5165\u6839\u7bc0\u9ede\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\u500b\u4e32\u5217\uff0c\u7528\u65bc\u5132\u5b58\u8d70\u8a2a\u5e8f\u5217\n    var list = std.ArrayList(T).init(std.heap.page_allocator);\n    while (queue.len > 0) {\n        var queue_node = queue.popFirst().?;    // \u968a\u5217\u51fa\u968a\n        var node = queue_node.data;\n        try list.append(node.val);              // \u5132\u5b58\u7bc0\u9ede\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\u7bc0\u9ede\u5165\u5217\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\u7bc0\u9ede\u5165\u5217\n        }        \n    }\n    return list;\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    "},{"location":"chapter_tree/binary_tree_traversal/#2","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\uff0c\u5176\u4e2d \\(n\\) \u70ba\u7bc0\u9ede\u6578\u91cf\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6eff\u4e8c\u5143\u6a39\u6642\uff0c\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u6700\u591a\u540c\u6642\u5b58\u5728 \\((n + 1) / 2\\) \u500b\u7bc0\u9ede\uff0c\u4f54\u7528 \\(O(n)\\) \u7a7a\u9593\u3002
    "},{"location":"chapter_tree/binary_tree_traversal/#722","title":"7.2.2 \u00a0 \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a","text":"

    \u76f8\u61c9\u5730\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u548c\u5f8c\u5e8f\u8d70\u8a2a\u90fd\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\uff08depth-first traversal\uff09\uff0c\u4e5f\u7a31\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff08depth-first search, DFS\uff09\uff0c\u5b83\u9ad4\u73fe\u4e86\u4e00\u7a2e\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\u3002

    \u5716 7-10 \u5c55\u793a\u4e86\u5c0d\u4e8c\u5143\u6a39\u9032\u884c\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u7684\u5de5\u4f5c\u539f\u7406\u3002\u6df1\u5ea6\u512a\u5148\u8d70\u8a2a\u5c31\u50cf\u662f\u7e5e\u8457\u6574\u68f5\u4e8c\u5143\u6a39\u7684\u5916\u570d\u201c\u8d70\u201d\u4e00\u5708\uff0c\u5728\u6bcf\u500b\u7bc0\u9ede\u90fd\u6703\u9047\u5230\u4e09\u500b\u4f4d\u7f6e\uff0c\u5206\u5225\u5c0d\u61c9\u524d\u5e8f\u8d70\u8a2a\u3001\u4e2d\u5e8f\u8d70\u8a2a\u548c\u5f8c\u5e8f\u8d70\u8a2a\u3002

    \u5716 7-10 \u00a0 \u4e8c\u5143\u641c\u5c0b\u6a39\u7684\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a

    "},{"location":"chapter_tree/binary_tree_traversal/#1_1","title":"1. \u00a0 \u7a0b\u5f0f\u78bc\u5be6\u73fe","text":"

    \u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u901a\u5e38\u57fa\u65bc\u905e\u8ff4\u5be6\u73fe\uff1a

    PythonC++JavaC#GoSwiftJSTSDartRustCKotlinRubyZig binary_tree_dfs.py
    def pre_order(root: TreeNode | None):\n    \"\"\"\u524d\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\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\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\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    \"\"\"\u5f8c\u5e8f\u8d70\u8a2a\"\"\"\n    if root is None:\n        return\n    # \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    post_order(root=root.left)\n    post_order(root=root.right)\n    res.append(root.val)\n
    binary_tree_dfs.cpp
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    vec.push_back(root->val);\n    preOrder(root->left);\n    preOrder(root->right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left);\n    vec.push_back(root->val);\n    inOrder(root->right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root) {\n    if (root == nullptr)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left);\n    postOrder(root->right);\n    vec.push_back(root->val);\n}\n
    binary_tree_dfs.java
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.add(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode root) {\n    if (root == null)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.add(root.val);\n}\n
    binary_tree_dfs.cs
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid PreOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.Add(root.val!.Value);\n    PreOrder(root.left);\n    PreOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid InOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    InOrder(root.left);\n    list.Add(root.val!.Value);\n    InOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid PostOrder(TreeNode? root) {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    PostOrder(root.left);\n    PostOrder(root.right);\n    list.Add(root.val!.Value);\n}\n
    binary_tree_dfs.go
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    nums = append(nums, node.Val)\n    preOrder(node.Left)\n    preOrder(node.Right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(node.Left)\n    nums = append(nums, node.Val)\n    inOrder(node.Right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(node *TreeNode) {\n    if node == nil {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(node.Left)\n    postOrder(node.Right)\n    nums = append(nums, node.Val)\n}\n
    binary_tree_dfs.swift
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunc preOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.append(root.val)\n    preOrder(root: root.left)\n    preOrder(root: root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunc inOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root: root.left)\n    list.append(root.val)\n    inOrder(root: root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunc postOrder(root: TreeNode?) {\n    guard let root = root else {\n        return\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root: root.left)\n    postOrder(root: root.right)\n    list.append(root.val)\n}\n
    binary_tree_dfs.js
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root) {\n    if (root === null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.ts
    /* \u524d\u5e8f\u8d70\u8a2a */\nfunction preOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.push(root.val);\n    preOrder(root.left);\n    preOrder(root.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfunction inOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left);\n    list.push(root.val);\n    inOrder(root.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfunction postOrder(root: TreeNode | null): void {\n    if (root === null) {\n        return;\n    }\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left);\n    postOrder(root.right);\n    list.push(root.val);\n}\n
    binary_tree_dfs.dart
    /* \u524d\u5e8f\u8d70\u8a2a */\nvoid preOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n  list.add(node.val);\n  preOrder(node.left);\n  preOrder(node.right);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n  inOrder(node.left);\n  list.add(node.val);\n  inOrder(node.right);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode? node) {\n  if (node == null) return;\n  // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n  postOrder(node.left);\n  postOrder(node.right);\n  list.add(node.val);\n}\n
    binary_tree_dfs.rs
    /* \u524d\u5e8f\u8d70\u8a2a */\nfn pre_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\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\u8d70\u8a2a */\nfn in_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\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/* \u5f8c\u5e8f\u8d70\u8a2a */\nfn post_order(root: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {\n    let mut result = vec![];\n\n    if let Some(node) = root {\n        // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\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\u8d70\u8a2a */\nvoid preOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    arr[(*size)++] = root->val;\n    preOrder(root->left, size);\n    preOrder(root->right, size);\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nvoid inOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root->left, size);\n    arr[(*size)++] = root->val;\n    inOrder(root->right, size);\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nvoid postOrder(TreeNode *root, int *size) {\n    if (root == NULL)\n        return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root->left, size);\n    postOrder(root->right, size);\n    arr[(*size)++] = root->val;\n}\n
    binary_tree_dfs.kt
    /* \u524d\u5e8f\u8d70\u8a2a */\nfun preOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    list.add(root._val)\n    preOrder(root.left)\n    preOrder(root.right)\n}\n\n/* \u4e2d\u5e8f\u8d70\u8a2a */\nfun inOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    inOrder(root.left)\n    list.add(root._val)\n    inOrder(root.right)\n}\n\n/* \u5f8c\u5e8f\u8d70\u8a2a */\nfun postOrder(root: TreeNode?) {\n    if (root == null) return\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    postOrder(root.left)\n    postOrder(root.right)\n    list.add(root._val)\n}\n
    binary_tree_dfs.rb
    [class]{}-[func]{pre_order}\n\n[class]{}-[func]{in_order}\n\n[class]{}-[func]{post_order}\n
    binary_tree_dfs.zig
    // \u524d\u5e8f\u8d70\u8a2a\nfn preOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u6839\u7bc0\u9ede -> \u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39\n    try list.append(root.?.val);\n    try preOrder(T, root.?.left);\n    try preOrder(T, root.?.right);\n}\n\n// \u4e2d\u5e8f\u8d70\u8a2a\nfn inOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u6839\u7bc0\u9ede -> \u53f3\u5b50\u6a39\n    try inOrder(T, root.?.left);\n    try list.append(root.?.val);\n    try inOrder(T, root.?.right);\n}\n\n// \u5f8c\u5e8f\u8d70\u8a2a\nfn postOrder(comptime T: type, root: ?*inc.TreeNode(T)) !void {\n    if (root == null) return;\n    // \u8a2a\u554f\u512a\u5148\u9806\u5e8f\uff1a\u5de6\u5b50\u6a39 -> \u53f3\u5b50\u6a39 -> \u6839\u7bc0\u9ede\n    try postOrder(T, root.?.left);\n    try postOrder(T, root.?.right);\n    try list.append(root.?.val);\n}\n
    \u8996\u89ba\u5316\u57f7\u884c

    \u5168\u87a2\u5e55\u89c0\u770b >

    Tip

    \u6df1\u5ea6\u512a\u5148\u641c\u5c0b\u4e5f\u53ef\u4ee5\u57fa\u65bc\u8fed\u4ee3\u5be6\u73fe\uff0c\u6709\u8208\u8da3\u7684\u8b80\u8005\u53ef\u4ee5\u81ea\u884c\u7814\u7a76\u3002

    \u5716 7-11 \u5c55\u793a\u4e86\u524d\u5e8f\u8d70\u8a2a\u4e8c\u5143\u6a39\u7684\u905e\u8ff4\u904e\u7a0b\uff0c\u5176\u53ef\u5206\u70ba\u201c\u905e\u201d\u548c\u201c\u8ff4\u201d\u5169\u500b\u9006\u5411\u7684\u90e8\u5206\u3002

    1. \u201c\u905e\u201d\u8868\u793a\u958b\u555f\u65b0\u65b9\u6cd5\uff0c\u7a0b\u5f0f\u5728\u6b64\u904e\u7a0b\u4e2d\u8a2a\u554f\u4e0b\u4e00\u500b\u7bc0\u9ede\u3002
    2. \u201c\u8ff4\u201d\u8868\u793a\u51fd\u5f0f\u8fd4\u56de\uff0c\u4ee3\u8868\u7576\u524d\u7bc0\u9ede\u5df2\u7d93\u8a2a\u554f\u5b8c\u7562\u3002
    <1><2><3><4><5><6><7><8><9><10><11>

    \u5716 7-11 \u00a0 \u524d\u5e8f\u8d70\u8a2a\u7684\u905e\u8ff4\u904e\u7a0b

    "},{"location":"chapter_tree/binary_tree_traversal/#2_1","title":"2. \u00a0 \u8907\u96dc\u5ea6\u5206\u6790","text":"
    • \u6642\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u6240\u6709\u7bc0\u9ede\u88ab\u8a2a\u554f\u4e00\u6b21\uff0c\u4f7f\u7528 \\(O(n)\\) \u6642\u9593\u3002
    • \u7a7a\u9593\u8907\u96dc\u5ea6\u70ba \\(O(n)\\) \uff1a\u5728\u6700\u5dee\u60c5\u6cc1\u4e0b\uff0c\u5373\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u905e\u8ff4\u6df1\u5ea6\u9054\u5230 \\(n\\) \uff0c\u7cfb\u7d71\u4f54\u7528 \\(O(n)\\) \u5806\u758a\u5e40\u7a7a\u9593\u3002
    "},{"location":"chapter_tree/summary/","title":"7.6 \u00a0 \u5c0f\u7d50","text":""},{"location":"chapter_tree/summary/#1","title":"1. \u00a0 \u91cd\u9ede\u56de\u9867","text":"
    • \u4e8c\u5143\u6a39\u662f\u4e00\u7a2e\u975e\u7dda\u6027\u8cc7\u6599\u7d50\u69cb\uff0c\u9ad4\u73fe\u201c\u4e00\u5206\u70ba\u4e8c\u201d\u7684\u5206\u6cbb\u908f\u8f2f\u3002\u6bcf\u500b\u4e8c\u5143\u6a39\u7bc0\u9ede\u5305\u542b\u4e00\u500b\u503c\u4ee5\u53ca\u5169\u500b\u6307\u6a19\uff0c\u5206\u5225\u6307\u5411\u5176\u5de6\u5b50\u7bc0\u9ede\u548c\u53f3\u5b50\u7bc0\u9ede\u3002
    • \u5c0d\u65bc\u4e8c\u5143\u6a39\u4e2d\u7684\u67d0\u500b\u7bc0\u9ede\uff0c\u5176\u5de6\uff08\u53f3\uff09\u5b50\u7bc0\u9ede\u53ca\u5176\u4ee5\u4e0b\u5f62\u6210\u7684\u6a39\u88ab\u7a31\u70ba\u8a72\u7bc0\u9ede\u7684\u5de6\uff08\u53f3\uff09\u5b50\u6a39\u3002
    • \u4e8c\u5143\u6a39\u7684\u76f8\u95dc\u8853\u8a9e\u5305\u62ec\u6839\u7bc0\u9ede\u3001\u8449\u7bc0\u9ede\u3001\u5c64\u3001\u5ea6\u3001\u908a\u3001\u9ad8\u5ea6\u548c\u6df1\u5ea6\u7b49\u3002
    • \u4e8c\u5143\u6a39\u7684\u521d\u59cb\u5316\u3001\u7bc0\u9ede\u63d2\u5165\u548c\u7bc0\u9ede\u522a\u9664\u64cd\u4f5c\u8207\u93c8\u7d50\u4e32\u5217\u64cd\u4f5c\u65b9\u6cd5\u985e\u4f3c\u3002
    • \u5e38\u898b\u7684\u4e8c\u5143\u6a39\u578b\u5225\u6709\u5b8c\u7f8e\u4e8c\u5143\u6a39\u3001\u5b8c\u5168\u4e8c\u5143\u6a39\u3001\u5b8c\u6eff\u4e8c\u5143\u6a39\u548c\u5e73\u8861\u4e8c\u5143\u6a39\u3002\u5b8c\u7f8e\u4e8c\u5143\u6a39\u662f\u6700\u7406\u60f3\u7684\u72c0\u614b\uff0c\u800c\u93c8\u7d50\u4e32\u5217\u662f\u9000\u5316\u5f8c\u7684\u6700\u5dee\u72c0\u614b\u3002
    • \u4e8c\u5143\u6a39\u53ef\u4ee5\u7528\u9663\u5217\u8868\u793a\uff0c\u65b9\u6cd5\u662f\u5c07\u7bc0\u9ede\u503c\u548c\u7a7a\u4f4d\u6309\u5c64\u5e8f\u8d70\u8a2a\u9806\u5e8f\u6392\u5217\uff0c\u4e26\u6839\u64da\u7236\u7bc0\u9ede\u8207\u5b50\u7bc0\u9ede\u4e4b\u9593\u7684\u7d22\u5f15\u5c0d\u6620\u95dc\u4fc2\u4f86\u5be6\u73fe\u6307\u6a19\u3002
    • \u4e8c\u5143\u6a39\u7684\u5c64\u5e8f\u8d70\u8a2a\u662f\u4e00\u7a2e\u5ee3\u5ea6\u512a\u5148\u641c\u5c0b\u65b9\u6cd5\uff0c\u5b83\u9ad4\u73fe\u4e86\u201c\u4e00\u5708\u4e00\u5708\u5411\u5916\u64f4\u5c55\u201d\u7684\u9010\u5c64\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u900f\u904e\u4f47\u5217\u4f86\u5be6\u73fe\u3002
    • \u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u7686\u5c6c\u65bc\u6df1\u5ea6\u512a\u5148\u641c\u5c0b\uff0c\u5b83\u5011\u9ad4\u73fe\u4e86\u201c\u5148\u8d70\u5230\u76e1\u982d\uff0c\u518d\u56de\u6eaf\u7e7c\u7e8c\u201d\u7684\u8d70\u8a2a\u65b9\u5f0f\uff0c\u901a\u5e38\u4f7f\u7528\u905e\u8ff4\u4f86\u5be6\u73fe\u3002
    • \u4e8c\u5143\u641c\u5c0b\u6a39\u662f\u4e00\u7a2e\u9ad8\u6548\u7684\u5143\u7d20\u67e5\u8a62\u8cc7\u6599\u7d50\u69cb\uff0c\u5176\u67e5\u8a62\u3001\u63d2\u5165\u548c\u522a\u9664\u64cd\u4f5c\u7684\u6642\u9593\u8907\u96dc\u5ea6\u5747\u70ba \\(O(\\log n)\\) \u3002\u7576\u4e8c\u5143\u641c\u5c0b\u6a39\u9000\u5316\u70ba\u93c8\u7d50\u4e32\u5217\u6642\uff0c\u5404\u9805\u6642\u9593\u8907\u96dc\u5ea6\u6703\u52a3\u5316\u81f3 \\(O(n)\\) \u3002
    • AVL \u6a39\uff0c\u4e5f\u7a31\u5e73\u8861\u4e8c\u5143\u641c\u5c0b\u6a39\uff0c\u5b83\u900f\u904e\u65cb\u8f49\u64cd\u4f5c\u78ba\u4fdd\u5728\u4e0d\u65b7\u63d2\u5165\u548c\u522a\u9664\u7bc0\u9ede\u5f8c\u6a39\u4ecd\u7136\u4fdd\u6301\u5e73\u8861\u3002
    • AVL \u6a39\u7684\u65cb\u8f49\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\u522a\u9664\u7bc0\u9ede\u5f8c\uff0cAVL \u6a39\u6703\u5f9e\u5e95\u5411\u9802\u57f7\u884c\u65cb\u8f49\u64cd\u4f5c\uff0c\u4f7f\u6a39\u91cd\u65b0\u6062\u5fa9\u5e73\u8861\u3002
    "},{"location":"chapter_tree/summary/#2-q-a","title":"2. \u00a0 Q & A","text":"

    Q\uff1a\u5c0d\u65bc\u53ea\u6709\u4e00\u500b\u7bc0\u9ede\u7684\u4e8c\u5143\u6a39\uff0c\u6a39\u7684\u9ad8\u5ea6\u548c\u6839\u7bc0\u9ede\u7684\u6df1\u5ea6\u90fd\u662f \\(0\\) \u55ce\uff1f

    \u662f\u7684\uff0c\u56e0\u70ba\u9ad8\u5ea6\u548c\u6df1\u5ea6\u901a\u5e38\u5b9a\u7fa9\u70ba\u201c\u7d93\u904e\u7684\u908a\u7684\u6578\u91cf\u201d\u3002

    Q\uff1a\u4e8c\u5143\u6a39\u4e2d\u7684\u63d2\u5165\u8207\u522a\u9664\u4e00\u822c\u7531\u4e00\u5957\u64cd\u4f5c\u914d\u5408\u5b8c\u6210\uff0c\u9019\u88e1\u7684\u201c\u4e00\u5957\u64cd\u4f5c\u201d\u6307\u4ec0\u9ebc\u5462\uff1f\u53ef\u4ee5\u7406\u89e3\u70ba\u8cc7\u6e90\u7684\u5b50\u7bc0\u9ede\u7684\u8cc7\u6e90\u91cb\u653e\u55ce\uff1f

    \u62ff\u4e8c\u5143\u641c\u5c0b\u6a39\u4f86\u8209\u4f8b\uff0c\u522a\u9664\u7bc0\u9ede\u64cd\u4f5c\u8981\u5206\u4e09\u7a2e\u60c5\u6cc1\u8655\u7406\uff0c\u5176\u4e2d\u6bcf\u7a2e\u60c5\u6cc1\u90fd\u9700\u8981\u9032\u884c\u591a\u500b\u6b65\u9a5f\u7684\u7bc0\u9ede\u64cd\u4f5c\u3002

    Q\uff1a\u70ba\u4ec0\u9ebc DFS \u8d70\u8a2a\u4e8c\u5143\u6a39\u6709\u524d\u3001\u4e2d\u3001\u5f8c\u4e09\u7a2e\u9806\u5e8f\uff0c\u5206\u5225\u6709\u4ec0\u9ebc\u7528\u5462\uff1f

    \u8207\u9806\u5e8f\u548c\u9006\u5e8f\u8d70\u8a2a\u9663\u5217\u985e\u4f3c\uff0c\u524d\u5e8f\u3001\u4e2d\u5e8f\u3001\u5f8c\u5e8f\u8d70\u8a2a\u662f\u4e09\u7a2e\u4e8c\u5143\u6a39\u8d70\u8a2a\u65b9\u6cd5\uff0c\u6211\u5011\u53ef\u4ee5\u4f7f\u7528\u5b83\u5011\u5f97\u5230\u4e00\u500b\u7279\u5b9a\u9806\u5e8f\u7684\u8d70\u8a2a\u7d50\u679c\u3002\u4f8b\u5982\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u4e2d\uff0c\u7531\u65bc\u7bc0\u9ede\u5927\u5c0f\u6eff\u8db3 \u5de6\u5b50\u7bc0\u9ede\u503c < \u6839\u7bc0\u9ede\u503c < \u53f3\u5b50\u7bc0\u9ede\u503c \uff0c\u56e0\u6b64\u6211\u5011\u53ea\u8981\u6309\u7167\u201c\u5de6 \\(\\rightarrow\\) \u6839 \\(\\rightarrow\\) \u53f3\u201d\u7684\u512a\u5148\u9806\u5e8f\u8d70\u8a2a\u6a39\uff0c\u5c31\u53ef\u4ee5\u7372\u5f97\u6709\u5e8f\u7684\u7bc0\u9ede\u5e8f\u5217\u3002

    Q\uff1a\u53f3\u65cb\u64cd\u4f5c\u662f\u8655\u7406\u5931\u8861\u7bc0\u9ede node\u3001child\u3001grand_child \u4e4b\u9593\u7684\u95dc\u4fc2\uff0c\u90a3 node \u7684\u7236\u7bc0\u9ede\u548c node \u539f\u4f86\u7684\u9023\u7dda\u4e0d\u9700\u8981\u7dad\u8b77\u55ce\uff1f\u53f3\u65cb\u64cd\u4f5c\u5f8c\u8c48\u4e0d\u662f\u65b7\u6389\u4e86\uff1f

    \u6211\u5011\u9700\u8981\u5f9e\u905e\u8ff4\u7684\u8996\u89d2\u4f86\u770b\u9019\u500b\u554f\u984c\u3002\u53f3\u65cb\u64cd\u4f5c right_rotate(root) \u50b3\u5165\u7684\u662f\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\uff0c\u6700\u7d42 return child \u8fd4\u56de\u65cb\u8f49\u4e4b\u5f8c\u7684\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u3002\u5b50\u6a39\u7684\u6839\u7bc0\u9ede\u548c\u5176\u7236\u7bc0\u9ede\u7684\u9023\u7dda\u662f\u5728\u8a72\u51fd\u5f0f\u8fd4\u56de\u5f8c\u5b8c\u6210\u7684\uff0c\u4e0d\u5c6c\u65bc\u53f3\u65cb\u64cd\u4f5c\u7684\u7dad\u8b77\u7bc4\u570d\u3002

    Q\uff1a\u5728 C++ \u4e2d\uff0c\u51fd\u5f0f\u88ab\u5283\u5206\u5230 private \u548c public \u4e2d\uff0c\u9019\u65b9\u9762\u6709\u4ec0\u9ebc\u8003\u91cf\u55ce\uff1f\u70ba\u4ec0\u9ebc\u8981\u5c07 height() \u51fd\u5f0f\u548c updateHeight() \u51fd\u5f0f\u5206\u5225\u653e\u5728 public \u548c private \u4e2d\u5462\uff1f

    \u4e3b\u8981\u770b\u65b9\u6cd5\u7684\u4f7f\u7528\u7bc4\u570d\uff0c\u5982\u679c\u65b9\u6cd5\u53ea\u5728\u985e\u5225\u5167\u90e8\u4f7f\u7528\uff0c\u90a3\u9ebc\u5c31\u8a2d\u8a08\u70ba private \u3002\u4f8b\u5982\uff0c\u4f7f\u7528\u8005\u55ae\u7368\u547c\u53eb updateHeight() \u662f\u6c92\u6709\u610f\u7fa9\u7684\uff0c\u5b83\u53ea\u662f\u63d2\u5165\u3001\u522a\u9664\u64cd\u4f5c\u4e2d\u7684\u4e00\u6b65\u3002\u800c height() \u662f\u8a2a\u554f\u7bc0\u9ede\u9ad8\u5ea6\uff0c\u985e\u4f3c\u65bc vector.size() \uff0c\u56e0\u6b64\u8a2d\u5b9a\u6210 public \u4ee5\u4fbf\u4f7f\u7528\u3002

    Q\uff1a\u5982\u4f55\u5f9e\u4e00\u7d44\u8f38\u5165\u8cc7\u6599\u69cb\u5efa\u4e00\u68f5\u4e8c\u5143\u641c\u5c0b\u6a39\uff1f\u6839\u7bc0\u9ede\u7684\u9078\u64c7\u662f\u4e0d\u662f\u5f88\u91cd\u8981\uff1f

    \u662f\u7684\uff0c\u69cb\u5efa\u6a39\u7684\u65b9\u6cd5\u5df2\u5728\u4e8c\u5143\u641c\u5c0b\u6a39\u7a0b\u5f0f\u78bc\u4e2d\u7684 build_tree() \u65b9\u6cd5\u4e2d\u7d66\u51fa\u3002\u81f3\u65bc\u6839\u7bc0\u9ede\u7684\u9078\u64c7\uff0c\u6211\u5011\u901a\u5e38\u6703\u5c07\u8f38\u5165\u8cc7\u6599\u6392\u5e8f\uff0c\u7136\u5f8c\u5c07\u4e2d\u9ede\u5143\u7d20\u4f5c\u70ba\u6839\u7bc0\u9ede\uff0c\u518d\u905e\u8ff4\u5730\u69cb\u5efa\u5de6\u53f3\u5b50\u6a39\u3002\u9019\u6a23\u505a\u53ef\u4ee5\u6700\u5927\u7a0b\u5ea6\u4fdd\u8b49\u6a39\u7684\u5e73\u8861\u6027\u3002

    Q\uff1a\u5728 Java \u4e2d\uff0c\u5b57\u4e32\u5c0d\u6bd4\u662f\u5426\u4e00\u5b9a\u8981\u7528 equals() \u65b9\u6cd5\uff1f

    \u5728 Java \u4e2d\uff0c\u5c0d\u65bc\u57fa\u672c\u8cc7\u6599\u578b\u5225\uff0c== \u7528\u65bc\u5c0d\u6bd4\u5169\u500b\u8b8a\u6578\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002\u5c0d\u65bc\u5f15\u7528\u578b\u5225\uff0c\u5169\u7a2e\u7b26\u865f\u7684\u5de5\u4f5c\u539f\u7406\u662f\u4e0d\u540c\u7684\u3002

    • == \uff1a\u7528\u4f86\u6bd4\u8f03\u5169\u500b\u8b8a\u6578\u662f\u5426\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u5373\u5b83\u5011\u5728\u8a18\u61b6\u9ad4\u4e2d\u7684\u4f4d\u7f6e\u662f\u5426\u76f8\u540c\u3002
    • equals()\uff1a\u7528\u4f86\u5c0d\u6bd4\u5169\u500b\u7269\u4ef6\u7684\u503c\u662f\u5426\u76f8\u7b49\u3002

    \u56e0\u6b64\uff0c\u5982\u679c\u8981\u5c0d\u6bd4\u503c\uff0c\u6211\u5011\u61c9\u8a72\u4f7f\u7528 equals() \u3002\u7136\u800c\uff0c\u900f\u904e String a = \"hi\"; String b = \"hi\"; \u521d\u59cb\u5316\u7684\u5b57\u4e32\u90fd\u5132\u5b58\u5728\u5b57\u4e32\u5e38\u6578\u6c60\u4e2d\uff0c\u5b83\u5011\u6307\u5411\u540c\u4e00\u500b\u7269\u4ef6\uff0c\u56e0\u6b64\u4e5f\u53ef\u4ee5\u7528 a == b \u4f86\u6bd4\u8f03\u5169\u500b\u5b57\u4e32\u7684\u5167\u5bb9\u3002

    Q\uff1a\u5ee3\u5ea6\u512a\u5148\u8d70\u8a2a\u5230\u6700\u5e95\u5c64\u4e4b\u524d\uff0c\u4f47\u5217\u4e2d\u7684\u7bc0\u9ede\u6578\u91cf\u662f \\(2^h\\) \u55ce\uff1f

    \u662f\u7684\uff0c\u4f8b\u5982\u9ad8\u5ea6 \\(h = 2\\) \u7684\u6eff\u4e8c\u5143\u6a39\uff0c\u5176\u7bc0\u9ede\u7e3d\u6578 \\(n = 7\\) \uff0c\u5247\u5e95\u5c64\u7bc0\u9ede\u6578\u91cf \\(4 = 2^h = (n + 1) / 2\\) \u3002

    "}]} \ No newline at end of file diff --git a/zh-hant/sitemap.xml b/zh-hant/sitemap.xml index 79efb18a6..7b82072ae 100644 --- a/zh-hant/sitemap.xml +++ b/zh-hant/sitemap.xml @@ -2,527 +2,527 @@ https://www.hello-algo.com/zh-hant/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_appendix/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_appendix/contribution/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_appendix/installation/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_appendix/terminology/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/array/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/linked_list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/list/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/ram_and_cache/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_array_and_linkedlist/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/backtracking_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/n_queens_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/permutations_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/subset_sum_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_backtracking/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/iteration_and_recursion/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/performance_evaluation/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/space_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_computational_complexity/time_complexity/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/basic_data_types/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/character_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/classification_of_data_structure/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/number_encoding/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_data_structure/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/binary_search_recur/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/build_binary_tree_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/divide_and_conquer/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/hanota_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_divide_and_conquer/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/dp_problem_features/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/dp_solution_pipeline/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/edit_distance_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/intro_to_dynamic_programming/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_dynamic_programming/unbounded_knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_graph/graph/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_graph/graph_operations/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_graph/graph_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_graph/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/fractional_knapsack_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/greedy_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/max_capacity_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/max_product_cutting_problem/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_greedy/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hashing/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hashing/hash_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hashing/hash_collision/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hashing/hash_map/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hashing/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_heap/build_heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_heap/heap/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_heap/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_heap/top_k/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_hello_algo/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_introduction/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_introduction/algorithms_are_everywhere/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_introduction/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_introduction/what_is_dsa/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_preface/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_preface/about_the_book/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_preface/suggestions/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_preface/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_reference/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/binary_search/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/binary_search_edge/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/binary_search_insertion/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/replace_linear_by_hashing/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/searching_algorithm_revisited/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_searching/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/bubble_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/bucket_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/counting_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/heap_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/insertion_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/merge_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/quick_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/radix_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/selection_sort/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/sorting_algorithm/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_sorting/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_stack_and_queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_stack_and_queue/deque/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_stack_and_queue/queue/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_stack_and_queue/stack/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_stack_and_queue/summary/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/array_representation_of_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/avl_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/binary_search_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/binary_tree/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/binary_tree_traversal/ - 2024-04-15 + 2024-04-19 daily https://www.hello-algo.com/zh-hant/chapter_tree/summary/ - 2024-04-15 + 2024-04-19 daily \ No newline at end of file diff --git a/zh-hant/sitemap.xml.gz b/zh-hant/sitemap.xml.gz index b3d5f27a1a288a1e801c8f63aa85235cd58b2b7b..cb8b730d59951c179d7fd31b3acf24bc61f21ed6 100644 GIT binary patch literal 1010 zcmVp5mCoGu z7wnu-87ejk1_DJs=GQOS>7*m|UiPrkn;hB(f9QFEDxko<`FS4Q%aK#I!M`oOu3i@} z>~%2K_iu||fB&`oWAStQWmA&NEHCwDpWhaPNc?lXKAldhY=uXPc@&U&bcyuN0x zUspdC+b=Km*IqE6O}~u`dfVQTudf-{xv(VHhm{WF`uDIL$jf@OZa02>j1nZ^vjDst)S zC|p$oM%IAieQI93wiIDDO)r73&r7!vC;&Hk`ORRiCJG?Le>_(-nc%n$xm zQ;t;CJWI2C3d0vW!qtc&A(bT+EhRA`a!1+fIa4l?Gopr?UAw?`;XS?vsiNX!yR&-k zK*H_`T9+?l2VN~mzSY>HH9SwGgRc{dgo@o+UkhDjrlf~?AO$O>SZCB#kR)cP3C1Ua zo~M=7>!BJuczr;5sEenu4mfI&_ld?4rc?NY+r;;lqjpTKv&hI=a&Xg+7=vgK;%e1rLPkj1BJS4v7$Np2b>GR4y(phPWq^(>K%f9hfY*Vx- zT}0X%G@uM5KQmAsPzJp3tnCP9pbzLeIA>wjFCWm`7Fi@{C{tvV!fl{)_!Wy8ix#f! zN{DI?f?F?7T?hp36sl^YB9uPk0r=KaXGN)Pb>Vb54GgmK`XB|#Bp<*}1BtR(nM@Gy zG4YNxL$Oj9iYOUabs_Ab&~xc~&Nz{%J2#F!R^;mQJV>LScL<=&4DYlL8yt|?6`P)+ z1z4Xs!3wWvY1dUsV;-~O79C@4R<5A!GB0ThwQx9mFhhp^}4?B^uXFTl8jx}ccz8=9A zbZ+!W0~2X$@@SbHX2STMB<<8_33n4Wh*>V%&U<4b=E^ovrSE=P1h<%=X*s zx9`i>@5`^h)myH4A8yn2>7I9q4_ialT{i0vIWy4uM)V)q>KmhQQWPV5W6xNyI(SL8 zD^lwni`@DwG0}Mn0;0;h0Zacf>^uWBGZ@wSVb;f z9fhlEz{nbKyid)G*H%MrN;y7T0f(=XvovK-9YbPWrr961sA}N5kVf*F6(7kJocY1O zYRZwSnrCTtPht3CN4Od>B&4#WqNOB8MD8eCJ!i@#az@lpvuhXFF1*LrAXQYHYuaH_%#`#n52RqF6zhz-3X;SOHNp5q z(DSsidOcKQ2d@t(4|VZ0)&WN?@;=cx!gLCsaGUtva@3Bgbru;}OAc;YvQp7TcGfej z7&ca_p=6n+tWehdi5lxA1tsCBY-jH&X3~53+Cg`|#do22!$v_?N!1YtAW}$P72-9l znc>hSQQLw;4u~Adr}T9~W1vuXEmkx~A3;D_k+hWyV%azTifxJ( zrHe>gg9em=eCW6{F3 zT?tX`L2&EksSAO?okCS@RD{xJJOJN%>Z~ZWtuCA{r-4CMULT|&ndAfbX&_NHE0YNV zJ|^CgW++zbLJ=hct1g5+6nZXw&lx8Yb?3&h$BJBio(E~v^9})&nc>Q*m@) h#E&5sNOo9guuYE>{{Q9yr$c7h{sX1oVVIyz007Hk_gnw~

(gwwKm6b7=Q75$0EMBKX`+Sy4pJ1iF!-E4w5KNJjA(se=&F6u0kEhoe^wRnwvk~1L5 z@rC)$Xs!(z$%!&@zz&9f%k0n>j4!();ZAETzO31Y71Dn5_+&u%Ln@8!GP&flQj@Cl znp}d;Nu-m^r=V6Od1J)V_h)I19(3Q>#@YMnp%MBv389+NY#?qpCFnK9=aW!rd543a zB*{_AN4=%fbDZn*AS7H+N6B}6%}wyDI#md_jujgz=*bnv%HoS1fzIM(!4yFag7ZZb z9Fr)Za^L0Ee7KD1>pe zXn@?zc80$HUd47dr}XV(n%dEyVy@!_K)upqRmS(Zv_$wG%6AMqt37PmwbPUg)1iVB zE#lH~lBrJue3 zd10cJc$KebKQx*S;3qLt^y|pB~ zJq)^!Y2Qr=E1?Fj? zk@4$};ZBl7&2SCndDqm3flHLLmV&;Q`Bsb!i&rvbTsqqeHXeJCvK>!9dQPM@!y4Pa zoQwF-DANt*ji4m9URhM${ybatrkwf!h^8O6{5i&xu*~;AgPLonHO0`>X%Dui{5)_e zrV4tMT}yjxN+fsqshbZuqqh>tRSYG3X@-2_C`6jU3OLhG2iqNTChqJ_j=U0Ki%4)3 zQg2bT724jfPjG5=Ild`#F>7MEcBA{Radl~w3NUzGB7UAH{%Tk|cKG!tg}sBDAOjpn zon3Be5j3t=y4{lD&6oMbbvaU*cEl0;Y z+_!Nbxn%UJ|F3Y_baR!pk&#zB*-N!hl>?j?4e8wan3MSf9m`UQY!YB3ijypgVzMB5 z#2P{)|8OT7WeWbtd)$Ig*JY5MT!R+>bIHxSsP%)I1CTDK132pQcg6Bc50P)uShj;N zN$z+Crq{9r#+RNV*2h8b*ub0i966^9YZUyt{7nJsMm>`MuCe zs+m_gGN*Gp=&$Q1%@^QP0_GSu8{xH|qWvLZG`}<{|2|Q$n90{1=jp`->8Pz8ouK5*Wqu-9} zcAVTggjqgCrj@j&t}o%ZRX**$P@%`OAQ~hZ_*`Aiw@uKyW?h-vzd0^mo|0E+`O3t< z@Abl%g>O#3zHy!!LCWsZd#p8c(5Db`-DPTUd#q<`Dl1fC9eq8a^ozm+v@yOBm7kZL*ChoDV3E~ zcnv|856zvxSYtRkXgsN>C(?}$#yau#&quzJzfFr@{V(p`b^W>@ld-NW9&!_h=--lA zU-9{u?>kh3xNWx}AP-PE4rK}b5$-uApBt^!hb4v7l*BKZ!2T+8(ayHhFFpbuIXQ(q zI=YPGV8h(fFCG`^y;}WUrgS~nr3s_i{MBX`p5C_S5af9cWs`|53qnMroMXmN%W)RE zY^-dJi`baf{+-i!72%YOxhX&_hm8)zDqR*}E>m&ImEOt#--m-@F+0=v7RFkpW0^S5 zI?D(jWOuG!V~qTYWsrx^Y@iQKc{6+^J`8Kh)~wQoY@A>KIbQJ4iJj`mihM?#=X3q^ z%cyBG4ou$cXgP#7Mq=INSkrl_jqv=)P#Rlz$CZ733yO+#-NncCwfi!TZ@rOpLH$-G zVAXe9^FqUEQV%OfS8>LCDJ`?yl5>VZK%4@``;q1}69C4{pe7qW53JpE>aEM4smPlG z+vs*t;A?%T^uU$waoLNc3LcFaFbtiVXBr3J8-kq-KK%^vKY+b=YS{xIumF;AaKXNn z$=1UTgIGI>G5WzyIMVf|$8pb2VAN*6;=bpeN94%v_Mre1v#Vw?su4Fw!`zz?Kj!$i zDLUv$Jj~19?f&Rc&E$_uqv=IQ!7ut=TohvoG`@*zcE$Vqy>08Krijz@lS*-l4 zwPI2u*Gsv#lG1Zc7b{VH*q#=W#jH_KiOHWqNp>O`nBN}@eF8;qx=$x$$-&0piqYbRt|6Q38%^wNbS4h85cg`8nEa`%J>}(UA{FIB{iR6QwHkv z1n5F|4%kMRRifX3bIPg`*nt$+jk~GGW8^6xy&-csXF01D#RM;5R1&Ocl*(FQg92|s z#OPIPvm1HVYbY->%q9q`MJwIo;MECj+@jyWr1+3{JU{i5JH??caAxev;w!huF3B$7`EaO6t?Q z$PS?^`xNQT_Lqg{0$sKVj-t+I+$$=w>8LgOQx#crJG84uZCr#AOy``f;gc!v?)II~ma5OsK6~Iuc0JBvl%E zeg-F{kjxg^QH2&RN|!P_Nws$oRuSdVgg0-=wtUcA@36vAqCmt1b}I z8ld|YMGg{=TUF-A@yH>&6~<%G7$Si!fnZV*`00|$IHrcCs<*&yK|S~>&P#aP$jW`?Q7lyJ-5(d}tSwc67%GgTgez+JLOJzD9{pHW%RC(J%Ehhf7rQHrpy zQ#TunH%q^8;+d-Olrd%qN}(H4mhOoCu2m93@b>00p2F~I@u!s*w8UtwK#rvE{k@@t zgH;p2)I?4Sx$x-ZQNtv0gM{D*S1l`(6_oSOrL%*9q3bmqOBEx0dXPAqBiqgKA1a6U zKZSMdSAqd$ZCY#j2SxFGB!008h2094u4dK!fCQ zeR2>F_@HgEg>>#9)(BghuaOaM123b+JJ3pSKZLGI`0+q{6X2M=qg#Rn2TSA)LV4$N zWi5$l+J3EUu*K%F*C%G#{(;Tk$J=sJFZx$XrqOxHjcJE7+RCMm8Ojqf=batox`8Z@ zir>${%9>q0aMvQt=QLCHKeMZ=ZvhDoqw5$`8WWh1_gW>9T7U!PwL8*X(i+QnQX^Sq zV@%5UybH0WBrO*a+_MJ^fjJEzc~^XfPg*Rr7y+P#^dAipa5JiF0+KJixyS)FNVj?i zpb}#%tLV8-cA9#L3X!SBnSULbOqF0aC0ZCX~!NbrQx!+RoPH2&9(b%>y4 ztc>^uAt*Bmpj?mUQh`GY-O_C>UD6!~m$#v2G+f0EP^{F!PI%qO z;)@i1dErI>1&zZQDCi0hhy$nv8#?+Gk#}0ebZS=%b_R(2#S@fw-SZ=ibq@MwwlcnZ zd{Q&DJNmrR_0T9B2H-yKeAjxNyVHzQp@v%A*X|ANouaurXzshG z#KvkoI(^(qs1f2s&mVd<+H=D521s~3NeUNOF%b^XvEE$*+6&Xt70#|dmlj_r9F1GI zW7?$OSn#yV1Bk-0jpElbemgzIGhP4BbVED10_Nq`3~E)I;{@tfLm2y9k=VR?9?~pY zJggTb$3cc11El24W)Y&SFhw9x&C=6xdC^a?$>O&%7Xy0T-2*H$H~5ZW0X;p2(^u{w z%vC67=Mrs|pMaq#U{V=!D|{QChi2LwpLMo=gV`Ys6v5N2xGrD^1{))6GtTJ3iIo4a|g>u!+50St6sC} zo7Q&LLg^#@G?x)j!{aGj&2A1nnQJf;VfuW{UI{I^O0haiMZJ2i*`;R;1>)1%A=nM* zt6H%^C7uE+devkfigQLFg0FxGqXUF!^F_3s_UnZ&6b)zPZUoBunJw`zW~5)OUBR^q zP9C1HR3Yc(~TzZkP{EzcK3O_GCtdRNxZj5-0Y z%_%l0?a1e@aYGz~7tkak{S#~IbVH+5pHcXKoG50#nMTJd0%Eew{2jpgr}-)f>(2rp z{vtd3@RRdi|I9MY4`cILe5T^RGTC%UadxYxErj}vjNG*UT%3IO^r7GwkURuprhtjE zbQWI$Vavic@8D!#E&XF}vT@ttF-0iwg-X=P5waybiQ;E9+&7|C0=c9H$D9P)VdkX1 zzwFEkJWRZnz{5U;oA6;)cK}arM6XqzoIGWKNLkWHGn@D#`5c#83Nai^L6SZ~OCIq_ zyf~IDek2AvTwl0BRRJ$AxNY39#Axgnn&b8DwyKsFYH<6C)kNVWMzyndrd=P^;6S%s z&J+&X;s;y_IR{o>-iiY={(Lb8XJp`(0Kl-y zyYfPdYey?Pe^S=vJ#NA=8*-{X)FF%^Jw?x>T{L$Po9!hs$bzpMOP3AmkgVH_gEfoh zUeKI7|GV^%N>%Ssm7v%wl2N&~BvdBi2%(zlU`J(RFAmc834pF+%+~@HH%B&SEiUPd%SQNg78W;j1319#B z(j$O!_*kSp`-J=VwY7=g-ZbD|@f+($z{xq?=Tu*+zx!vtx_Wx>TmsR*`xI4CBf8fm zfU9#f_PMKK^~~a(Vl@IDDlXb$8Dll0EafFHW=9GjN;l^NL{F0dbjjv_Yl!6T3D8wT z=AqbCh=(d)MBD)LZUEH#fjjOuq%nK|sG)j!yf`^DE79T22!N>0aRR;quIePuR>cWX z?V$wOqg^4u_(0GqnoW&U%dd3OywVVpqqrnJReqqKscg~^RH-&1Bzl#>Fab{4n zOjl>9Ad7qJr?Q?S`|fhWPY@MYC}EyA#W^f?I?m7K^cpG$3-Zgnhx6rd=jT70lbZ$p znI^AF^xOrI8*Bbjk(qU**|XD-|Ne8?Qq!T0CGF(RJPnecZ2{@{K$1IQ#4A9N@wE zckS$P{=CJmlYQSd?X}Zu6%nadLoE3)$$-0*NzX%)jv>da(Tf%hrorQcukD5JU14q= z|1fDQ&_*CNyRUCCbPTJwPk;YQgV&)$B&8)jtGGoe#&T9bgC~`>CCw_yMYBfFmR`FJ zs4o(8j6sQfP#&Ee%Nbvu7ee#(T+$}Tg;U@w-JSW(KG|oHt>4Q>KoH9TjHC@h75ZST zsR+JFu(EUe(g#E3-x(#`yDD=fSAYDhvsiLSmdz_aAYw@M`nUdItm3pB{L!}WQ;r{? zw5*zF=tQVGZT$X(|8I!nwgr;8pP~huZ>LPzeROrL4zOi%*|&KGP;C!!G0?*s0l!db zFUvC_xBRR}wn`=Cj=n*xYCU9uuaR#qNgn8}7Y5AUxa1xm&v=`@mtKF0N-GPTGTY3P z)aTOKJ%a~~ito3)LWj4~c7L52OGb6A5=sfYpIz60IOV`h*|EbRp7kIp1NfyYyv8ei zt(>p%_kw;4k)4)0KWgiL_T#FAC2L*yz8$OAwUp-!d`pPu+e1*+BEYbGUlwkpkv(FF zq&a6;!$Hb%Wc5hd3xzlrICJY%ltHrqgOFCa!t{=|sd+=#hLDk%&P>DArq8|FfvxJh zzdG*A6$-y;QULRpB{J$N9`}YVF`cxj^Ue!Eu{~;t+47*UZdr+j5142qM+Wx1>6-3z z@S@#)4PW>Cic7W)6q_5krk+hfyA2y~H{y)_ujg@ne@!&C9~pINsIbE2IyG-%(MdpC zYPa^hLQ84&-io{Ug0Thn%!=8>KDk`ae{~r>8BJ$QqP?8er>mYYIN{zq1OQz>f!rnT zaK@;F%F`~?cEKZ+D+xhI7Fdei!1=qYPWHsuRv(L&{@eaoJ|`u&V9{<5BS8M#4rx1n zoVKiV5q3vS_6ueJR;z?5?(A`*69*x#M9b5>inAAvmH8yC$nPEck-e@(pudd_Jh@ zjqPStGv->;qxL)Q;Ok%ZvjN0dHnTpto9Hm9_WUT=8%uqRq(Nh|c+hW6)ed6z-MEbV z%EiLdjWu7pE6(i3vN&b-ErDtw;D{k|0akK=2oR|L_@Ut8+y6OauKA=4%LOUMg%T}B zIT5!Kcbe~p_K4;x#L_A$QaNn*2%}wll|vhtU7;qtj7>}T7Cd-(%id!3R~G`h6!Rs&X{M9J?XztA=fa*F(s z8=kpSZ(i^R+`G#{!8oTKMq-h!quw(df2O6dOaQfWGT#_FHDY<&2o>~WMAcDLZF1B1 zn42OQ-|dk@;Z!)$Z}3!K)RXT-;o~xyruF8q=sAK7#7mp?_(FtjeA$gtL`E+gjitNF zx@V~Tc)75DV|@{_)|$pFwvRZNxrzfB6=hdf1Uh0mxsF6OM|`Q zBs1&heLFoNN{soLjwk26S!~w&rGZTXQqB&zXUqF=&W0pvUouz0TpBOPb@YQ!6GarMe%dSfMK)-FrLoqP6evW78K%%=eQ{R92fPT5kK!JQf|2T z(SUb=*mk_gL-3=ngn=+Gq~GEzMwlEuJJ|TXn{6{~k7a|KHLsH1!bQI{r75?+?uKn% z5&kzl(udN_CU8Xl{Au}+Vg$*OGU62n*~5=cS)ghWFvR;E@fv`pzoW>Nii-_nR)nYVr1{=(9Hv@O0S%;YYxd@AgXVP zqF#u3FmfcR{yJ-kMN#>vx2Bs1*15gytn&hk^2?tl*TT2;&Wsr zN*D0xj#1bo1}1S^ObqetHL=BVQFZYt{2FsoYt&T^qWLp$(F-3cb^0q60qXAnxz9ch zC|@yv@^u<1=*0B_YLeDaP8cvqVtpG}%|L)~`Tq~dgHz1xNNfds65qaLujJPgq3b;B zeDLpGBU+i!1{C~6CV7X&fxAhG#ntYUf=wfapx>MUcdk*%YvFz;K}YPHNCL6sf|pFR zic3%}3iMG+`)41Bn8uDiL%ra;GnF#>1{v`?G&R2E2)rrkXoCswlZKc2&IccF`%?Ux zoh!7KjHcs0)y1y`S2CE96rq&)U=8PriHOD`B(#C=EG_%{8IH`4m1*3IBRz2GjBDdN z5Fzrc5xb7}(YlL6t!?zha!e`s)>v!3n=D-Yg5j@SXlxm{*RY8Oia)4~R;&d-j+?LTtj zWh<$mKfYEm@Rc%dd2y4>v;BnvJHR^pZ!IN|JP!8GqS0i8-+rDledo55M@==$5(#s; z()vIrq(b5bcn=W0v7O1SF&pN1q8t_sfz6FNO`KYYMGb~qi@V)#eG9FYw7h!+w`0tY zCKaUz0T@%GcPi^maM$G3^gA&o@BL}16&$1;fAJmmfWX;u0S@Mxq4nAbxwr6pqnWfd zirRo9Jm(DiCj$=O6w>PN9P4z1+sS1rpK?)GtWUXdEnwx)hL4&Ciq023Q{zdRxY%+p z6^|t`LzTY2(zd3t?V$*DYPHgQn?b`-CTnFChvTGd8&dXB?kL81POD(FOt)9uUSaY- zWH`mMy*Gp#$KWF8(mcs1jFd4Dv(40dJKPX2X zpHrvX5=gR85B(pm`GjIm;oHVXf6deN_jk6=G@1Pyz~8td)M7^?BAxkQJh#T^TqPRF z9Yd^@G*t)PiD7b%@E$X*6k0c-vD=6f#uF+&xW-{`p03H2I>4nsdSh~s#-be@lS{j- zMZ@4mqwel`#Ez*jEJSZ`zzgcb;KLCY^!r-&FgWu0VN2^Ry}7dW8Yn5TPQ?9tJA?9# zxLIBLJbt0OHw^;=g}&RCR#z|rpTa0d5TVp+qLSlmD|%u)yi;spEbgm)!g!gd5o>Fj z*n-W&+}VYjU)o56&&~xHsIgC5zXCq~yiWQ1NbvK$!~u{(Z#_hd1?%hK`0()_A(Q7S z?E#$^;vmNa>K}yV7_84d3P#{@IiByQffW(a;0yH)*w!m39ByHHP-wh8=gaQ-^3Gi{ zRXI+q)7ng`M@hp7fj`u>?Yi~*94YMy50Q#TIqT(VuYz7Z3b5WbeIHNrr|Y|=HI6Z! z-0f+eW+WOKE*#_LTJzgCUypxAmEA6q9oE}rT0XYo>~|^dI7TPz+$<<}=p)9pCKM)u zSkWCj^Vr{DSQA`874ly2yC_UdMq$3fCQM@NfLuqKXr@(9b=`zbqKCOJA85O>dX^Hw z+$}DnBXl{VV@QXBR&XzY2XGdvbMxJ8;@yX*20*N`1p}ZnJ(T7};8tMdjjP2AB7M%5 zNz-`5Z~)33xI>?*!Z+7N8J$hO`hRfm41sjUH~zs^;>E>$+v;&>6yY{8Wj{P2h`3?Z zHDSq((qL-}zrDk_8f|5i=WE6(Je`%=+eB1bnf8ru0w*3s1ow(nGKmts;iy499U*19 z-a&EkubLUlRZ2=)hn{YFa@y(xL!COUky<6oH?c}sG)&cPLpG+F`p8)3cumv@@<1n) zm~gbCiB)*92ftA2!MmV>66mOgjAo-xSMbi^OKK5l3#p>7GUNd|Lts~(ROvkZY zP2^)AUcCWS5yl+8^4%HYDXUn6c}-4s07rW$N4gheS+Jpce;`Ah%(+BkHcPAY6NEG> z$uPXVkV}P1w-EAPv5!haJ_!|Pu&xKswZ7O14rf%cPAHzxtetjKG`}Yj*qFrFN77)N zk|zTjFhtt00Mo5{YV(Nbob>^=dUr8b&d z!x{RJa=9iGEzEPE&LboMt9~5^Q+#btL&1>lHU)^tXuV;30E&GkA~#TyfwR>h{vW!M zJ&h$v331^iTprqW8yqq{%oD6r! zlFOP6h_n^UV+U&nlSJ}uMc@GL#>!m!OX#S1$PlLCW=|8Y-xW;N$|U=fL#D09z={J&XE$fju%Vzu67b-~+`LcJ8gqi4wq zF^XkBCFnSI69tC%!xpR30>zA$GmE~nTAJ-k3GnADo9-{j%wHacfzkI^3|o*7!+7)4 zwX+HKBHQM$f$fX4!&-U@F};Rx(e)d+FL`wQ=(s##NZCLAiUJ4tyThlj9s*xFW}fk{~yOLvgLZc66uXA8q;UKuD7Y4 zgTZ|sKL6nWU>Tiqan3e?wl*R!hygwUrP(au-vLGWl>$iuiUaQdp4kNbH%IX(8D7AX z2AaS{CV-uI448En_&M9_17ncNKj?wZDR*V?0k;A=?i8IcnRFh>G;R_nT2leXtj6By zUzOZD+dtl=>oiTY*%?Q)<=c*ubBpLSjnrNxfZR{?7jt!aboe1ORSfWB&&E?DaJ&|{ zK@(EcQON)?TxC@!1K`!t-Q56f^xqsaNN4~0!GC#t9_V{~ekJO0dyW&py%Avi487hu zBk4c4tW5lWSEV1`l}!WUKi8|SSbz-puG4u*)!;@Si;ns!QUYG&dd}ot5h?v0lFcO+ z`rj{6?}TGJVI3tSb1sUVtC~?+Z}?ri=mv2^xr`7UZ5X;?OcR#CIHA;|8+|w zsXO_?SsVbWVbROsO%T*Zxd-9pD&(MoyUW+sY01F=@{)x>*wSf`162$5hl5!$4aba` z=Pfh#t-wmRz4h0n@omN{yDTa54Pgb{nQ z)F<}lG5<~zSI8TS5`nspWjJ-eJ0DJ)%5by~v)+pZ z3{iM*=0)y3o?QZtJC6X%`onAWgzE9U;O58E>j6!4y`bi93q!zKVv(}hn7Ayk%0@qM zmbF-}>}4<)>`FEs8e6zTYi)m|rfD#atnq419Tx*D*0&Ec;1)3D0nq}cV8wKNE}Zm7 zsN(LC$d(C;2rs#_yEhsl_YRS*>vI&j_`(bUbEay~ewz_bAO}Z`LSA901RC>27a}N9 z<6jsNuBEU(6!X7CdG2<)YrC-zh0Am}ujeHiD;Hh!$xVB(u zMby1G$7wwBp)V_p>gAc0{R6cAVk(y`M_Lza^63G_>HoqHm;{r?+3~47#$0vY*lb5Gr4%j#kdb-NsIPQA@>-npcgBR zT&c^%Z`QJBg)~DgE&p*iQvN3}D7z`tnFFybbo{%IJ0Sw2To(k(Fr|8VA)}4=rtu#a zg9hC#S`kqyDPSsS zX|}iwdNb2K7<=AO<=??2$R$0HEkH}6oVbf0m?K}!7s(OJ<3SMA-yOsiC4MGPrp!*gI^jza-*dWJc=+Y@%!(hj-BHY@>Y1^5){W9~&aFYFLeBFM6H zbX@U}Smi_!zD)DdLUbF?McDNmAm~z*{|ncSC3ag>N^Ke~-h9lW$RHOlgQq`IT#-~Z z8r1h)VM0OtdFDK#lz%Lp9R>_S>cR@uwCOb!^{Q+0PkX8~4VWY~*@JHYpz+fh>E#?Wa=?Rl-5#mAhdhoVLPDg<-HyndV82Yf(=7Ek<@ zu9kRYOD{>frnC62m07vIVtv!#XP1 zpzwc^?&G7@UBMEhW0j{-c5$iX%WEF$%&5890w->Wg;}N?riZeA$OObeC0jyWvnS@_ z(bBnGyLmMA&4!7I7-EO7sBGtgnJO3yM(rr{QK$8eUMT0_G7&|=aiYd*>0wJKk!GSj z;x3VVTtLUqmQMlBl9bPXUAcNv-*hkb@GHdwNp8GspEf&p55_#sQoIfmJh*ez@bcl$e^zVen28QSH|QsIqd-$X^iK*g*g5W)RY`&T&iOlLuBy} zNte}3671+tUDNu;3?0DG-O>@s-V*wx=W}yCXXelvWOTI3*DBWdkaqkr0z;?0(y36j z^@|fgF(apU9%@;NxE0I;=7Pi{9P-^l<^l)N8*U?i3w{n+EUzuTQ&d9KCj95-O5htS zC;oLj^1;A`P-x!AeF0Di0!fkcxfQRDh;MI59`9aHy-g+lC#r7ZR91dGmBBgYL5wk< zzRFY$bq4OAX?Cy}+_p#x0Q%Y5+GNZMveKAVBix2XA4aeThvL{H%dT*_4kS!@@F^!q z6$XVffuyN@uyPXzV&BX>T@}5v5>g1f!It_7EI707(TKNXWROaEil1O6qCh%$zk{-| z9O<-%aO#(jhb%9lkRv}*CX^-nUbKf{mp1JMEthS2Nn05Rt^q;V5!Etibrbs$bQy_= zGbZa^T%|87j>nXCf#9fSPZ}02XHJ2soI_lJ!l~eewU3c3k|u>SEEQe?J&q+p(6G}D zoc5`t1^F#)QY9 z?>DrVVR6S&00FltRAJgPVP-YQ+`}dQGjW_x(${C|Vkcz!rka&yc{^TjWG6U>=QbT4 z|4^P#hv`Gw@l}5m0nMJWrmkQn1{c|I+yIVrTwvDWl7a(|1`}BrET394M~_nZ^|Bwg z4n#Nb2%&Vjbo)}J4_GP$8$CHjTwOP-OqGdZ&^9?Pmo^aelp;v~EN^S!UGv>CE^45_ zR@!f`Y>~YRrr}0g9rNrjvL5E@t&rqXY{W;dX9=UC*>LT$K3(u@z?iqcOe-CxiC)qa zHc=?qD>l;NY}k$!*AJ&CPTwW2kjo?958Gg@VxU~Bhp!O%UPD{wR54%VrwmjZ82eE^ zQY`kBGic&;$`ut216pHMMsxCSl3IeN!dGiytP6@YSL5-d1H5W$VZOGEpsZ^4Pd=_A zB4gcs3DrN;7@~CjKdutqH3fWQAnpV9ZiiXRFzU&0_G!FkvZz$`f)W85(DUuisX-P#!bv^1p_z#%0yv^^Px4evkocAhk;96v=9Eq;(0%o{IjDBBT$ z>VELq$-T80>^{l?_Msd*1aI^4w*n9}mDrSr4(oxm#q=0(3J ztP)xZ2Yp^n=WoZ?rZyC!wt^HOc1jE?;ADpE)57B=T8v0JDF$~mP3aR6VRY2JT6B(P zuHIdnSN@A_9|!Q2=7Dvn)+LU(hO&DscKwC3+)Km-!EM-qEfZQ!i>eOqLs~QdCyn&U z$&9)q6(=eGtP`RO2Mhad8>9my(}CxT^x4p;Z5mV;?kU}!30#Ds8bcFNwxf!BrF4c9 zmSN`F3JEc~RS%&v=96n#ey=;HPZ>#TIDm?*KG=yIjhFf2g#+(SU<83{&U;>2*awJ4 zG7Vj9kHreXNSalD?GNIhY%Ziadc79ukpWW~ZJ)j}RHR?=n=Hr(VXUURJcbjCN)n;8 zGP*hADsJ@DU*Y6MK~P&Sf})*jUQyzKkEV*%RJFhUNIdRCw5%}dUM?Z?l%^cUM$Nin zB*l>XYT+nf(?;p%bZzex;3AL^SQ32WZRSte?;C$Xp&3Ft9<{NHkN-hsgd6`r`rKwC99Ota2`uvx&7{K1PP*EIDn{!?#k|1PMk}|5>LtaV_Vx(4&%Up1XUjGIX zKmVDn;?@m~^&~iug&S8^YT8hFp6DRNV$m^o3NgRbYqhIQa}^{*>gG>$kl3r$pc|O8 zp8I4YZAjSsT_G;(a+Kf|0w*m6KerMSbqdRvwn&>eObrTq+lW0FN{-WqmU-khwSdr3K%(b=7pL^Qbc@Cx<@v);>VH)M`n>pUsB-;)9 z4kebf)gu3-@ch7J5^#GI5=$y8WFHg<4wrG2aTuTq<9BiePF32=Q3B(%%#O^!?F1?XWGd|=N1I^eas`!T)qs_ zzW*{>J8^|5T!-1d1y_tpPC%1atMyse_aKjYS3iGWu*XE%h<2iM&a(agqw1@I;_iZH zVPSE1cXxMNoWM4SRf>D_pAS{D=$3k3st`}XHHM| zOwR(0n*D$HHZLtQ#t9KOpK&SD1B%3HlKfj4Yj<2GSHz6{Eeh+t2eBgDZyDBng<|Er zgggq0w*2wU(3x`BR?Fv9it_#sbypf8ZE;6w4OBebd*y113^^=IO3KW0ncXKae=CBd zSSTwZK!{h5&)WLykuMtuce;#`j2}Gq$o=oC>3x+rWsw*LrE?~O)-@A;LkH_7*D6E( zZ-wuwaUbctkCQx@FQnCI{Ow6J#PW;2Kx`y?DhyjaWX7JXAG^kL^pmcd&U!e??3(&lU!HE;Km+6k{SCyE-T4f+AJgmqMdL@hRMlu*D?Kr2q-Pdsfj>9^-GE(A!h`$4zSwsai9kwVbQd6m9Whx z!YL(5xZu#l4Rhm=62{%Zx5vpRB;>J@DPSOcV}m1zpy?u!MJbz>9cHnBOsnFS?~>|W zT(ab@XHcEcREEasCXD!$S1$|p$2r-YgBZf<={R{Ijw_C4grtUyTDsZFx*_w9AC3t; zFZ9S+H2~FkLt5Q4cz!C|v4$)|=vb|6I>{R{FrDcCa?TeBt7V4so{G++dD9uyIBzWC zc_S3Vl)^RnIfEBziQ7=}di66V+=TSzu#M)QB)WbIFzrib7i^`>yi!49wJMl{PBNj* zqD%d`4Js}uUA8yZScOz=O_DRq_5Imjn#z7Bb3Fe=jp)8Dzn$L71hqX?ucgZ4Vmr2q zDpPi)^nvCuC_jMh?W3}WTb1lD2bp3>Cq2$se#w$OpbPqN+pR;qQy7#M`|!5zF)h9H zo#LHaE6*1rr%+7vchkqk4!p+yQZjT{?fW{`o5FHr>QOj6EJw6OD%w?q+M( zGfYIpnQ$e`7!escO8_imh{rQLri!1q7jS7>de^Dts-~?|t0vfGt`;sM^0Ny!^H}u* z#-S(q1h(Xng4Q1LAd29}7Tyg=mHB#j^RY9T$&;zKHWA~{h94gF$GrY51-iHqh=cOqK7WR#H(oSi1=SZHjvW+qGah8Z?2CTLNN3-eW@6sUqddU52**!y@O^BCeXfBs&hJ&U$u+t7JQNP z?WaGAa|zNrO{Fmm%6Qvq;ZtlXoSQ}b_Fl=HX;hzO94peycxqLfD1dH&eBCIIlEoaV;?MqjU6892A_6_WH#rtr*m!?$2lJcl)>t3BwBd$vk|FP39+I4|<6 z%*O~7$wWGNh{$FigE|j4D!41-JnNsKY%yIVK^9hZi zK>IbC2`~+6yVz0h21Go9)D`eEa55{}Fe$oOf;*?f~v~ zd%V*QieS0XJUIE;uJNr8KUsIIeB|dJ!_CJJ31XB;p3)Gba)pLnXVs#^lR%phbWfKI zyoXKD(&~n!FjFzb`+f^YKdWUC%Zn%82HRwligWbtt#XxkePb&(_|cA(dL@9dUZp+! zf1h1~wQ;&-c!}rv zpk)2#U-{Tu<^hhpx0nh|G(C^T=SN~`#O8_gpV7A7<@|ed2boR!trYK<85oK-5u%|GCGZbX|lnsPh*AS>c71%Hk zR>HQF2kHY-InUI)K(-^rn%^@`J!oZgS61zg@v@HBHFox#5w)^-C|qro)kP7%#gf}h zv{=^DrdZdYVRC*7JD*B{s&}|%=g2f2*c-Soxctd~|CamR@Z%x+!sk!dMJQk&hO<1Q ztC-i{SEyTo$kBPUb#MItBzL5=r+?14UkpD zyOqqq8C1&K3$v*bqfKx7x`=BOrcOd)hkB>&U8(PQ1GLH^uLT06@)c#eMx@s|@&LP2 z^el2w*u`mwxC_D{rwCCrhf$x_riBm&GOeTDvr7xjXT*fro zEv@v)fp=dG(NCP8)SJ^Z0Hw>=tmroaUH3+&PZ;{|pZLayP{gVeV=$N4j$EvYdpOWB zIN(g1!>6#l(#E2Wd5Sj5SLqWbLOzMK+)=|irpKTPcG!amndU@+WB_7@#&Xu&RTu(%hAWwdPHpT!b!4N$%$O?<12=t?lJOus^4!ZsJTMR z%>2HLg^fP=V=J9_rRpnYC%c~Y?Gz@R_x5pZ-+P?G_M03G>r(2`Bbnkp7+Z}1BF(P- z$p|tx^?^mV1+IUC4r2Y`tp7yMzBK+@?y~O~EV$rmZJJ#=OI;mFND?_Ck2KR>|HelC zcoo)Wh!g5YUZKj)=gR&W@sA&c6&r6(>u&5L-AGrTa)8$@O=2X1o$sO8uhh1aE}eM! z*)M&Q0t3A?lQy5YhpHmq1`t=mIGZ@*CY28XKtlK&v){)zeB<0rtD6F?qs}I2lq4a= zK9K$2Dt=Ev&O3T-;YN-X_)v3C_aNf;TLgwjKM=htB{$Gx--Wi`V@@A_Y6n>hFP z>dL4je0`m3+wPlM7fKBNk{5K1mU5*)JeBR;U1@OxbcG#EK5T8nK2i|pnPg5C_q7f& zK*6Mc8}FAH8{wCLx>;j!$X8~(p>&4T*tP~R#*RQl1l!JoKBB*$@-J&s(yD z3&H-};U*29M==6dVOQ_%Us$4wTqmWRbp`SiK?V8@cd!41^_4oJ9fx`YH$f)8VyLe@ z@DN1))!`N6dRz=rLGz^T8e%4A14e0l+%*u7gY&-#C?CG+n1LW>#cCvU5|1np6KR6ROL8Sc2+wZLSBSla6tUGA6YjyZ&(L}_@ z$LGrs0eb(_fvOcdtrmfR#&w_9=0UF8XDI9C(-WqGEEE2a;I|M@g$DWNzWl3JUsR3_ zlnJn#tYynFnUoq^4}DIf>jGp#aOYlMM;k_ZH)L?8Ay%5v>t|9L4S5ZvemL3T2akFW zl@5+s!*0aOLHK>GUGG#>0PL5Y&u&-EN}E$3>MpouEF9#nHhe3XNy)S>uH|FAUJ3;;%m z+*6~xA!3nt($Js^&|^><_@p=gkaJ{>RhI<3KPtKtf!W0jv&tw>_)m)B4ye>{W<;ug zAf@&4Do-J@LkvyFNl->ql+#EWP3K67>AlHQS zN1zkb!rq1oqKpw*YR#LO@U0Muuyqm_%N~aB)p%A;QjIcJKa+VPnQ%z@?#B(4*}0a* zEaWSRp(TD7{h!{{cXCEF*B0OhYDQ_)!WzLLb;P6}Y-CRKaRYrnaEJd}AtkUz^tEP> zD9vvQd*KR$mVsNAwmL%Q4EAe*9`X z@cW=0w|HNWO3UwR}Pu5 z$0^F&=pn;cWrFxi_u)LQv7yl{^x$>VKt{d+|3j%5lDesUxFXmW_R zaU=~!thE*fiOB_*E|DXb!;pH?Nm9U_J$lIc3qsV!*>aoOKmPA8zdgsQxt=k)=RZ_( zJ#BmY{@rqfW#Ap}O4TC~v7YR2ssX-&xx0yuY7RfZ%>3YUD>$MjIiVvFIgA7jHGzJe_!ML*D3=U7GJp+&cX;c5EF`6~AqN~%BosxMYjRJy^f{0l=Ikr>+| zuFc65S_wKgbYmC5ov_x4J8OIkSq%K5oKx?@1qlw7n1~@#F1tSEz4uD^v!kgrq5^^i zqW*xjkKX&ul!i3nGiG3 zmx|#~cTxhiYQ=V(sG}4yp%tuYfall(R%)mv#L?ZH#9KM< zo0_@2jTOb$JQfpWR*Y63b2qeoSE5%s@33PVsc=XHgOOIla3e5#U4&}uVj6v>gHAT2 z6biB?5b692=4cMJ&r@6)AX38eo-G)~Q=42g=RAOxD6g%Xt#@QK<;=m}W&8F9s5*K) zlPFG(?zF=!kqw!#?(dr_3aIe`XBOw|evG4}vj2Lylar4j_gY++il87OgdZL%@#2o+pIIOX0ZQf{fBzgr zr2)Xhi+# zhz%t{OcEO_N8!wXY&=ginAS!HEYI1O&`!DY0?PGRhvCGJ+J2)xKHTifX(O9=X^*37 zQW@wtFR1XKgr|dWCE7VQD{@gB=~}3;j_mCA(sW|>4e_4Rad=P8Z1wq^z=*c97+!6) z7hj3wf^)`+IC7_`q=L_in{CIP^d1K>WU5wuM6IB|bfRhhj@k4*nyHgiyJrFoOiEJf z6Yq5Fvw&E00JBCpo^xgt&zn8|-TScIgP~R2e)J;2`hRy2No*N~&`aMoNHe0v7iNmF zPFycWx!IKR@}Q#5xM)Kt9=7RIYd()fL|@vrI+r_TX}wVqPZjHUYWsfosTNr`Mond?$BRwF5f=BQ34kanPF zFe0dUprhfUe%{EXyr1L$9z+||1ThP_8}3J!ZMq78r-36?%l8o#>v5dM_D!w*lA|Gr z9Dx|T-^8@uZ;AjPS%Tab+WT<^!fk{AUrbmKcgoj-fcV#n9w*I!LYPt}8ZkuV@<@x| z->^HK5prlGMhqq*B57SIuN8=nhazcI;xmB+nqJywNp|xZ<8Zo8Yj@7!p)gAg2eCt0 z>jyPy2F~CpE0Fn~^z`%%ZDvb&s9OhTDXKv@k`PeUn$Dkf!De4ZIjuGAuSL!~=X-%N zzP?DeD}3-BGd&ND(FA9egEf=F+@1pxn^uH`SE!c@Hudshh>0A3>ZZUb zgxE{ax}Zm&$jBL%o`e=uGmVKvNYKZK#l<6VKB5*y@&dxcweKd_=!WpqjJ@K*1Zzm< zMm|*v`eaJd86H@`_uYYO35fL^_vwG^cKpcERV`vICzwRr<&-(eV9QG+YG#|hjo{@Z z^q2H8i6$%-WPQz&HBmbJF;l(7?wX4)KSicAnck`Yn2r5q z*})+exVzs1R;iC=`Q2_FXun7+J zKl#CKn>+VdF5&zsIB*9I4Mnv9={)Tsm(McHHut+22H^;`&0?Y-LJ>~-I3IXXZ_AZS zm~pb8KgvLAJXYvoEx>Mx-#e2m8YD#Y7?-~`GR6xmZB>Srx~B;DF`r@Al68RzuWPul zOk71q4nz6M3S?K(?gzq|i;KWRwDrpzc_$LWDeK_XQ%Mx(_HkeOhP(HN+dkiah+bXh~Q`<>bwx#Y2c0)tSm;cdfL?$XpY?q3v!d zL2gP_H-@6Pv@0lBnLEWP8G*+ECFc2I0)W=k%(|!NU1;p{5`x0uOCi{ zwCD%8q)^!|*Qwd171?QKK+Ix&YJnC0odlQ?PfjTvr@slfS+WbG>vk6 z>!$C4qQf|2V+19%g%pn8_jnifT$d!&{NThw{6PXvy2l+}6bC>&F?f?k2 zLL0yxtC4%P)lyReFNxD2wT}I_3%xs2WJa zTzRb`jm85lPY+d%YC;}~ew?}U>prXi@?tx>>o; zo2=8IfF%wUGevdR#BsOrBO-dL`1okxbQTHu21@+%_X0={wWc&(R$2C*}dpi?)K0#`XXxozsHFiu@XHS{2+0@x>80ezS80T~q zmL+p?%{X>l&Le}YujhCX%~qwK(ehG8ZTzq@<-e=F{P(iI4GCI0mQ7{v&xl{*oy)Q! z3IO~aPWx^n-LJ6nG}o@Go{$5@TT+cD2Z<)oWPrld&S~Me&Y7E0UQ&mMzXH@s#1iFf zr+k`GGVsKhwMJI2)fmR+;t9{fmHQAj5G+EoWE}L+{tXrILw;PW^+$*?dyJk={==Xf zUz%m$M;&HeWJs%zJmR67o3>)c=3QOj^GGgnJfn{SKNGh*u4L;(gx&2SeJsU&?NVuF zSU`iaX~kexViLKb(o0IQ)Qf<@@P0g}Q_3;R4I_Y^&aF)x_xev+ zqlBjxPiIWVq}b6Un4XGqx7Yi$NmVgP8L>(>g}nfm<&ww^hlf!~f$zA+oYk2x9a#=( zbrB0loe7IT!nR%Ke%J*UPAyGOI_W5KyOue?KgM zVYMM+jp96j$r`SNXjP0OMe(O`;>yXkY?A>5TfdK^`74a2No1~^VMV7X0(O}of4XKi z@re11_&&P&9CKCqjPVBFC2nlXd(Pf(Q3de`U=H6+qA$SJY&HSb#Mehd8P5f1NHhv& zwdl;)geB$3&!?v&#~VKYTkHi)e&=Quy@#)2Kbj%Q{b0mrx(NK(BG8LErBAfl#&zUE z?$w_Cd|H-TFF-8=M@9D$?&l2_96ai6c###jN>}o4(A%e@x?;7ANb|1~wkRGr-N2xI z9})Bvpr&;cvU@0NLM={2sRv^#rZk-r*{TfOO_CImjVv3LlC4KKIs+;a1ZfKnE-WW? zP^oEEgDoJQpBRDsS9tW;td?%A1^P^&tUQpft3Jc>QDRh587q`7JW!iYIW$k15mO?S ziOTU>&DFvB>&x%&M}Dl8TtLe|2kagl1K%q2(JuB2_a#Wp*Z?#8wi&P}EYSmsrx&P) zO3$$;riJWDq$bX^(O}QAjF>IAbRZrf3;XUTFw?dZFr}hZ$@}LWl%O=mMsP|kq%cYg z=@qn(!>P#&dOhz0v~C0@z`X$l5)kzW*#>V;4}sL0CX3 zjM+=kq{(N9@@Oq_{|g}gZrXfWlqNT32j*WX8AePegpGLo}?2o}=$WqF!D+C;xuJZld;M+UZH&Xy8nbt(p+O zk}-OZ51t!m`TBq9z~#%D+Tm|I2e`(R@pe?UMJ3H|Qpje4pyPIsoW88n>xrbz;}J@UzfVT@lv*Bpye ztFs^_&?(Dt0V^dbP(?hcyxE4%Tae5P@FUQfa9GG6_7JkuVL0`u^2CP+$iG9rCb;r- zUe*EG$z~tz%>~8@L$Ve>9AT3!m=}}}Y@M@2L-15O4^~hW(7H`frSyJ5hiuScT)QM_ zZ5KLZZ4_GXd-L*ST#k2QQNnAR}MjUW4x z6}@eUJ1fPwZGl6asnw(PwddeHx=Hkfblbw#hlcSv3aMF}N19aja3`CX`95FJRAwkh z_)xBs@&|xg0F#rfaw3oQkpfzDC&cSFU%gRKM@=|SNc>Yf_c(5~UXIACoy4yOVjq?X zV`nbn<{}ssjrSlNDK%d=X(?{S#~a;|ycFzbM{}cqrkm|j>0MJWDhHm3XAG@7FSehC z{m5mY5h){hy%bio=BjX^bkC4z9`SfmrCckN7pcTsFxh=QH~7-GY#&z0Q6dccZ+O8q z2lip(|8YUp&lgrPlJr4(J#CbG$za$9Gj796WhZ|mGs@Q@_Mq{Q8Q4iW`-neZJO5t& zc8c|f@%q1;?4t0Ncg(YGZ!!;`RalY%HF$H|=V82f_F(*jl4q)cO-lpwYZ)-p(1hxi`*dkz`xH#mo9A*ZjISL=h_ohMI zY596=S;YkPAGkwCq32W@cst$3r&bIkz38&=Z(1L2eL-EL5Z)Izyz=w$!Db;tAS>cZ zk18>dg~noAN5Tm`oa7IlHp#z^VinB1wYpjwgxR0J0Zqq4eYwz^Lvi({*3_4_ zi;hW}d$#;2nH#oZ0yg5>O&YeJEvBxDOI>BLE2FHpnKIx|%#FKqc?zyak#67_2-^#@p6oWOa3AfvJ)gdF+bx8JYy8aNo4 z@04j8{vvGt?*GZGKJJbw!RpTPwlDqU8JbM?&X4Tw6!0Wcg72hE2A?b^#1&Oex{~az z2ZnpQd@QF9`LR;`%8bH;DEy1qqq_X3E#OuZooeiDu6;8>f=9Tw5w@%>91gx|rj7ap zn_5aQtJ7ZiBPr>u^6b9x!R~~O*>{RJtH|!Z)cdn~wCjF;PM|^EoeKvVLxA%xABZDA zJ~4SPxe$zEjsvG$xJzggtH^M#;*k|FT_RVNUDeMZ_3zwLHfvTa8#n`SAiTt-8uJ!i{=Q;?!W#A50Y9T>h8X;hKK2WuU zUXtHcp^O9X?lS}aJ=k8~ZuS<_ivr0L4QM2EtpL-!+g%0TYQmO>UjP`sK0ZI!KK*+y zv9ZDhs`(Mqiw-*4Fe0YQK**K3%e4!Yu1rAof?ZT|W3)O7IoA6LtN z7lVZ*pJ5^cbSN11>b6_0=dsuzA!+7L%%?NyWS3AaCL$&u&I!6w@?Rk0uW(xq1?8=M zkh36Xt1Jor80SrqeY^;wgTQxoy${If3FI69AONvO>BGZ7A?y-WCMKRURz_a9P{mw6 zdDaX*_>fzM()69Nf#cQ#(=XCGlP-(u(La`2&#qpdFOmX~316qE6g1QY>-c=+GDWqm z@TOY*2$vl!aCiw9e8yNmx+aFl!yK?qQSizb?>W7uZ7i+nR_jvg@PgDEL4p@%#b@0Z z=8!|fAMmgplgG>W&gbmgLd{av1Ly@gcB*cL8Q15XO)PSHiG>@n_61PI_P3MsyJkQBI9zXUzg1 z3^Hp$^Eh&L@St+*HY^|D_w(NCMy0wCIuS)=5Uhg$o z=_aAd+m(KHGcH&Z`Bxzk!qV^QE$(Jdmj~bqo zb2E^Gm|ez9=EDjYYl3MtG~ulQ$%LVuWPSpBW2?dc^524hVDUs-@Z~z^oi{t6hWC4i zDk|q0JgAsoBM4<2`Imf^k`=DwSZRJwA#5QdLU=S*oLtJ>GoI%kys95XoEx9KZbOAn zT?#+ElctK$jX^(oU3jRbDCpN;sJImfdxBtrYxe_CO;p;QHHuigYD!8#am^rIWJFkxyO{Ue@z?Sg;l3@>9K=Tp#G_;%~fJ&l(*Go zFTRK+3@jHuZlJLY;SZR_Y@XQIGRFAS5d-RrR$NV8ITWXG{cBYmgPLHSBF)i+{1Y>X zeg}uA;iN=r4Q4`*ua56USNg!I=2Xa^e!3cjntI5`jS zaqOQLs?&5G%2d>y5ytIkIVA9y>vbL1$LFl65hcjP-|hfYF0qnd7*dG$2jNhYV}iO~ z(hz^W7M8Aj|2HHyv*G8tpSX8&P%TNLtFp%$PX}gK8Q=ZwZkQXQz>JdMVCLF)hHT>D zj7>j|N6MiDu#;qOV7&X~a_6mi(v7ehkGv0Pn7KQ=y#ib~J`GIK%wqz(5Axk23HfRE zUY+D6oT;=pW9jI+JDE^NK`01EEF%x;@QjvfRx(*z<9I@5yFI?_@ZltiRVhfDGEt*l zt5rx`h98|T&Qh?{51Gq6C?ve>5o1d*h|D$eY9sA9YqFfqnsT&+6-SwzaY43$zGt}_ zG!<{Xv!P|}u+FZ=O9KVNO+ZxCFMB>=v4qd|(dRMwQ%3xY9E6xd_6-?2>ot?nyUpz` zru6yHw)##Wu|RaK4m*Qci;3{N8RH>l1s^;~J6kvJOl0NscYtob7_!ZSF(9p>9gI-n zIz3yHK!8u92?kDu(zl^IV}61!E#Z<*K5BdFCX19oK}4SAXG#IKAs6js8R3qM0_7ZT zS5*{{pvriN`&^_$WCt!JSiiK;T<>zu&#p3&Z(;_B_0+$ref&{0ROVF5eNyxljW0|V zoND$Kv2DeEQI*uCm!hcdKg^1D5fFn)&(hAVELEXU33$(0U-Hg`hjEN!&ljPzJo@oB+?z;9K@o=XTTNNIQ^XxB++>;Zk-W+l3taH z27r4(SP;e$d$nT))xgTL`R}v8X-vDD{w^_Z6S{7XGa_nu=gd1z6~cP0kGFta;yv46!ILg$5ilT4r?u zdEwbhwaqGx_Rob`6o5aXOns_=sb85rIlu$4pZ0g3_|UxA8L;`P=(sY8T{T>Wo_j2} znyM0)CAmz9H4F$BuwZY)hsj}jL*jQ|4=jmTVDtos*b_~9N97oF)Mrf66Y z{Lt=)D&I1LJ(X_5S(n-6-0?}fnS-e6s71OFRJTbxe(xu;M$%-m-5}b9th;GqpQ7A|9@6+-}A*`aCM&Wh+>1H<|W~gVx zo|>8l$C02wo{5U{MM+csE?m=e7n{z9iY1%thm(*KC<29s*UcaJO2GO{XlVuNJ`x6a z5!95sqj7mY49(Qf>V3DZ0wPi$<%|Uo-PM@zOeSASk0#?t<`ybUg!&cwD@Js&+!7&V zWFaIjOhU9pS()YCjoch)6~~K_Lq6I&S)%BOYv95)pw-tKfF$ei76*Lw(OUuUjxX z>4u$vCzdzS0<8pZ9ldwY-opyS`peW2*EaW8cf>C@;($i52$GD?<^ehJvp^~s2Vukr zTj)%ho|=VY_RyhGk&dol1A-r$sK+Jw!Jy&LMoS^HLPaKj>1wngGO{Gas+#g&%(14O z??17LG7!_=gugz}e&3zKV#Q@>jpWKMCo{ZUgnTp`l;g%LHq*G)SB3E{9w|gT^)QA8 ze;VX)%}ug5=8II%U)8#mXBjM0+d!CGBg0PM=BvGk7s>F0x?2%`Hn>GDGvP`S*Nqbq(4y&aWhoN{HU zOpHRE>^fDq*DPZcog57+i9E-33+w$v=**q2?=&K2Y_!4xs3n0f0IO?)1hj6U4P&kN z?rVuF0|ZU;YgpHP*}LNSfss}Fih7EnHn^iTh*MVf_4>^;9^fpvl&l z=pvF(Zr2#%C$&Jb#VoaDvG^v`QGzIy9ff{WW-n*Gp2RoDuRN zSqP~qihR1+12ZQg_xhb}rapFm0 zgEMYUsl&``r^DZm)dux>%4h9{vn}4Qu+jB3$(ja5opw_a6MLM7<1_3?v&K>EIv?Y` zB_o*nE|h%DXuZ(qduc%RBZ78udcAz2z`vuh#@t=?hKUNtW8lPE5TUj6iI&BfWh%Uwk{B=s-72IaGpTJ8~K-kKWI2JG@TA*@iJCp6ZSYWrbRt>x zoY+Of)r%$0Hc)dm2}vD&-__xMl?DMZuPkQ*zzu}+WL1w$hc9zbwY+}NgJU;grI-5k z0k)G@5srNn)QKHcP6IzS?Sa=I!y9)Q;3voG-jGX55Z#0W*H!8*`#vTt{25tz1VK|7 zixZb8-O>}7e}s3Yzw6Zu$%UJQbG4$-Z_Q!J)`7f3$t2rVNT=(8zm8FgoUjucUOn4% zlu=BDQR??AXc<8K)WoDeMl32C67*!4a{HkPaCl?3&sUyh;sh-5DE9grBFZa}56Jqb z%PEdB^YVB-{PewH6(l>Wr44LzxnmyZa|D|s)gt63;GthRh38Y{B7}fNTs+f4_0etnh|hpMuLzalDRe@2HfoR?KuRnA`4T9(S!rHJpW)?|)t4fpCl@d9RcVpZswqKGj5DoDsKXAi~a zXP%EB3a5s4q^#6!3xd*khGBC5-0W#l&o^AJ%IkGkAJ3^wnspSQr54EQ1ep$J(nTG% zIZZxIR>TOC>?H$^hHQfqC2A;noxFX8nnrs>*^{-X4kxc{<8m=xRh>f?+#04@sKrUO zb%60ptG8gnK#eg0Mx@dpcUf!E;7cE3!z!A+n#g0M5-=h1NewYPI1$giOlvQbMF2l0 zZfwFK)F2zt&4pq-*Biy5495+BTLg`%+=4=H)q5xE7m7; zXS|wIY!!m-r149@l}++O$X>9>8&4iaCR09YRn7ut|C3}2oL!_6RrGBGv=`RNsQdUT z^AB$QNGedej<~pm=2OIZ5D>C?_TA^E7ugilo=(0|zqC-Fx=v6$QHEk$jgbd4t--@H z1q)N3PU=d(Tq)tEGl(AGIDd1|a`}_isgvy}DHQ&^i7^4+PWOKBU&pR7_7?~a2>46H zHNV!5iNHC-jwwOXL8t;adjPqn3xZ9j)_$L2YncPYA{S8hWEE?T!B7%kkU=dh&PqB% zjkf~l$80FAKR{Q8&vUXx(CazJTLig{Z%kaQyYTCAsx$1%*U;S8b(hy!9r}PfG4c}b zl9!aKoKR8j^hA>TNbaRWbeHGeIO0tix%pzSI7(jwZC*DD)4XN1c1(Z0+gYr& zKO)v#WIjbzD_Q2C%qD;K!*4ZWZ|i_-ER)M^?TE;KIU_CH3NZD6u81Y6?I?LjEGmF+ z{-WtewYHs@j~o4XL<(0$$!x`>%SHV}Rnn6CIZv%BR#7(wO1W5$C`;$wuasTvo=vg(_HJK5|>C84Qa*J$5Z5oEO3dc2TUxf@cLN8NSNV zaJ&RDI*9{}JR1W^M~fK|EWXJtAu-iJO%1BHqLruC4~ML!evW`<33ss^#0N%YJ}2~y zxL!dXs7Z+(24skng3i=USwb}}5nL+$+v-`iDeDkRANoI;sZd<$8VvW`*@z;4n6B=p zW{>wc1@{s7_!|cl{{b)KZ{pniTneL;<_|za9|qTTE!q(q_9tN?0p>e&PaSep6DDc< zeD_|ntUZDuts;L4%H2B-IkN4EINd{ax&+FNf*1;_cYFR_K{=U)L+-G35y6Q%@sg@v z>Xtc%U~E(mLjX~;y3Yuo2@Dr$5#`vz6 zg`AEFJMT*a^l2a_2o7Cl1P2<+{Po7vN-Ql#5oIOFBVI}Lc6V3bm`|R>q9NA5AFs_} zTjaaQ0e^9D-GW6%kI0crOJV!%0aV|En`p7UYBI043cV|Z6t2ZP%JDM&ygmr`gfBPc z`@Pc(kuTDNml2cLPa&+^Q%f6Ihr8HSDL5OLWeUR{&*^J?GeU2j2OZ5WJhZN}xf&i6 zLD+DQBk6ii_an(6@;`0~w%rr2SNI$51JTDu7LpKYVd$mP#ghg7zoD5Y017q%;|-*r zm;ck*b?=#V{Y`{d#I~9g?I@-IVh`_z;HH{CC}5}X3+I?!tEbIgUkUH503-RH>z)AU zor@<&`aHPRnQcF9s4Ml;z<~Ouo3ax|ELnxSRQ&*L;8!*Y&XjCH_Cx`j(X+gW4VF^k zcXCaSW#feMu)l`9#?E0xPmF)bi?`jJgOA;3jg24Zx!w7$N}r}iO>;HZ8|uDRr_>*J z$z^h&H?+bg_LA*fD3LFc7BloK1+j1kk^dApH4y-rT^$`YvM; z{E69s_FD&4%V#Ti;mVF_B+sqPeK>g60^?9hzvB*dA-B7OWetqU%U-5$fEC^ap$ruS zPM%%35?82s`52!t$&OMtXli zHmX)7RVlD7h}Lk{Gn&nq$jA}aen+)`WvHJGCEv3Ah*SO?rjHQy>eqvi@pA=@>McNJ=VIuLG@o>BGdPB8pU)i0K7rYWi;#dkBg5?>`4Bu63>ee zsMO>|7Hkyu*LzHP34j{)l3uMdbmuy^(}c}4ld~k`|NG*;nbnhNjU3J20H|dJln^dy z-fB6K4Zz?-J3;h+fMddBh;C`Jvr&%GPmBX2jN~Jc=X_ul(+&r%zYU>HWrJ{#@+9Cx zt{cfROZ^5@zF^l{+xSnwCdXVW#`~SQX`jwBhiG$Blb_gjqw6*W(1l*FR+HbcZ0m!>UI}qlpu@o^idF~UJogpm5s-FOR+aA|{xsj+xb-7OJ2aptY%28>O+dBnU%F@-AIk4_d>C?T^D}Ot$D<`axIO-F_QPX-g`k0DrwU=tu7aP}*e+D3WJ z=Y+?9FYo_gZ@q@4n%v{h!#vUk&)#02*cyt13*=6k+|P^Q|2+=AZ2f$D9Te_q;nR?Q zd;S#J4fe$wBT>YI4v!t3eY;Tj`38Ud3H7+xm0e+SOg3lsUNhC{v>5Gqa??&k^n*;V zKq9eWj_47(Q(sY6pAgoCY}~&j>!8;HLpGR@x%TM^`wf`~ zIq*>0COor5OpE4C{3X-SB5clRFkI!It<$d2m!*TYr}^)Hi+#LMhgOL#|19?hz413s zNpDRcBOO!QktbilftQDI*lY5ixz}izg894#ZzA8c9Url)^f@tO1MlX)hug5a!X3Pq zCL|rQ#GCm;yoRXD8kmVU&Bbkp6>Nr71X038l6#(F0p>#jYYmOj(nwdMzJ2=5#1=^8 z^wQpDf>Z5d>x>EzH=&Lm((Ie(dB45CcmLxT$Fc5fuDNFBjA?{^f{ZK@dVhro-S6jMZ0T?vB0#VgbT-mlOH1x%Po+^*==dim25o4N{C9Z2oM2tkMIFtey0((D`+zi z4K_kT*4yx{(1lX(@37Dp*fplMjNORZ--d(S zKQ#UL)=z`86>FO6m#$(v^FfQegJ97-FhT3?o^fT;0Jo!nIm)WPu}q=|T1A9tmQgEn z6|iWStEi_8t);XGU<{gjziVliYh@9sNogtbhK87-8dH=>MmgVACLr=BD#nAHH85b;e-Ya!Cg~Pq5}UoF zNl#Nxna5#4%T4+W?#RqtV6nZdgL=KuNB z1P}+MzyNU&3UtZFj|z=6K>g4l5gkiAXzU-Ef{EUN>v+c$s_tpVe21#f+Q(uRI)D2v zY(&4TX@GTKZ*-p>VY%N-IV4xg6!tSRvC6b=L~SigY;s)$!(+=gljBh)W3Yf18j%1v zj5(3{Jc84Thzrt6Qv<7<(gJ{I{0@JEjI3zMB^-JjN~lQt{sb8T{L+j?T8CS`NTa^K zW^3g(!W~r1NJE1`2Zu@{PxYCSSMxwC5r^{6y_v~lhT?35uD}Wmr+hfL=B!Ubr1eZ- zu20<;7NN^|lP{ThvE?X+xnSkYdUnv)3l;Y9hanS4vQg;FsnLBQmV6{Hp;E`18ZmP1 zy`>|lj+~yv-(AWPl#h8&!F>T5i@mb#1q5nc$$5thqRweqLn*2`BL)FPwU z+8A7WeYzCv&SbHtYaPc<@kX@2UPRqYK^d7~XHVT%VV2aC_-xZ7GjC;GDidi^_ez!I z=1XyozfXA>5u#B$wC##28PDzL{7sE1{rXj(m=JjpqPl?BdItx`sr2`r3d7Hjm+&S zZ4=m}l~OdpNy&aH5bTa1m;@DOy^LVArL&HH47JCEL*R_8@(|oJ_#jjeALNSKb)rb9 z@1Vz;8z=|1J0RHP@!NA4)eO;kuo@W!wFxr1h@7Dx?2}T#zttrm5!F=- zzIq`oG=Rt?dlqmFiQV%!1M_a|dG?S@zGnv?X0nX(UTttNw=GmbQ1G2xbV#@O1!)h)i|} z4$N7@W|WTp#*rbk+9E~|w^lMd#!9*|p~`rZmye&Cz}4e-I10*bgyYDf$C0Th_pSk15~Ody=gT2UyIVTPIRIdK#}$OE!Q0qN`{Jf@Jn7-5iH zBKtc!3f~mS!^K8q0D866C1`}XZj4+*uM2(ch6$`zCkp!`f;Z~E18$|m`>;z**G(4R zAd-*Eaek)W=nz3gq|okVAirJ5)*t=)=EDdsCj+Kw6ly>Hkqq^_)afak_w-pJEWu|u z@SGIUuL91a z1P7YnyUAw0wS4Ni{A?jX)Qv4KR8*;nLOa#%Sr~xG!6beB3+Y z%WXDjI5T9amkukeKy$1!gsy_{06#_8Arb*cGrhqqU}F@7rzz#Z!I>Dq#PJPbgE}JF zP%_6kn2|ACT@qiCJTZVu3hg{`3jwp?h{TmvlKeCeJQoGOCG%=WZT--B#*La04GXu;%F@8w()rlAA?axNN_qmr&J6 zvX!o%kHu;t7nrJc-=f;ZP1;j0&qua8jcXOo&mx(@9GgKXd~EW3xN%p^`-z4x<_FRX zJM_w~5$z$$@kZT4aLBiV4N^1CFw!WWDOEdCu$}pK#!9;Y!gjQ)<9v{e;77RQbO;K* z3```KP(8uqR(^s&JmB7-En~g8lCe#FJ)|4M3Qha8Kea9bjimt?cx3he&>b;gO8P1`3z;`DVwh5FTpcFdXQXJAR=ouDa0!Z?w>Kosuf_C}Wi zLm@@e*Wk|uO{=npDlix!Nz0f4M8@*Wk}>#wk_4E3yn;Nbr>q5$hH<`wkLyodA9fk$ zWT@cD)OrA(Cu9|}N|J1|+a7KUl8u-0Ok$6BAM-yw zC2v2Bbx^&ihfp%`L|((Vf_N_{_`!cd@a=X8&&N0}Tm#P+jRnaISD$~vnPm|Cdk=?^(W}Brlpc$zE zKr6s~2{XFuBIC~|zX|2H5z{jlL=YO8V7j(Q)Wb7V z`Oc+m515fzj@f4Vk?4P7WaSX%V1Csqgy=vC`3OT1C97|i_;R;rP?qpYU$~nOalK!9 z^Yn9RIqK02ekaC1$B?EJ%idaNu{lYYRL zrufIC;uM*oski~@+LI4O>0%X1-#K@OL`CN{<8m>`)ZPa|eA@ldTz-?ym%?iwi^63N zhaxpn7|j-2YmW6YQlt`;LY^rgVPQ4;0;EZ<3!&&ejdE@2paL7cNLkud#QLQz;OmjK z0yFYY+xwL6l+`Rzvki-D+M8u3Fuo zunNv06x}CA?T^0qN2#9n#QiyvW+o;yBhWwLMPkN+mkyAciEQqcV5uR9vv&;>^L{T@ z4GMkAvATJHf7Z_DV%n2Y|xkBx!%7AbSMOUta=D9SNn%60Wc_vCXQCn-!MWu_W_D^1|E%xaX37H$#JwM zXa^g3u)vkM;@Ga}(p6{#S3Ke6Mzl(6wdf#g7Kvfs|CNs(&4wuD%v7a&&E^@!+14o3 z#}T=K=&uwW%-9ninq$>_hO}R_Z|@uh&6vH?yYg=auPE5hAq+KJg?ir=b^PDM3VXUE zW|Xw|On;ea#@rC#*cn4)dSx=G+G5>P5{sYPwAnBmm#h55!B6+-2S+ln-U z%_Pq5Rss9Osth|D>_1{C*&zduG zaot%qtS7%kNd+Ay!U!jKY%Q8Okaz+Gx{GZfCXhOcunZq&l@#>BT471m%MU)o7yjlyrnZRg4Z24s+&b5Xy2YMpR+?pI)0{ zo+8Iy*YQH3nnR>UL|%A$(v>0Fr#~n8_Q_4@iXQkh&8~*jFPS<9DO?1BaYr?Tq%Kz_Txl!Wv^z z4A7i5ayJL=T(xPzbv@W1mFgi*n`pP}R2m?VvO$S6d>6JpbqhIQk`N zT>A{)qhK1#V*q)c@TYK6MJ;f5!#AAo-G>T(=!UHGLQCszr&naw(U-T_KCX7+($q%dP`KW$Ds?z+C*i}$dCf|?d#)r9V# z!Z)%Es^lZ7i@WVV#)$P`?##{Xq8|~ff(`D*wRcVgXm%>UT_BeAu{cvkkwz8}QRMLm zj3d@lxOzf-OmQv!YF*IHs~g{-y;k?85CciNVb?ec&-1y4@k%BKtp{dHC{rd!X7juo zIc-5~akQM{a@<2u?eC&c#n5WJZBi+rYj8|9c{_)TeGkFEeAUJxdr9ES?lOOn^imTC8?%_WAh#*#vK7|G0?uTbWBVc zsuV_P#N!M$LgsNSS3P5n4p67N!FB#Vp1OxnivDLU=)7EZx}k2uJ5I{kA%H+p$L1r! z+K*CsEPmUGtDi*s&S9CBbbR6-o#W%?fo@O$U{YXz!;a)ver;zFoipa&F zu!G@htF0Y$3Ct+2H0v*%%&NKM2d{W6Nf3J_4UC&MZuiAA+2sw>q;gJfZPWjVFV6~j z;n_idT0y~G0^Qy4feo9AICx&IHhQH~pN^d;9>R8(nc*&)KK|nRt)hK$QZ5Qfx4lKH zK|{cR<3gl_$mO>^Xd_)9vKzvnR#}o%n!t-d&^ZXJM^9M{IbAsHSB@(1DaKh~+2I^R zpF66ty@qhvN|L|lL~>h3(p+-R-cDNYB{=kE4Y2YEILOpaw0X6@vfw86p@RCv66GPb z!<#gegu``>E#0h5gy>s|x(;8GfwLn&OG$bm2cx_j%QtQ!FMTDelMoXj-?_ zi*WU$LEpV|WN>{X?X&DZQsxUr%X!p*S185Hn4>7LW$zj7)8Fzbm&q>iAV{Nxa1~^z zz6jz$vDYtyKwe-F*z7#`!Ugk=hxeRoOQ_17&>6G}G-fqh{x4ab-8V-2AQK)qoXbdS zqPX~~;t&DvZ&-Fa)DX6_pP%Ntrqc|>(#Totsregdp{Odo-k9-lo`ucbNnQYaA1V%yPeh?tBHv+vlJrYXKb?8deBrK`k}>FN&EdPApM}b zg79oOU4eN;y%jjh(g3CvIluZ7tbq4VmHu;{Wq8rR3f9=^8mQ0t!9gC?O1I^G8j2+2 zwoun+j=r(RV}?4?ylAB$Nt)_UDAuikVK`Xdq4;h@MJo|T`X$*)TH^rD*>vCh zrq;}lqHC?l^~)=J`d0qr*01v%*wc;1f_z(@UWqlkkc6g(6l8DGu11dkMk`k3nw*>3n z)XH!nMH>Ag`~uuQYt^CB-=+FMeoP&C@dgCulR#gQbBxfuL6;CWt*NiMi9T_A^Yv3- z95RO)$ zNU&x~=(|Oe&_Mm#5i08VqO*Rh;%CJzn?sq*mk#+V-B*isk%w6e({_B zK9NKf^zBl}oV=s9x+*Fiv}Xv6_w~YVa$zAr6U6^Rrvw2z)5am8o&?0qTR@rz??crf zs;y4#DEh|d0E5maVzE?)Bcz&>Rq$785U&;eaL1ZE2Zc^=*RE`LF*n6XlwMhAJ<~}b ztmE$QD#5kt8|-;dayk4#z5V#d2)0t{UqJTIOWH;}4IW~Y)y`}lSSyvb=%cF@)OpPj zOJ~L-pNN@EZ2g(LX@I{wln{^c7#F{+!E+1GqBJGcsAF*EfWq((ChJC7@N89~olhOk zS3mZ&$uw3nBBn7^qJH1NL;S!?#;K=GMCzhy^F|4+H8{2go%Y$;nE-swez-8itPApG z4s_!=<0m*P6nF)0VMcPNZ>P$afD*^Q<&DS7%q3R8dJOLEKW3ISlH`>R`ev~})AC=A z4wkSMv|HG+rayI{l)N(*#?{QfWP&!m+|2Doze4Gdhe!ozN;nsI}t9m2I zMDBAAn|b$uLSXG-1kd6?YlCk8qIc2}y#gls3O<)t4~1>B)Zw|dKiiM1>B50DT+CF` zSAJJHMnuv~=*(rm>ywzrBFhS4^>s6-kvP&@?SttrFQ`e%!EJVW0a;(2r{$l|otf}v zi$q7?_4<@OffWu!gZ6$zYS?2WEAns^_KgZKbue6=TeVv_1L!bFryU)GlQqU2I1~ap z(-?H%kEdf8qMX-Aab=u5jY(euNOg%?=>uZ-c@>o@Aoq(~R0&m%@vI00*K?(@XeisN z1{Ulj=1vEp**unuR(m$-ooR~SXa6=IuA;2aEEFSdb6PEeOmp|R{nE=HS@10cX&`Tz zXu~L%MB)rF(?<;U+*yCsQpI@+s%|)>IWc@dwoH;VPL!eJZj5}8!%jpN0gu+`GP)_) z$LWHR4kcsFzfU1+zq04KbCJ!MCcZ~)t#2hP)=3W`fzN9*ndHK|4&F*^O8DQwzpYT= zItCYR1M9!?A~RJbn;d$b*T~I_TMO0Olab*jb^>-bkJtKNbR|0ImxVGBAX>@Brwy={ zkgctIDyWvqoV*P}DBXUDBx_)BqB*ohXlQlj_?R!4I~*8y#}tN(5^SY7V!4J(YD1*7an?aoOxUe8gstvBK1SGHi|964uv<;CaoAg3N(R4Z9`S*XdEWa2j600+tKc==M#)JmmTF~nm=#7yI{9oUbU`(*^pU-e{z zaZnLIM4KR3t0}IK)QE>rR%lP+^Q`hg9ICUn$VG04bS?QTOGs@>V~m~;)&PNYJtrl6 ziXnB9qOhh`)^aQio+i$yvFE#6+?cWsUiC6|E@t^xvh^OGGwHO+x}h?5^z|XZAtb8$ z=pHZ)uuWKHn1ie9y3S5jek3G(Td9V z`43G77%r87Ui5v7{=e7RU55mNVpyP?FgtBu7rTClHN2ZY7loq#r zW-UjuObEt2M9p%pQ<8WOUT7C z7+yG{aDZUKkHZ6Qm5bK9Dd_(zFRO4OdM5j+3_)~?W>vI`&3o6i4FE`yURZXpjtNA@XhjP`weu4zE6_MnLlw)ev<{ zn(5glir9Eg`xk}ET@vL8ZZ_T`tNg3L2G+{V4cX7qdU~vUxs1X81O;?{r zrYc~GisAu@Wq4!1HGnxHVR^^lCi}`#BUXDEbAzjt4zmR?^g=Rc0N6>gFWpzEdK}swvgMODGR?~j53Nw@7Lq59e^6TUzK2Kqn!pn}$e~&2;K0v`iw-Ye& zR^vDY(E^AoWyjl#`0%VY_@vJ(^l`h1~|jlls{*EvG~(0`J##L#ZKgUaH3|L3!W zP5{pMr)WQWUwLHZfHpYH<-V;{O|KwPaWkY-tV==#&WQq53fB&!AM_sK~ZESP0;c>Q8;==6mBZvw<@biLe0*v6@e;jC_NG zjd~!B30gd;^*xUmr)ydrEf__>3QmBL+VU`ygSq6u91R`;IR|@iP$M9Yz%NMc5q6o! z-CX5ALk`wMq1_Lc>Bw*2XuVISlg=+_r_yT>cL?{?4$dB$k|_#OB<5~GNTkL^>GMNK z*d|OI*+~CXuVf!fo_GzbY^G%gD{8wYBP;{DM=s(Kx^w8WAdBrsetMJ2v@G+9B1|z< zdZG$n_m2x_V~@f_|44u^2JB(Ky1w!O=9A|8PCOMI8Q!ROpxE*P|Dc*MXg-d+Yz9$q z0i`r9LO}IV)jQ-B?KElOb%{3L+wrGo zOM{xEtGDQnoFj_7pWl?{uCGh6z@}!r8KhN=;pj&XOumtkpnBs#O?HU~H+n6@ZpoIo zNg<{Xm!ZW%!-k9Uk%C!kt;*}PQnotPUAPIJj_OAm_1qN=MAm{H*6uRYj%#t3(BdMV zr$GmwYpxPfKx=xE5+ucrirZUf5R%ilRi1#-c7B1EfpV6tzyBZdn*ci6c`G2Vd}IP* z0+`D_lM(;jNoXw|P9ste)`NS3YPcFozz_w!enu8SS-|e`(yNED`D*3%)z_(xJ-iC} zZeh*|7Vk!dVeEpKB1~KlUbE0HoTN|RE?f$jt_@rjO+S?mTP9$`1qMUkwY&5|k@h7- z5!7{AC{+`RO#)ED*?y?M>ZYx}@e%axWRP`-6@mTSY`{TT(nJOuOcCgLO_f(>!;l%Z z&2CPL`*98vk0PV9UPqlGP$FSwS(Sby1}k=93;mfgL(!#}y$MeNlOO?ybObLEpQf_& zM8*P%D$*v0x0y~_t`#aHV{sI2Y$;`S^e!&mcV~au)HteMoK?QcMDFdte%?Ki6TUJQ z3hEog*l595qY~CqLGc{3Eq76RYTDuVyI)o%OcR6qg^0L+lSrb^Wg3Q93I`EZHhC5y^mjOTe{cmKT7X+V2Cc`d6GNpV{-7&%Bvb5ue#| zqO+R)Ky}nPd2tX$9%}h)k^Au z!qxJ-wdXPC1_+bk;tx$z==}kefKLGaY}p)U(Q0ogesYA1Nc| zo+9mnqjA%<_!@qP={iJ`x)tY8!7Nk(u0|KE2A6;li_LJmrIu(|Y>N{AV1Ugm66~~_ zM)8w!5?@aNc>*D!#*FsGF8PI*3Bv-_xnOtceK8jHuFD|U6F4L6*mCR;Pr#3nXNDr| zIJc`4dI-8XlJP9is;;n-=cv&r8(_FvWoxl-8`|%n> zAo}ON<*n(%?S&pXqU*DR8qUffqCZpY{ChG!I_F?CSZ8ObxS@;u&{ffXAFPcn&e?tY%R?pHMixnj3+xraX#^f48WsiSo4nMnO8LPc(skG* zgBdpV)GZbRx7JZb7qGRaaD}!aIl{r)9TS+Pgy}tXx(~bvc~d8Kg^RTfJ2$p|I>#uE z5X0@@q~#qOq~%wXk87p=2~~28u)pU}eX6NgCe&?1ds9E&#oF@zxA)L?w|1sgAbb|Yz4z_A{av?y|1!{k1poM5`#MLD0$6m7bUS04>>AeexW4IYa zfiWj%TbeG^D4(K!z^230VN{OLlIWp+P?mDam5;&tsNe;~(Mm4wK8Jkqp-J|HzYkDf zP?d^;>Me*-s3(#UDY@NM805f%lFq7)50r2%f}ebXX~2r|^V$h0-w#JuSy8~&R5o-; z6ns+#g`a;$7@@=-sM1(qM+ybuZDDK(v^2>DH)*ysO3-5ho6v^Rwd3GTvo5 z^x6%29ciavbb{i7jT#6D>K!fj>CPz^2kR>V#r^P$;{G4Yt2Mz&WS|~f1uWEVb6-&r ze_;+XLgAL->SyIFDUg4VP?aRSX2gNO&`L%}$n#KXW5-2J%CHxu(8vUD)rw5ZvLBGh zyt#=sfl=H(*YvO;mn7W7J)u4zm`gz7yuhUxl}T21!6(K>69!oeL>w59$woWC;2nJy zitO-(*Ra2kXGE8N_yf$uJKv zYU%O@%Wb3;i(|9YAz8e`!X*w6bjJ$u0GyyHzY>H7H&#-MkT#;9Pu|Duocyil?CQ#B zQ@lsOtfrr_%k0lHp=n`8`$Op|gUh?#;Rex06w&U&M*GBPn~G}^{W&v3s*Y&T`p5!R zBZ0h>utK%#*x(K~o8H7iA!qS4jgJ;S8`%GngKINz@GKP{ziN9F{0ztaODQ0)QSI0P z&v8L3Zr%>SX#SU-m6zt~dsWZWlk^vG;lwUb;4i`i1fc_$Ginlnn|uTHy$qa&q8=3& zK8RKfr=dWSF%L(Aiu%(Qv1O6Iq$(<^LkJt(6j+$nluY14;@8ejpyt+&Na>KuL~xCI zmj3ta~86 z*l3;G|8#f(AmyhQvkm2&8^D3=^~2_w|L!+2w~z57I)BQY+p_|sci8ae5oNac1K~yJ z(vd)}d*2+Yx2Cr63Ym(PH8|S?OE4Ct&ByTp1Z0pm9ZpDiyrhZtdyK+^)T1X& zw-^y?zCkB~C&^ePWHH0g6P-g!nhv$2ghxmcS@@>b8W?^@`iqE6g?(;N$xWXXS*7-ic`7c3kT3$DKXAxY3dvD%K|N)R2NfXOw_K%C zjI9bXxk?RD$m%fMX0(bqacT>t!^7Zd85I?B6pN9;FIIbpc}mwc)#G`j3L%<`i7E%n zBbI;8N%s85sN{%IL83wivhh={5~xT&VbaZUAln4 z&$&ur5;w2`c5=tj4tS9@96xnvbeavEiLytGd2ykc+N8Jqm_0dje*XEG`pcM6=!&st ze+0cWiH8?$rqq}L^^@XxAuyB$|401v5!Z2w(?g{4!*meszaL z#rjFVe}F>GIW6^fH$Za$ZEY$I@oxKnZ2VMg9%d_P1zBt6+$ z|5I_RgO}e00^DKh$J)%>sZ>YE{o~YPtp&cH{>BC?MH=92@W0XpXtIHiX#bJ=xpN3D zSp8Kx*S@yRe$BJ@CSD>3RXJhxVaLAM-s?}xy&ix$&_QzB&DW7s$P>;z<*BKR9q%eQ z6w%rP==4vd8X#li8v(ra1ilX4-`WVsXe4w{>9jn0a}T&>n0`lfwo&uzif%Z+W%q!Y zOpm8AYQ&ies3HwFGHy()>ikcXF`&h;as(P(OufA`cKg@iU8>fT*LXG^lq< zPmvmHd42imeV^`&wem8F9y-O+H^ajpaDSeOnjFO5<>pzR9m)&=?1J_Bp?W|C@NclV zu>e0|lF^@SGL#BJ{`rna=H7A5j6FFHGoRX7cQ8?gy*s>wyqnGxF1Bl|ETu`$>fCZ^ zeW#sy6Quw?JnvVlyQM_68I5+UXnE?{vaW9L)sU9m29o>~yTQ*}p7Aw{ zs)@r0hS#y}yK2Z_(ya=I`O-x;O1$Zv4VDd=6+Dj6tzgBEL5Dm~R8Wh@Qej>f4(W(e!+<8BdV^%c0>efR3i2;zi zS-lvkSa=%vqD5T)cn<^pluajC z(q5_C$eyMv5Nt7v?Tn^l=&zR&eX6opA2^=$@IClA;f_+?f&xmoB zXx%HVf~>RbvvHU4?a5D@j67F%x5|i8f@SpCzHBKfI}A88ektn5GnTFuC}U?J-bRG` z;hC-EBML$=n*CLhY|jv?4U+%|C8Z@#Bn{*7>L z@3V`T?ewkF)}HTFwocYKgB9s!BXym`^;7GfEG8Ht8egE%axK;6zowpE#hQ6!FwRpq zkKL5hoX$vI*-t@j;LzqypdOm%c}Sg|wNcm{RTheSS1J@fYL(n#A$DS~VOXtGbJ{>b zIGsw9mBf<5?c=@ymCRnh%^N7x7^-B?Hkcn{C%W5$W;)4EYUsK3GB)SSREJo&YxVY` z+OBRk<%P%_2hXj}nKChs_Qr7+v3J%{eyllU{KD#cUeSA8250GjA*ffKYGwERSVDk6 zLFUMSVa2Vutztc)Y9&M3PByTH8QXQSi^|b&{`bS~mj~3@H?@Jr_JDpm`STS=k<(L_ zt#mwdC37n;jmN6(duNZ9c7b4Rxmy#~v&x{M=64RbhP$zP_Hl<9seuDto0aw(97r4p zUf)wG8*QA;@XolXva13hWbpGchKK1bKWo>|v&7B3WjzJsFtg|JD+vgT(lVDCR%M%~281vEs91*LaRDcts8Ay~*yf0F_0nPwPPZ2K}a`V247x zzx0RT;c--5YohTRsxVHX_bB$C;Z;~HnXfW_l}7mc^EtrcbigOx-Z3kaVY^K`_wVuGXt~)uj0_Uv9A8Gdqi+!e{4tP~g5 zdH?rQ02i4vK7)gnF^!4>oNGo{jPJuX{{eomz5mA}JIyqt-hi`}rmy^5NJ_8cA7}RI z>xA5YeeAuzPXBU+g@v^+Rtwz5G7XBI%8!C1w5%Iryi3rX{zcvcRO{;xyV?aG&x#Gp zN{u10R$&H^1t0J<=w}4oRSfqO&qiw!E9Ju|&flDZ7LE4Zwvc1-66-;i!`{O(wZ*S` z!)hwc7Nm6OUyqpfE>A}#xnZ~2L##r$7``#I7A6v~n^n7Kpr4}6_o>^vxcf@gg6Tez zMEy^|NYtWF8h*3!-$7mDxaFCL&z-p7KoS@t{3Mn=aMSqSHQHb~Bmfno;}{h$lenLd zcO6tBVIJtL zn4-uk>{dt*VPd&)hMzpIhsjo6sWL5FTAGRKSp;=Ki8JwGqzjmgXBb{9mqd^2c*QHv zNE3@%^|5_u_^n~!kuZpEL>#1!9_luuAN+Y@l(=q`8w;fz6-PkLxqoTFz_`WBX{#on zLKy3?%zn+9?9F9rAgCm=vHvu&n>+ZfheVIRfX2c_U<{-d0N&^UK2(-4T6>;jwaG4aVF?06mpVK1?$qtjOw5f zm{5hmo}JBVmV%?&^x@3jKF4m+xGhu)rPXD~Df5_?2xo|%xrM)n(z@8yVF zBq@f0taN)awIO$Aya6bCGh%zOT$Cg^2y*q1_?`BaC}RqEJr&Sq*KB0wLD!GWEO1Z& z%YqbE{i`eU@;{u)v{EXo_0ZuL^hM7&JZ~alrNm?I-!0w z&T@2KMMRgu>;x+t^}Xlwt0rW_?gqx{s&$l@>$ByVd_?`sIkEYu+@}JKdn2y6kWE3d z63P|{a!~y%j&RASSE4@JvORp6{G{pA5i121ABj0VAhPE5(QuU`^z8RzT5<{?BFa!* zAjO2X4K4_oSh6SXUKO4bQdi&JNpO-h>Y}M7l!C<|naVCO_eX55|!ve3#+O zuwW;Gx05LJIZ*#`_hZEw$oJ|Hw3c(G?NH_~#~o-b_Pso=Rsp93ChzCZ5k8@iax;*+ zm#h;G)D8N0OUw-pm^GNJ?~tAyU1yk_H^@{exQ;C9`3$SRguzRVz(_zu0SOf=Yi=@W z5KLqyE1=SmAWD|g(rS96jW7V)Vkc)lS%vi4cg9yU1ee@u{!xVthB!e#LZO$q(YrYN z16>1^Cw9CPs#j1F*zK({w42aG9fy*$R9mh*rXx8LPsAe6mMi8KN;fbk3AXOe3a$|d z4$Sa(GjU_G!1t6Cic+Yr6SSX99jRnM*9j!utrQcA<48oQXM>Sh@`|`zLbdOwS#fjR zJJO31VBm>#;nSeD!X}zZkfNil*vy8b`b;3_4nER|#!2&7(u(aa;%F)4p7(HKew!Xe zGgn;v75;~S?)>{k29!%ZW@YBDQr=N6b)CZnKQ3ZHdCkh<**9@sAI#q{i`ZnoMa5Gg z9HFYw^4Y}xzI&cH;$nH*ef8sz;?AevEm~DDluYWUH5Yae_6xmfrq(cZ<` zo%&88Ll_k|*CRAStAo9pCCQznQ+w^8Q0g~v0z6qusNthqGlqCGu#4cfWAEua(jFCh zwUNb%WlDl#D3}1b3Ko3UDkU@u1u@d_raL;vItRwt0I8EpXE41|UDJB-F|pC8?aQIz8*TB`-?zZE2qF%B5b0P@Syh9SHQ##oO9_xq_xqg3(U^=vi^mELdCc=AIf`JR%T zd&zY9V^Dl-zD%d97Xo1$C&FBENKMN@3jX%wU-cFIp-Zjur+CYv_+0I z6MhIeWU^HHs`6@a@q-5nl?zZfzBb+--I)%0E$XwdmgfR0AdNSKQ;Cxukm;h^sGM#rTwof7^s7)TR*-Eu0X(9m_s?uRJmswgCQV>4z}a+LbY<_2ZX#HyB# zAFD0+dt7`SQk|>Jdr?PoOq~@_jkY2sAuk>AH^^)i%Uus#L6yW2#+exAimuaT8sEPT z!jN%qxjU+s5p3v;^M9O`EY34j@@I+HFHW5;B#1{cxxinND_lCQ_MPP1Ezc~+x+siDknS(I-I=(YC!O4VF)I; zg+nO?#xRO-lZmAYjW;9f>Gn%kG>987r_cmyGR6@6138}aHDXW!;_EaG3J(pE4;quI z^j4ON$7_43t;+rqG!ZdXOa_*ngcFT)_0hmJs&@#QgpH79l@y4{sLiIlQjhkEi>fCe z3XS4%9TGqbwL;Zn95C190DaQIPq46_^)%O_`%`())xopRI-*SZ>MjRJq(`etoUuZm z5b!JdZD?DL?Lqni^TJ@V)^D6lzJn=o0(N4heD-&s^ons76^En7Nk&5G8+F}uql>_p z&I$sl+o-@8PWyGbo`tG`KF6Dga1V+J`CnN(?{{N*cIF7}q#ZF6;F*4Ltc1oV%Eup} zyVxlRD^;k_Y99CYt5e#?)%haHW+^&|0kv?YfCL!@N#AFU04o)AUz_QVwTOeGwG8#L zz{!_&D641bC+MNd4o!(sOek+6Oz|5A)}w%L{q`eByd75Cj|??2jq#X8e4 zP~qCHJLQ;*1N!`uDm|)bdb~h6nItW(0vNtz?$LqYORO%QN{0SD_y{=WQYcIZiEMaB zQq^9eJVC|?;lt=?uy2!=vxIpFf+E-AATboR36op8eSi%Q>jX5(fC$;dB9UX#HC+od1& z#HCM{9plf0SP*3FC3~-6ja4FGiNRlq4>Mit^1@enK1S z<%0pdY){6+n?Gv@j+el$>SzEfDTYp>mFIrnxtH(UkHQuvm2DKVj^TnKb04cB z#!G@4%5@D@XG_A&g!P%+Q${f&u;ovLcXvy7Bi*$@x=Xqnq@}xC;#*wTbHC61j`5E1{o~hS zt$iLjk2#MM?g71!DA8o+(D7V7ykDTNQ?-9)l#lm}^4}PqsNoB1XJoSCHij<*9Y=hH zfC7s|?TIJ&WqrXVm;@GX-3*MaiWCC#)IlBWOUwxOC#Lrs(Y`4rdvcU1JxmUNtiNU! z*arou&tGn`winf6bG3_7-jS1*qRl9-ENcRsu53E`~T3J%8kMecIJ1{QD69k zGg>Q@c8a=hnSlI7N_iDp#Mcsa&J`KcXFxcknwn@E*Je7o zKP)g%{FTaxR6BC=tnu3LO~Q}|QKw3DmTTMiZ`b@C`yC?c9pIfVdz|A|AShCUWmZlR zWl6?;_keW(9*q|X`ahXPB;$(4DJ1*6t4l0JLrB+gZ2!s_P zHDo`aoUnC=g&Hf9rhisfle8RR*HHM7n4b8VY^cZ-yM5+}idYW~-Q#4X`dd^z*xhh? z`GM5)d6CEayhL=aZKqk@`|iW@>8VipA<$6i69L}q2FWY8Xwq~;khj3Cw5C0)qDw=> zPtt~!!?gojWS8NoZ2kmjamunOd^N{|(TVrPB!&f5B>iC_CQ-2ft}{(5s;i z(};EVgy(|hJHRbXxF?NEQ5D`w-d-^HOy9I`9anpz{ zULC{Pa;pk)14k`}8I#`@f$k{wS66N&l&E-#r8)(d=CLmQduN=ro2O#SN-~;}R_r3s zeU&-FJDnlb25|q$@&4@lPcF)#@aNG-Ly1ebzo9w zKlmL{x1GCXf2cJn(nyw(xtBnY!D>%sZ23+6i4suhbVai(>XQK0ZFwEbrM;q4i1#!6 z`ps5p3;C~v#z|<=@*CP;h}Asc@Eo7)+4ZFhHqlCgMOcI7ulmnwb@kD;y1h9ieetp&!1z}YL2ZJPZuR{=bPN&)y21 z(^%=(Gq4IlCH5Ay2XJ?WBw0}RZMmB@BOzFHtiRu~u$viC-&`|>z0#WsHpJyzsU8Qr zW7#+0QZ=*48h%PBff`m%Rkv>&^A(>gYfhdgd@HY4F)lBa;n2#VTfL@NNO8C@E-c7k zPc4#gWi~LKrL>?|NRO?oX)SO3jU{87yI*zkR@u%>8M{^fs%OQnVMgiaWSse<<+V9W z+A^_eYg*a-Qt}ejw=D75)J*f)xBV(?@~Cp61WMH4VNsw*^(|F)68Ftl>`*W-MhTi& zioMZh8tIh%^l#IsPs6a5cFycMmVlq|*SEz`z-z1gZ=`t~SPU{eH(z>!;PKloOyJU#XJwb6FUY%vc`}IVC;OxVna!s$m z@u2~Y+l9F{Xa_|U|AK(mSA}-ovZxi;p;o&LBkMlZpG36~oj^LWINSDk8bvb~TPSgR z!H#nI2F>8bCr8y=(dTQ$;SY}P-~FjqBHLDmc5sbL&=jr~*d~kb2?ea|GX%YcD!hWD zxjs^rk>;QOf#0E1aCH2R?r1eXT7*zUjUQ*ND??(Xzh&3q%LN zHO%;yCKF?)b*5MRH2 z?m}fbj}z_a`ml1gNCr>slXFTc)3D~}*&p;{%wyY_3bl6KC4zrle;}z+Lo27ak z*R6!xnZ?y7t$7G67)3vu8`u4&dG*T_a}Tubo=C;l7ROIuE&0by`*Rggv|a#s_RcGF zBsAi@!d9U{$2py`OyDk*&DN90U;aqeO6s}#AeD8R_KJoFcmm}3vut#|k@&jMFT0r5 zib;!B&FPqq6;1mTG6pP7+&0?D3+>PF4-;F?tq0D+;eN*a5d47&+7ALt(F1>~$DT&s zSltG!n4($GK~-;q;pTMREw98K6KB>5z9DxR^h$ph{ce?A*S5O{;4t1d%ikT3CZ$)A zTGp%|zGd>LC2USMNkJJ0eZon5Ce zJ-bO97t{Uek}X|yQ8oW2E0PesUAB!}!h3rd9vXj{zJA{|tcgpN^7F!UK23*NzI7_U z=eLfk4xB74yRlPp?*7bkfR@xfJ(J(oq{v~E&zg!1{Vhdbd_Q|d<92R-Y|W_IoH4dR zDuOZ)axj8`kaO`8XHth$2E}}rp+M+U!rqQ9UH0PK@cy?OKYaH;HTK&S>_$Ja&^P+1 zpm!cqeXmauC}H(ohqOk8xrI>p1k`=dl-uc7L&IrhA)V@FvQgKezJcwV<6>}v>!em*f`s23_)AjBHtEh>iDGSeX*&Tpdc zFq9L>b7r#yr!ZHFw!Y&Y+)Z`tK`mwo57l@ZgSVGQDUkc_;hiuk$`+SzzL3FuOyn+6 zH9?Hi)n}csI{lC5gGil1X~!Xbu(Fwsv%h!JZ${O`nW9H9^XMmg2tVdG78o!ummxHM z)r5!?=rncU7}WOL(}ciNj(l9_eVx4C4tL&T9y7F;9l|b6g{47k>wXnHogd3ZC{0*M zOo68Thy7zLug#kN-l5of5O&t+d)a<+0m<@&vzP&2C{EuDktQ9n9T)mL%(Q<~cM!Au zZ+wtbI~>oGiaH&Gh=GC90IyYv zVx^Dl5^R-fQ3U6vkF#zW4NKOgnetwrJ#4;TQT^f7lCNMTyoo;0IUZng=)=|u@plmJ zh6{H6jQ`Yhh~-65g48X9HQm#!k0)mbpQ5&*cbB>`xHv~fR>jc|qp*Q638VeJ zOl=Y-)t=;!*&Lm(-y%wr(aqhu+qm3AS@m!*#|-cLXFbJ^UB%%SY?g zhk;Twoxd3;0*_lK55IoF*8=dW*gw%Tb(=i_s5C5G4<-gYhD4+xcsGW5sGHWqTW}+s;|TPX z_4Ol&b6A3iP5<=+rX9SI3T1d}e}aR!sxSH}vK*Y1iaO?I{wrmAvvduR3+i%F{wtna zm`Z)F@X!9_?3k1i0W`kk!+r$O_{RZ`yU4SO{pM@IID7^O+VpnfiSHn{A)!4>l)SxE z#E6Nen^MLxYyueF(7#a^*jttYE)Sjx{Jz@_c}*EzQrG*z$K!Y@6VQO|_-W^NNi>vx zZZM=&F@z}*+T`5PNx70pyONT4m*N5%`|2jrSG_b`p+tQ5scYP-cWc2LD*3Vdtnt*F zL(?pHI8NFPn?EK(JwA!GZ_f8njYx9P>XD|ux@Kq43*#nqt}EIdw)J?cp``<4a!RL2OJZnGZnHCrNRws+8;zzX90wvw4xGqX<&4AfIstkQ?Q6 z@B{fQ^~o?HR#BgaUO#%Pu9j-kjEAK2miXUX)~pFsSX@%=0PGAyhz#QFfE^|cmA$)< z;<{_|2B4Wd8Sp-XX3Gd%U1p_vk|1M0__}*a`Z%dJaO@|kk+b`5c>+rR4KDmiF zu8SD8i(drJIsq@OO+-_wkFrYrELVgS1v&k>cItQD4CJ58jY{FtOKVZFg9oT?%F6*E z;At4o!i@X(ZtVHaK2crz@x;r*7Twym$&6yZbWh)<5gEd&*d}u-+DbL$LdEB5dV)FA zffjX#{VhJ;rdC+?ek?=knvOVH$O-G7Km~G93#b2Vq)R&D!(5Hd4_mQYGH@8qp$c4a zbuoG2_v1O(cQ_w$6{L0YVyJb|5ScsG?n^%jIB9$?BzXTR^lw!A3;>t-v}AZcxpFi8 zINQucl1tA7$GxT5rE(uE))-! zby^eH2TS{<}}h|2fv>BSW`SI&lIy&p*ha9;g`bXRWyU>#q3{R8oNML zU)FhKC&kLHfI8L~8LLcyqu`{ffF0y7sKOTadV-e>@!W?-1!)4FGnZH9pelASi!=*~ z^&M$&<=$(#?J+93Y{Zs+Bn#iJ1xJ5DT7+?5MIkogwd$fbHB$Ea!Ii{6I+3hnHd6f| zHW_r?1+&-dkoRzf4Nj&iQLLP-d3V3D#6vsq#^HbacOeLyHpMVtpkQw#1StqKucf~G z?A9$$iX2EI1@=>_YRc8I!p>d~X2tU?HlfX6?IP>r6k|)gYHHmHXTTh0_w2P1x?8(=_N?6FV7 z%l46Y7yF*gVK#L!pWHJqJ%8A3kI*ik&lKrrlO7(oHbdDuFgW68;w6&Mn36$ zC-(PteN0su`FT&o^Ahz;aWFMTF1Ye$FL^{X)qJ@YCYMg3mn3$ z(jEH2ciE6MjAIZXw$O%T78zA|WXy5cw!(K)(FO^oD#y??h3u?}{7_VvGo_NHip=J@ zV)Drt7ExkFBl8!gv)>(OI%M@5!-!K;2iJh6ZE)pt3DWo(1>l$acMu^)^wgPx58u?< z$0-lsLeM^4WE$NcaCPFE+%aXpr=M{fVTX0i_aU)egavMAe@mwO$2h-4prnZ4?N?2X z_2KNJwvDlrg)J98q#CqGNtec^Uz_ojvsN+8PVo-OoH}CClIgX@IbWpYm*w~TslWD>h*F0>#N35`7h%HB~X+ga>9@?V&Y@CtxFwJT3f zR8c=4=QO?RhS7XA&x0q$;H-A2N+~D5y0pNDFYRR1ak1Y!RQ~m#18sk`xG)fqE9op? z9og=>?Ri7KC;v@(FO{a0Lxpv{j>`%u|$sB*2s6+MsXz5R(^}V1)RRKpX4&E>6#q^TK0aiPaH>y5g-TRhpT z!Og-r1Rted-7xyp>*Y_5--D1Ny^gAk@uVDEezd*%Jiu;m0%>A$f0~I zz9@-I*E#$!mw!6@AbKI@{Iyg>8Q9tYj4{?cDP=Uqo?fT2yV};&`)-2Lg z_eNOTJ;I#%mN|_Jqth1mP5)LYdR zG+T36GKzD&>1UnAMoY|Va~iL#+oQ@ux8Txbyqvg~0768LBcuR*aQlY9)~)_VV~xw- zn&F3-JgooKWppLPd3)r2)hu3abyP}F4~CxoPzqC_;Y$nB!2_4%nS`G^`6}#$#med@-d16ozec`oYIFa8EH;{RP9lu$wqpCOx|fJ({Cm z{XjqR&T;Do`Zucz-d3CQ=6tJ`bxd}QC~0N>U_ozPOpL2Fx8Jj2&P~4bxyK6IqH0Og zw0T$G%3|-g>3vOXtC(XWq!dzsP%N`ITcIZ7=($u`uI9ztshQGMkZjo|iBY~+mx0-% z{U>d@Jo#ap?=RCb*d%PtvKlL2o~0TBNf{s(D~AjfD7z`sp8<1>{{>uSb-U|gzo6;$ z!Sxy-HI~52by4ATm9%zD2r)2+xZkv?!NyGTCL`FXiuIQ>Z|r^5ac)x&>Y2vfqPi}I zNK7dtH1myPll98qn0M6Rx1Hi|h1qN?Su-AM6v@Iw(3wVtP{B`e?nh!#uxnTu^qQ;b zoylMmd>?>i&tp~xivz$&N*LN1|A z;#`YkD*zx`|MkP)J-a7*XRXIK<4HgZE@^slI;!Z`1bH?~+J=qag77K;Z*NFat9E92 z{FRi9o1i&SJ&CoJfY6QbMD_rGbdN_CPUwl{y0!6LkUzbzpoWzOeYX*5qTK2N!~$%J z`gDG$Uu|fj#g?SuSbO{{PO#xt>A>?ZGZx}D{`&x(yUXFare%b0$ynTouCQvXsk~5Z zIbPw@gfKqF#N<+_cAP2f@Y6_Olk6`Pn$of8jfNuCxXtKNLIjzY`O&O$M_^BD_!b#t z9a>lL`Z()_Q_o8PrlIKUJ-w}HrxD>R%93&gF`@q+8Q=*HmX3eo+W z1FJz~6n|u_Nd5Vjn@rG4Hula*l=l-&P2-5E7_+dj+Mrt|MfA{2%=a~k2R>85*^PW z#j08#Uh`oia0Yf*FCx%^0PTa+f_E_8@T}ksrB-u7n827YWuDJ$_i8F zWh(gAY=a=gTg(2WA%%;fu8wlsOxyAc6S%AaFjlRo#s$Vk_GBXGR|XlX)}-)pF#6W_ zwWUGi^(qg&i5}epA6&MiZ~HB7qR6N@i}8|-?vUXl16cM_{Y#n7hINxId^l*O8SI}Q z(QlFSp_y3zJ(~<<9uNgk{t?*6Z*gw&Qr*c+14aRrkSoBsmHczh&_ zkM>;@hSF~Pj2lko7fSG<1n7YRc)d5B;;Fi}07@&-Zjs9I7gI=iR&vNEN@uDCMamI9 zz7f|v(OlELm+)Ka<3dgH7kNzqx656CQYV5iZCcpcc|zc)b7f;#pVtJF6jF0n7s$ai zrAFYkpGf?fVej?ntY57M#c6rxP=m~b>>eANJn#OK(A8lMOry3F|6e{=Juk0&0y8FH ztCBKrVr~bReyya+#V%h_FVo$uxxqCiH;wMdvCT%|uO;1?iWhcy3Bgmi|0JUFjjf8J z4BP^JlaYyN6AAwl1LWNgPf5j|bPAMo@t+<9eZ`@?gp#ed6U_Cc+AEEU%~>418ncNI z1cG}l54$;6NgVK-#K!@=)Ysr63~0@bDn!k}HH(gL+oQx0nbhA?Lgqiwx(lBeB+E4N7|z{Mpwx zq0s@~P!fvU=37R7UDmHoM3zlp`?IH_c1|Y#k=L|eQs`CK?TtndKs1viQ%U7OQm9&3 zFJbxMWGccYpmkAchD#MUT2=OM4a`qtx24ys!(FX*swSeIi;@S)OZ~`vKD$VZ)$++05{U8(HYn!WtWyGqSY3U<}u2h3cq9juFHm{UT36qZOvU;j!*Q6*Dvynt`Ek=iUcNN|f|^X*gD_6$T% znN1EkVc3acKz%mj@XPEkPscSJg+Q(e?FG16A(~&SPmiSf!i2d@)v0QrtRhWBsfcw5 zK@u?&Jw-ObMgh10K{JU$FH$U#N=+Z|NSXz=z8x_r@Ad;f&~T$XgSMf#PJst?-ZkYP zNCDf!r&}X+s@~kcS@F6D)RBFn(0vA*+5Z?`t%EQ}wfJ|kw-vtZG0cCB>qx4wGrr=7 za*b%g$%K5=+>NX(wsudI7e9ko&0Q~X=h_gNC@SDh8a1sjbTG{Fu2B%9HX8N~uTrCJ z!-~q5-AyiJyd8sQ2iXtQbMx)|Y20aht+Zid2z9f&;vUiQblf)@b+0z=nN0*5_XJLjcbfFg@gbZ{=s0DLn(2@Fl|`9k|9pK&x^QrGXXm5 z-7mAKIs12zB`35G&*_s-AAa;6tK8oJG~TVEo_;Hpj-q-EJI80ehu`fUC&2Kj{4{hr z0xloO?GMapD+oqef&hI$T*ftET+Df}ZuonTvHMs8N;UoVCJ8~jPqN&{E5``KtFjbD zvd=3qx)(<)y4ZD$5SucxOzss&hHbsmrU;{Cc@GdE`hb>t8cCdJi_`0W;1|O2 zD&`XmkNM-W63=$({YdSv+4 z)H&q^V!JV#ih#gBwrGVs(z2Fyoc%WHpQ-%(`wb|kV;jfD05ECb8YrPztE?IygS22} z&+OUPrVd5-6z3%-39=z>W?JID@{?Bq`Uj03@XpPR{<4JKi?W2)&HGk$noOO>7uiPK zc0G)JOYnx>bKan)w%T(^#*~*4HO~33Cmz!KA9H)R54(R?+wM4!S{0S`TX<5@JicM} z3c5m_66)vf7!LMBN1nYgKGpuG04oj~3T~5U; z?UUHg?5m}T*$I-k6UXH{XXug=Sp$C~*uf<-F2|om@_N$xUj9LnF%xc-6lr!My`KKo>7s9ijU9KLloWE>~ECWz>G4mg>L;b zK`!Kgh5dLLTF%!pzZUnkRLt6rdkLqOd&w7?*i@we=tpTVJ&AaM^G|bPTD6(vCZJe=4p8RvTpL}=CmfO-0r%zwFzbfQIWU1a zL9c3o7oz@*_3~Tmz(Nwzg`jmSF#vmeu)X80ejYnTFm-q&N(`UmW=MJFwasgC!4mhd97b z;_&k~#e9wajbYu|Oj9wkdO00(3LR;~nJ()nNlCve6T)JhKf3zf*^hm!$8N$VeSzkI zR%?SBcr|FoPdtztnBWkgHXu*|)P@&}R6PleA9;!V#2ael5NTJFsbbp7a`2j*SL0a4 zhU;#{{B6OkPlDd+ueQ2cY*T*lFytR@5y{V^=u*s{@M2m(h4RABczq@UjAr4OW??BgJi`u{IS|D$K>SR%nFv98E$s_;sza3H8WqLK5p;Vh~8uI z{J-9{{Qvh|;c-qg7%J3}atrjxpw^xTd!!F*NFO>L8!$lIr2rX(oil3QsedNeuvY~q zS*1hJ;=j!~wS|_72Fw@-_diWfN~Fd8|B&XJMP5c0&}VYU#y+9BVpgF~qXTdwWtP~m zgzxMBuz2^b&t!Q#_c<~f?*PW??8B1BMK&AZwO@tnoGgi|lmf z{*T(H(iaHCgS#!lTO)_MuNvtyt0UotvOA2Qemyla18`$7z7iRDSQ3C6WpygJ84qQv zBd0@XGH$!@pVm_|@mtpLaT<0q#?aHw7chE8`7am)zCAxNkh*Rv&R!pT9svyF{%zbO zZ~fLxgY$lgxvKhLo8q*oNoecg5AUbDSDLy{LltX_e^eRu5Kj@14h;2v~3pZ{UxW@*r0ZS%x$y=nD!0d!L1vw`@! zn-n`o*3abzlU(C&PL@SNX^_uAUnklKe8oRfww#WJmrC9CO)7Sy88*s_)VB~g=>nnj z`KbqveV6|}3Sbt<)n&{C5 zZuNPV%sXas0Y0XHN3y$@)}WSCiV^`cd@jMK-j&#2SIkYydtOqeY zXg(2Wc_+vy{uSx6?Qa_|+1?MQ8Dfe}Gr99#i~q3kuU?!}V&}?iBw7&NPW9sZ@q%`j zF;FPiGmL*MWoZ2)m~QxgMW|oq)9a{YeD9J1bbLjUbetM#FjmhZSFeX;f&KMS08;_0 zsBj01nX(B56)v5*_0qEzKm7fl0Bj-FY~{5X;B0CksCii9Tj!`ezft4wkdvxh``$X2 z92fWMCJe}ugd$8G6Mp+a7ajh_!cAA{5bvSK5^-h{zY~%n5ioaaeIl*A^$rrdjKNzxUUvQAS056r3V9=}+Mb;(yHQ_)qnU zfyDX0jz`q+ex!2fi|05(to`{wpI^F1o;=@{YP8%(JenhouGhk^KU78~=Ljf>kwP(cidzt!D{QtQseI| z%!#5#aPHJ|f;Cw_KgbW%u^rI;`So3ySa3+W$o!^#TkvnLIS-W@0+oD4->*0T=^(47 z5a*2T2y5i@r!MwTytRi1fZNUp7Kpa=d(Eg5+tq#^nNq`1e+wdcEVTBx|0C~xX$@VR z-ig!u3xL$mOYKjK_N5dmZcV8#oqg^_aBBExsEaBGlHPupV)(&+aBCzGmBm3aQR$m) zA)H>d8N$!N4ITfLxmu;CEba&}+2NIhd9Hkoy2%J{2pt-+-8Lng`bfP!ME{By;#{!X z4}&pdPZ3rjZRe^JQeHAGTCF2g`tM{Hsiwh=`vPa*6PFz4mH{rB?%gP17K#|wN23@F z?7-@fwd8zsdC{hXosGJxf$DZzN&w~ie*Z)Sv5G@RIF-YmPDdeSeC zqzpq2MA086oW1QFl$i=_aOQRXi2xti!Hw)%YcppWzq~m-w^{~%HF))E;>`PkIYqQ+ zo>NH{fSpwTn|Nnim?JXw=59K`QERfM8Xh>BTjHuhZ?Cjg;1W}@OGQ@FCe3mk zseDb+iB8I@urf)6C}vBvYWh`SFg7Jjh$dY?(w1wo0)xU?hh(P+f?>cN_X-~rTY`&T#D2Eb`c zfVT~Xi}F4>GgO0_wjiCBKAkCvfa9}QlX^)q$0>r~Mmv**AHF*qZVgI(AJdl|!PCDg z9iJ*(w})Q+cL}hes{)d8O^fTGPez6_BsS_wCl;vKuDj+g;i?Gu$iuIWL`p8Wk{Wpm zBdqJfd^qU$soeRZG=?EtuRno)q|AiYqQp|ouQYfHxWK&g&lgO{cXa7_9JZ~yHr+p5 zJh-zMklL-*%Xu84?Hh0k?zgRU$nrdswe5{d7O4zEMTt2HZr(uN7xTJW&J-2RuN4O# z)h|-B5smmrG2gd29p&Ec(mk>xLFLmWpUVSuj-ug-c>bki);B8ltEREqxVNJ0G+6Zk zr^g58Jqje6_3q4roQpy|!UnKFb>cww8VH+IvuoKJu)QRqG3WnIw zqvX3*YE<^dHMF{rA_`UOyx}(s_#ViU+BiTV9U$$BXk%=VzpmoZ|D(UfcT@>9#FfNLnC1hu>-Z^U*orl?~5@{IbL3BCen-O_&ohSvQU`fX+ ze#e_8VHE2oaPf>-HcYQKudx_FR$RBZ^p^1_ro=jukw}D@Ov6!if6dmc&m5Dy(Vn`E zHBuTt7f^DEc`VVejc6Yoi!K!p&8*Amm}IDA+8hLpa9s69X0-HD_zpTwm^XVM6+66< zSY$@o0==pyhIg)SLM_m-dQVVCIbRQH?yXSE$6{Zm+&8-BUfwMZ@%0F)`pux6=E1Gz z^l=Y&D#>@hoHe1T)%=bfDZJiLGCbc0en0qwHzOCulsCzD{e#UC;tk5oxrZb|>A3k2 zxDU#(&v4MYqvx8Pyw;G$1!l7tCxCnlRH&Ty)U=zN4D9}sF!)fHH+6<;u1B?VZrh`O zCq4H+?!Yy5?*}W0)XdhbMW`DVnI+L78NTSJezK@GS({hDWguNvIbH7IY* zbB)0JGp_*)FUp#(eg#tV`ITKC{>~kGSH@pcAESRXfpx;1iIJfzmaluzzXv*{@xdD)vRzI%Irm3?a%R9M-ps1$q?2lII4lLCf ze%9ITK^rT(#fc3jf@(@g{i+jFOUt)k%LaJ2Ji~)nv-`a$18rqxbomJ@)Q!ylbT4eB zE%E?+R(MuivLbo_{-{>#w(W?$=qCbgdx+7w+4*upxrfe?rBX;e^ns~RwLUC-Wbw-h zDlarafQTZsm{LNq1Erb-h$a%IIpN_VP_vSbZy}hTVL<-S!m&BW|9XA$`!9Mep&hOl z;BPPX2+|gR?9SLYplcU-KR#}gd%PHGcwT&W;R}zndRf3zy3Qub5<=uMKCC^**=(+@ zgJ5A7xy+<&YM?{%HEo!56t)Z~ADM=Y;D+I()CAuKYuvrpS6%xr+g0v@TPUtQ^Q~c-DtuzIL}UE9BD5K2sh}y zj`X4@MvT$9J^YK>^3F|mr8J8t>DNs&jb)=w)=;rKx;QvJzwcYYm2OXWI}zooRpy`A zw#eB>*digUMi^f`o}bXwo0oH$<+GTaYr6&K%1Ny@G~XM-%p{4JB`7P7EQtKM#5Xi- zWHdoVxcH-Lz~&x8rl+Nzf-g6CraGj2w@>nTM=9(Y9cpCR$by)wO37WlK3?)yBP!oV z8Q6-?rG{ zWcyT!_XlflmHn<#ISg2BE!{`#n$wuPmjY5aPHQ#NcHCe8gDHO!fFh#+r_cCoXMZ*Drfkz>Rt;%rWZPXv!B3Pu;6bYyh<>x|oRy1PX zBB3pUGz^korHTWmNPjC$72u2c+4YQC>M-H_LLNq0;t}Grg|LS2adi%e*5(a5k&)F2 zkHf@%`rr_DQiZ#P+ayaf5-<~DDvW%~`y4j7_L&wtP4nA0D*5v9L{kmB5%#-k)>6tb zrarHRt>Qvn7QGu;CY+$`yljpq8yN<$zM2_b0n^<+clPFV&U^HkM^}lb$XpnM;{C%a z-ftde3dTSu;1YIZ8KYfW3@3O1EYQD?16cPw^lPNEv>ONNkEKq{YrrMN^beF^izJ}+ zT^^b+oFtJrZM#ezVJ_&YsTu@Nmo>bro*jgP zH=391RITk~&n@oUzmjciH$6LmKH`WK$|Q5lMK-IU}_lvba3sDUo5$BPtna$fN=O8 z2!|bRFSLRouHR*LS_`td45dJ6JVp zGPti9*7NwZKTpl%>@p%^)){^(gOxf~{~1n{ZD29W+^V1?ejuVgImn?tJw&ZC)1Saj z8z;k;I!k-MiJO!kup8mU7rV7 zgl2t&!W4M3=%R2|t7@f~AFq*JR(4qR(;Ov4+V{(nSvo}L?z`;pjGGGioud8<@b%@h zwY;r5A3+OC>N(WIfJ?MilYNYYyHEm#wT=TH@#RVFRX_UrU{DH4w8Sx_iBUkV^5Ln^ zvwqOhvB@Rlj(+JZi_UB!sDdX&Ve`uye?yEiP)u_|)YKWMuF$jI%pbj#pg`0WxydQ( zOTCF?a&Dxjg**4PVmP!yE#^%}lETlfPa-}0&c-uWiUe*YeTc4I@{YL7%99=&bp@@i zK8xk1ql=54D(yM#HkF}0Ij=H}z-3D5m|^t&xEmhh%t$s&o-{iBs#8wg2nKT$5Q@64 z>DhsVXXH^hF|9(g0&?S+#p3`A)iTa<{n7gou1eF7j-83aTs zWZ+Ajd1kvU^V(qQicFEjhJe-vbTqVJF0*W@t&;EC`k7LqJT8!Y^0$JFaLYoHS+C0i zK1t@jXO#nq8R(TPBKYxh6yZAdP#4cz`np^vM37NnFtp z))CHsu*9MBndWJBR%XVJ@jaXZ(YG7f!YzY#xmt)fLn8r1*(L=p}z3sjaY{E zZbM%*J<+AOd`o-AIO>&fi{elPvUzaygkB92rk@@Hrt3qwG&GAmMp|8VAcucJ*;F+^ zrBk>|LABE+`bQO_L2Uz_Hu7PWbPhYJtK&vh2WgrmMZ0j00q7A7AnQX`y`1NJYvf`ATvc3ftvXP_rd(!Cb|wE70tn3R0_a83b4 zuHkY8tTdQv=bqnuqlg+~F&Z5@L4N_D$jM#Rw~~ymV80FKn+@e*Q3iHELZ}a2*(-A_ zn>c#S7=O$G(=gdiIc^P~mfIyKRXEjywjHS?u8G0mIRNEm(yQ3U`Tu5#Qvy%SVrc|YZJ0n_`U(xH4u;& z>Hw=D0GD!WYHBG-1}Qs}3QJ%SC}|BXNhp*1`J2Q=B^&}ChpiKtX-cd$VnIqipU^{t zq|%(1>Mbd^)+(Vmk?{_fCuNS5zo^fecE)DkfEyQ@f_`GWyuA>(7z>1#1r*NEF-84G z+#(Iz{uw*ctxM*YR2oJDS)7@AJAd3T{sqYixTuZ@K!>l{{*!9{uOC9~BK3!EMJnK@ zrB2;btF)B_!1M8P?KOYT{L`18ed(Wp3dpZNpaFYs%n1Uw*adu&+xmkorGX zVjs(6oZAt~Q0ZuQm5ubY8|%*O_23>=(Ga`$g!S?Py+@8fkL=dFVD^IM!yv>^=XAUR z9>a8=dgzF!%gN>$*80J=b!6}8Rnlc$#2+|#_g2cU%DS$gKA+md)J)+0E~dBv8V3E# z|8Shq^JLvLOOVf2-Te#GxG+s=CJLa)-0`$Pbr1wRcEkrqi3-dp1O(OBEP7M;CN}!5 z^jz#H|9Di2Bm=VI(_x^ zx7p!ARLw#p4PAnvQa3K{m9KJ}@ks)S`MqixQ-5|8KB^Wm z=#vLjw$BBC1EecD(!FmqmL!*^hcg+Dn;$%HbnllliFMq{Cp!~fMivpJlK;;iCc;IQ zo5OX)+-pP;=G!di!CcJ?xCt}}EXpRcfPg~x`CiYv?}OLh7sXbZwZIGG^s;7Z#Rj0m z=(xg6mkP?I$fP~XJlEiN2(h(Ol zBXx>4>Kp)lsMc5cTt)poT$lU5@)VHqsbPQ@Akcg=+ullr*(mK@Qf7yQ)SocnDrN+* zd2l!i)YO2Z`LCF>ZuGnRZ>qU~8xR5MdCexzNxe7a<=*d!$KACO3zmAG4^+T-KNJCq zwnq~8pJalemTnXR;At$R}z0Mr}C$v>Mq;-+M-V0BrdRRy+__m$AkUZg3Gm2>5$cNM2R9Y^;Eg4;WFj~!yFo4bQy0lGl3q?AysHJqhS( zDNrrdYJ~VYs^0CcYTr~mUoTCT#-l;2UdF510HvdMhGSMu8TfP%SuiIi$oM5G#>{Qf z4d8Nvz_1?-Yk*zFtF1?Mi{iT3>R5mpPJrTLra=*;{T`AKP@+-;*_;{jzQaw9O{R4y zf;>H*w9B+$`@buTW;@&k_H^NU_rNveq42fR$EDpY--xT$gh|<|hq>TrQgt7cRgXSR zCOzK+^MVdZ6_2U3mGJrgPcuI3$f$Kq7o%gLGT4;drmi9O0ZhcMkBH}QRYyAWV$P5VGXRwa9D9$$H&o&U9dAz! zf>Cx)N$62XHwQ0*R;XsGwbOEvyEPo0LmInsoA?s&RBHif;$s6%WT`*{wnDEZtV-P0 z+z{rgUStS4-5I1mVK3#_T|_}{=KQ?WSh)jNn|jvVV9EI7SUt}wy#JFHKAlMa%r(hb z4bbkqh>#innR304q6HAvU_<7P_}u4RLC;@1XD1(z=a>;H%q~&oJv*)I?mxT4E-;(Q ztJcGz+F10Y0dxXbx;!Zybsr#rQt19@wE%y>!VbjO$bJ8DV=AuH+Up`s_Y2y&i!lZo zoFBgd63+l;;0(ti_s=SlMy#@0>c({xqU{ucrDD%$Hr@kh^RX2o5?0j5>*P;pJ+dJg zB|tUhK&X1qnzgd=9V5boIpQ4zCJDPaLkYnKA@+4mRatXDe(M^jecWe7yIJFdY~#&R^2%Q?X}{NhR0~8ZYJGF+-ME#`JwZPYZm-&- zSY0`?bIf0O{okn^&y_ACLz|pGD_ZXW-Y<(rQD#yo4t>cNvwZLRa&xd0I)78bAb%Qi zh-E|dXQL23P`})?C8-#CqXFyiDU$dO7ytoxCt3)syh2~n0d_T-BzV+{ssA*^cA5gN zup`8vISRiTHyk^kw8oO{+pFu(0C+7*M>V+ro(!;e>!qGLR$^%E5$m7918LhhZVnzi zJ*Wk)8iOjtR72WhY2~(zd=wJkKvg&w?>lYflR-Dm^_;-87GCLd0&OMCOU8A@z2fkm zdZ;5yYOxsnJ2^of-Dm2f?RwR;b5aIeF)oH+AzMF|{(gIKv54TziBV=?%HxW}CFAF=D`EHcD+rMO?a7A=1^{4kL=> z5Hnvw%?G4>8^8Rhe-EP){$**@h8qCeKr=4t)Yu>jxSv6~C>4GsPyoM=9@M0craB*l zf=8r=XIi2@|3?4sGmvOObQ?>^9J^@A;LW*r$&kB@p=KqnDD4XNK~1?5xq6*;y-pX6 z1ZQ>8sl5D z`uYJ7gzJJ@cy#%3si!Q_BBsk$hxSJ(mB35J2QC_t@~f`gPU$&PDb~l2Ed&D z5$^i{ZeDWC9FY%P1*|T`+#8wJI!+hcK;Qy}Wc zvac=vI~2Cpb6$(}-=`zdva-(lq7yq|Io~h5cex$?Fcu-@6v9#h-}G&aWZXDQ2Vs~6 z-c20WTpj5a-jxoW8O6-7^3g(X47p>*y%hH}U#&iwZ*qi(6t04mfz&`BxMCB0%~m>y z8MYM&S*ABH(3!!#U}tW}RR{48?A{4)f`16_)5mSyH;SgQPcVIzpPQ{o8Fu}*b#gU% zllC7M;#L7%$Wq-|889MlsyQ?|iy%aG*N=Z+xHGBMu58UeG9M4W@n62~D)1N{#1Eja z6y?`b;{h!0e zHSQ{>$Eo1g&>z*2&?wu|=+Z6ToIP#;Adh@ z5Gv8SIh9$!yRQjWA`|a31+7WE#1c4bB~&)p(00Lz<^ibYye0Y*ueZ7!rf7S zUpp{x5cZw|00F?CMH1j}Zk`AW%~6J+6`Zo>N<YSR2( zyP*$hd)4SYu(zLx6ok>T1_G}VDk$X-Qto))r&>At1#G*~fCye~EdD2y9l+`|VrQQY z|6eSG$q#^klfZOuBL3@_{4#&^AQ^x4Af>RHG#s{g`X@LJSnERi?8dprGz`?#QDi?z z{u%EAtP(IIahB9a_6=)sHWOr`r$(QmgOz?T~gw_5l8><^q$5k<;Baj}RR((D5@n3%I67dJ_P?(OaEs8F`HeV;u)Oep_#22`kp`d9+Bv`}R93^u{kQ`3NhjYFX8*OPxBn!1 z&Vp=z)HMIQ^-L-Up6gZ}$r(J@9Ny19-nDBlwg7;Fir&q9&yHhn@b_fSLt=^V?>=8I zAnPeluetf*Gzxk+FZVjIF=$^6QBuF@3dQ>AeYI+*r@7x5!A$qa;0uUbU}Gqj*kwk6 z49xcBM^fb3(?HVS9l9PBQN6GX>~Ea>b3{*Q;sOp)Xu4lk{a?$nw$M+5?JTKBAb&ar zR4v;;P9;XR1Bge?Z)YEG0jco;aC_U$y^tGABj>Lhpv4^!fG(USK_7tT=G>`MhLh{{ zm>j1O9hgj`x7)A~mMAF#2^FeB%O=yd*A@rQ)gYFAw&P&w2q5;Q57f-3a}CXgu2!o z0>`8?CYXrNAmI0?$GdOfjC3KM3~p~{lIz}9;7~QN^-6OTdzAY5c=?LQz;ivy_bt#0 z47ggVJ^;>Lm`JGJr0?X!u-L@s0J^HToSjiHVdzJSvbA%1ilv4cze4 zr_cM!8wV#n@-rZy@o53DIifOD9c|2brbmNetqy|v8`2l&$5>>@tng{SY3&s2SRoye zO)q^c&t>+kDr0mC7}a^4ROwZhL5J~)O(#uB;6iWfv4ezib6t6k~D6#i#E?=(zXAH^X5KS@8AfQ&T2ut@_4xMT~p zXU1enaoZu#z=hb-+9UWBF?Y;d=VqoMyEoUa>6e;clEu|Z^b7lUAC{bFb!_sU3sWHs zF)QpZx~h!RI~54sOFS*PtxcYGbnM5~Q`0qf|_AjV49UNQwH8C;^q(KJEB~JuoKF9#y!?l(~+sYgxkCt3|7HA{v%hK~$_Va5ks$PNSQv+BP!;E_L=l zB@&v0guHjUz)D*T!(RdU6?nzQ8$tX;*U4|u^k(2?y6)6 zm;sEiR%fYaXY1;|J_huNR_FDLb}Y2TR*VriEbntT+q(HKENL*Ie!z_?8gYuf|K>~x6LGj8JJcrc@t-7z<4N2jMm@% zHHw}lEH$Tg{>P;NSt{UD(@TYRtK|hiMKVwSZyO7JEYM0N|HrLlGtz2P8Qw^m%`5Hu zD`wdCWE8#oiF`yR4TIhV&$itGW!JTIS*Qo~K+@dnN`&pXbWD_JT!u{xgmL;+rPNdl zbb&tPN`mL4_&@DEJAljH~X}RZ9eBh{G5-c z_8d7Y&mcsObsQxUE#W}8rqD+aFrv{wi^Gn}H=sw~Z#)F7(m88hQSTP9VZ-uEf}`#_LJx5LTcx~I?4s1mWPXSe++)p3HeCtpBa zlkGQ~{v-xphD+eMaUY3e_c%Ecx_ay*2^$fu2r8|Mm&^2f8TS?$-(U9wY&nMCCUyTV zN1mSSu!)~%hmck2Ls#h*d@rNx;Y_pAZ27bT$4CHw$kK3D>}xV`7?kAd2|>N6bla7| zLyn3d>kxX5{$%qMTtnZ%r~I=Hp_hSRw*^Ig(F#%Nyp9oAg&__+vZewT_2i3{xyFZB z zs)XZv5BJ9Y(qF&A+g7aTxs}?^fnJQog`yz+S&D>DnXWE%dhc)oYsohTBNxsJx~-NB zg!7`C>kxG>*cuwHB@LNdpCAKF$e#n0u>r0(#SYmsV@Xe+Vr4s|`Do%DH}9*;XkCHR z{(PSe33opIz+W1Mcjd%sOCM*8aLUnT-<@>hZN0N);b+HinGX86I4xJDY_{P#$!_y2 z>F3lIK-wl|VLYSRLL)l)b&{OM^Et!b>naEH@qYX8ck`&?%}uA8!S!W~??h@$(03Mr z`%Su1@K>qFUoXB}5I)JN^tmg|sLpNC*5lz`#AzjLn5oO9@Mxgp`B zbH+`G0$oU(BG-pWj%-_4D`soy@ETX0_h^yVf($-`&^*(zPH`8e?rguA_f=j@zZloT zp4oI4BcM`u2k5aMSyihN`r(-RVKt|mdHoFE442)hk^h4vZ9RvP3c7eNP+?fVv*uj-0|%Rk_rDd$ozW5&jC zd;=0ptSl1_SjJIBj+Poe#k;1H?dOzn9VsErw`S@=cF?O~-%DP+?5W(&rREGu$<1i; z1L0w>8+RAQJ&RZUdPN8ft1}HptfZ^@C7Bw}RWg>$X;F5-er66#pYCl%9T~YE%Q4_1VX>flBYS@H^)A-AX~;&250B z4nM$ep;r#Pd_Ne_NqV2L=T`)=i+c3h@fS*8mQD&9N=JNvX&ldN2lZ)tKhc*{@De50 zX+2wtt~GfINZ}DhfMxwb>XS|K+#-&y6XHX| zQ6f(LMvuXw(@`U<#;vVBhhtqauUX5y&e&cb3OwvW(i1fvY#Wv;o+r()w2D=<9Pa{L zFTP5M*~PHAlQ^J2*WH#>NVPcyMnC2Cv;E;^G`SFmiDRi^`$*A63F2wYeHAJog2A~hV>G3Z3jm}f>UC2alWI^SSed{!i1hb z?*~*!!`==GD1;1v;xa>&L-4XKGsGnkgFh66_<8WnVa@^K%yb4*bu;ynaPExYWLnKB zSwdI(P|y8RaN#>Ef<M-X9#ne;s>Yc;lU zgT#H=tkhECwyI)Slm(I#plyr)!{kQ!mbue~0-nvt(~uWgEe<6u(4WHPG9el@asKr4 zb=*GIH*L_qKN7uF;Bh@Vp?acXE#;kAHO(( z>z2}qolH&X(NYS^p=J}V;N*-7rW;};hQbMSB;0n0*!6_NRfmO3`+*axfp{I>`h*u_ z3xA@-Ii<9=Rxe7|3P0%UmL#8Y*gz)N0O)B>MO?K8pP6iQPz-`Kr%VMTyza16GY40^ ziI^^fu?+Y?qYgx+BT)posOA=~fEb?@59)yPPScD<-frynzIfyuego_|6~I#IFE8Tp z5R+y8)d`aPtG|fl4@k9De}Z{x4(}#)&UH=kR3|J<)Mtev?MWP*i-W4*C(3aYT=O0{ za&>jcp}UbdWY)>Ow`@&YlKF;_OvTZoVR%Crw2$xL$RZDCrrP?0_II#DQn0x}vtwg- zuKd0ngEaxdMbR~X2Rlplg#%U%2sm0G*PwD5-DWM4Ozu{9kR=U9p}kHR;H5c;{~!)&s>?JNaW0xesHDVo;u>_lB!Xol8`h3fazF=& zAmVT@&?7zMYC4$@bES@YT0?o9m>}M#f=JI#Sjh->f)q}qiuC%GS~Xf}W4+LeI}$tl z`U)RIP*z1HD)6hUN?v~r<1aBzpyMndD21C*27%}fDT`MC<#m(1XRwb|X<3q|Su7Yg zIeZGP#5(tVrmU0ow00W(yDkquT`LEqz&(%_yCY(!-5LD!!IC(MY0oG^^BBMlZ-uuB*keXf&=j4(ixkgxBU z*TGJwTw@H=P5*760ltZih=ku!)k_;Zll@ILs6*besV zux&}2=@-=CFW@*T?uZIQ-ZE5LQ8%Q1f&%z0KMudhI!?0nF19bBU_ovIhLuSw@StU3 zM>OYXQms~`blxT_Lqe#oan*CD9;3AHQS|Sbeo9SlhA4CX3Q!kt?7`TqtMG#AWla3g zD9s#~veF*_&})X%Z0v9tBU|Q_-paC*^ zOZ17;cA=BTmqAh}8aUa2J8uaSks3<%f1Hup>39?XIl~u>2 zD6?YQ00t_d*@wZI0NmL0i_>ai#AJC`G?+C$+$KhgpyArZiKN;C?$Q2-wv?h9qW}w$ z#`c+NO#h^!0KYYBnz(yKI!W{mj95(_bLz1Hkt#&{)xj=2ll~NpR$Gj?`W(CHE>10H zunewFKS6h3U&Fo*B5M!U+S26Nf_%_8P;CRf=ld?bNgMO(q8|huFV`v3R^%Z6d<;Bo zl9d8DFS2&H`u!_MK>kix_bKZ?jcuF#qd#eJtaX0n^y00+KNrAM9iS1}MnU_INbaX- ze@L1}%f##~pT?Db59bhorkiTDzFd)x)L_dDvC+&wj?XwiN&RsE;-Y#+x`WRz(9w{`raRs6(lVrttRsOir0}jTm3escEgAvUmNTK+s<*Ww& z=eMiFmq8}M>Hr`uA+sc^TYmC zeEq4M41ayG1LI$M82F}Yho#Lh*C~nb9-%76U}hrG_%u*38~}Yw_Q)H{$Z8^0-Z@_F z(vO|~URJATsRYlJ8l$jN0#;?4J_0CRUg@TW+0tJbh^SLvmeZG+H0m@BEhYj^^*nk} z(0H`u6`^0Zm_bc;WwSVXjqB0;&26Cc@A^`M+Wpf-ZII#*fKe4-1xgxp0PVQs0*!4I z&I+mDGX{HH<;&q%>PWE)+B+MUYFvC5=zn#12cVTIM?l(ug6yO<8{nZ%*&4L zdV9g9EoQGGU{b@{p46jLLsM-yK&plgWH}Iwk z-0F5aL+Q;P`w>}O{GCz0kI>PpAEkmC{Th4HRH79Nv&WPGRWp|e1cdbwV&LA1eNDt& zOcpoL#vuNJ+(Nl)S=axV(+->)RUf50{XzF0awltY0gwygj={g5uz>G#VlvMPA6aj1 zc5)uCTt3;UmC9kRw(1t%HXy2Z1aijCo;}&2-wl69lFMtujTgw$(JV5WE*4Itj+3|cSm;$-1o2UIo;WMv^ z*4{juQRzz&!6ep*yKUcxZT+wBM?n6P6+wCgP)FTNb9bdXU9*^zztB)q3o){)S1Z4~ zr+?9NfIzEv6D%iL;YU%Kc6u`henjGX^PK!+&-0@TuS|Il#cXiG2IPbk6{RN>XL?Vh z{!srHbEj&x1hEmXV2=y^(^>Vr12~uPgZ^LfrO8^G#3l4|io_-1Npws`U;RLJ7k&fMxgv<2P}Y1U9)6eQy93&^dh`Kee|M zAjR$gIgJZU1XL$pIQs6a3?L$RSAbf|uTbvSp8IS}`X9at^4(qPeFUmAn>JJ1Vx(;z z0qZEGnYMV>pYeTPJF=YC4YMD2d2zY2g37*7eNp~OI&>F@0iafUI*9E8Hg5%$LP|* zuLujfOi#M>M~aWXknfcu<~yarFV(~C>DFXU?P`NVbV{_SVH_$8mmdI+S1?13rF=GP zTL=41{T-4^1I=cr)y!JtDj=-S>Kfh}>)q@QUafxSqNppCs=(i}T^x#GJV^k^f7B=XuK|u=NgH#M{v9FrgFUqL9$nb4nQ9Vh(#jUe_F^ zxBk2mIO5wDa2|0Vb*-7VIH=3MD6{as@|=k|@|juK9(gExVZ8_J9JTiZoyhQ8fHvj< zj)n3FxF6E<{vszc^_4=Dp2 z+;r88g^#JM2pD`E{=%;DB%1&5WhSJ<&3veIW-!m718hv{x!+gD9xJ99_WO1gYrV0E z;H&A0lWIVQip|RGI0ra8;Ai~jx(;)Ek}MH26a;@VYy_7#a2_D<($^XtY~~f*@ClnH z70U8+^s|o5qM8J8X5bHjX>1|zTWA&mig78pTCxPu5>M{QB~`P+Kgf3C69BX29Ju;l zQbyXGNE~RRW8EvpeR)k&5n}r5GbEKkHvI|6IXPQ3zyp`AS$dv^9ULz!WABY{8qS8d?q}`c_Kz4N(ymBVio=Hv}Dolzzc)` zVKK5{pt`y!Jq*YXh8n{0#!C(ENqnRf2&_@IywVgidHv(bO^7B{k)I+w4`qmZnTIV1 zmzkaow6;Ip!+=U-Y%FQ-g>I>K7YjOz6#|{O2*p9rP6fK?r-8cCG@)FPbF3qJE%Qv9 zU14;$Kt%%Q5g25SRUK*1XZfbB_k_Udd`B$TvLpm(u+VBfiSmsm<##)-D6P0quQeX!2u4^Q619vPtJN5T%JqrMPy(h zN59#MDtR~#sR%Tp5YgLMfieFA?@~gzphM1zx3i~w&n3FdG3SkfkPhLVzSVoVx z>(Z@rcZCByt$i1PE<=|KJY#t!eXS9{){kx?j6O9? zVGn-|j{+wb;4o zc9$k{bH?dF=!>vE#C4vbdsTRdqIRu||C*YY&LAEJ$ysM&u}hhr2*KIOS)fjVHd3Jw zN{JL=bQ3>qY-TD2F)9VqivBU>WH6IuLhJdboKR?90V9jM(bHMg>0#_#zTu=e-)P|3 zxTA$rOM|gq(6$`4*(XM*SH7g%aDP*&teKg0Ti`HP6}mkg<8w|Vz`o{ErNm3BFRxpF zEa6RfxU=~Q^jagSz}KE#nkiddAc1-y7F8moSX+zF(u}lXAPkJNMcmWr-mBiDJKpMgsE4)Etyr6B&gKiFf_`prhW05+j@2*$n?%1vnVG%6ITF2$v#iXK z69{fYM}pqInH$5n=teh=4x>WBD55O2DFg~!CN%USr%Fl;crN6&N^azq54sS?laYxOTCu8zQgqIRD=IX!-2o;d?w` zE(X>X$0x$W=@OI{v}DwqnQn6g5~tuW>-_{S2ehQUjGry-sSHM@pS&C9&Q=1k=zBs8 zLot_zp6tCWtZ(5M)Gngb&3hD_7P?EK--5(}k$fx~OCLq_iS0ejeju&B*8LAFBEelW zNgZirCfVedpVwT}f4OLH@>%^(^aL>EwAd8IOsFUE>ijTBNxqzL76^;MC4cY8eF2O8jv>`YF@36nn ze{<_X;AFP5w+gvFnbtibv3rJkP9d9LKSxQ)uobfUM1kSRw>dc;bGF#iqu;2v6%uX z!r_d4MXm)y2@((rXgd?@qg;2mJM##%i2FNwLy8J9#@NOZJP4v#8VrX?y!N($s<^U;8lRjI{TM()J3f8i7ywAyB-<{?gO zV}p0Pye<3d_ZYqk>C5gO=%#w_vk2nmP-rz>n#EI>?s0Kx9{%d46_;1X;ANcI@sOVc zsZL|Bzy7n!nvwlQ3~n5sd)&$e6t%*SKs@wYe;dZuclZbmgV?}5bDR)Uil^wfz2*uu z+C@p4WjMH23M9%PPIabmF5DVw3|Yp@GObPsmlavrp+NjjYIpCI>1*$rzEeoQoobRtO`*i~&mU{I%bw8KCQ+N?TU@Sb>X+q+@InKXu z+>8hz9p(CqV1S@Qi=h2n%YRo`&tgm?W8o+iDmqK%?r|uMzEx1c#JX*(!W=aFkvp#l zYo8YbBhPu(xJ(3nVGw>zu|6y2_UO`J|H6(UbI7pa1j?QQ_+UNkxQnpmJ19Bi)Ba$= zmDw>kD1s@`b`@IT5TOO}Yn|Dqd)_C3^^eI!lMf_)@y}-kqxLatT{=WB$?fm`kCsaoJ>!KZ-9WSO{dRR-n@M-8U z^vYiRw?`2B&j{5EJLgWP)wf-2j$FFF(19)$jASjaf`x@+@ZE!76K8t)+@^9ZT@r7j zW1Wwt*^t#cP%Vmxfza|lK}CaYm)ko;IYXffxT@sANd6!kAY8^$SJ168Af5rvd|6XH zF>kj$bN_|`TVv*vLsq=FA-9v+%TG0@?t-NSR`s3H1_^!#H3)8O7cbQrw4bO=9a#jQ ziZXnzITl@K)a|_f_)6e5*4b<16l$DGMB^Bipjqibv zi{lN(Pp%6B(NXZ|8)-a)l=UQ4D^2C}f0xXS`m#vWtfCp!1NrPWuEmu3=g5J9*`*M_ zY#gP+8E4yRmiocEBY7Pxo%bL;o;n>YCq#YTb(wdckS>TGAGCl=_Y$x zQ`a0uW_&iH=&fye9WGUKAHxbR#YMqEfzt_q9mWkgbM!H%Eob`Q@JhhZQ`M$QxS}O7 zq@gz~Cn2H?pm<^L=;N<_KEwWK(;Oq!CqxklG>7y;IyEuBj?rq4l9R&L1M5Iqltg{> z5PYLln%pzhJU?Aa2HpAnfcT~l2n)iZxk9%puB3Kdr~i(92>xvm`(55C^exASo*|vA zV2%zMRqRwez$zTbZ0HcdKUu-tR9Q{95t2cpCoGxNW0(bw(gLQYr z7IvEd$rGwH5VS)XOrGTg12(C7;ux;!0mKDcRJu6PzzzsX5LEkii-!Om?u?A}wO*xj z?(3WX@XEG^U@>1$mrkRK5zG-fGbqfh=>4(%$*QPezj;{CQ}+yrxVe%GI_%5(30XLp z|NK`BoVf)%&f#h9-!k0=uR?+U&Gd#!)e>8i0C;Zx3cjdsA}fq!V==9G|NIIz!WQt+ z$1#p@6elkDOiDz5zW@Gr=`}bJn*UzcAILIS4?M;~eGGNT0oi}AYC#0UN*?21PxCK$ zg9rRQE}Ud>B!8|q*jv^hxHkaek%J+Nq9Vr5f6}UdA)y!Kz>mBTOiZm^hy4UqfjAll zTq*3sKCWUm-hT(MKXyh3euV1@WrK*}E0|r9gg*&m&*1`3RGu#)m;8@G;Sqov9BzOa z4@TI02le$H*~xD|70(NMVDp_^0u0Re?rUeMhdbZLs{|UQkrBbFD2y5hw_k-RKKFaR zS>-iKg|QfnzbIe^GmHcb%0?ZA3TGn$I7D(RE*&RISvc@vUA=i6*5759i>{=!|K8kw zxSWac-d~^9y9xvNjg9h#<;xPKC9)qQ8FmYg`!%E4W@l}uN$va&YX~pe9xl52Vn{9E z;dSks59Cbbvb|0RfY?X>cITvz^ylNL$O8c1P2Aaj-i!$8efXwBLybYs0^O*@Bo&+> zKQRFaRQtv94%hapQM7#%^H7$iowdH#cPHp+&4;%OW+|=Pz^o-Zb_NDy0kVeO>mC*# zvti!Vy5-{#p$v`rqGCi?COt6_+0cIfs)p}tG8N!z{4h7*2ZrmmYQiikOC}DaHK@Qg zB3zsqH`g#`KLy67zjNNg{_yGd{HPBznT*?Nu%yu+Jj+9NTyB5g1@uK#KrcC+oX@^D z==$7v3VE+vV2iu{aG)WSE66@SY(7eRir9$&R%Gj#ywyqhN zBz0-;wJxOUxElOi@VEnhJ>Z!2x-h)`e4^dwqSW9lE=Kpj>wfRCc3kZfnKKkn)d9Cc zEwtb4I9Gp3(IxM}Zd(m`k>hy?Rdoc?&?w#8-%JK`%~!v}rF2wy$v$$sieTj>IDRRiKj>|F7MoMj#ti4kZ{t-BDcN_tYjf;KP<+K_tFw+a9EF3~m=lS*oM zWaaq^jO%hTxPbiR5yAd|(nxSbX1L7e!20t={``A2_>*M0^M=+9(N2KN8lLw`vEAY= ze;Z5Oo=-YEPHD3ur_AnTPRbxJ514$B)c@}APBP!SRvR!`&f|_$jFl26N}cjy){)oq z5mRjmY(ec6hRWY#oKH^{^rI!aSyec?wI_h<#{ym3?aB$3By#>)N;75SHQilo^NT+SC%QVPYn! ztd~@}1J~3q<&BT<9}z&*WSo0Ke#IDm(zHP~DB40mlu4Egh#%Qgu)lqVpMX}c_DV$+ zgg8x?C(k^6)fBQ>Ef#2z@=zfQ=K7c{D)7qsTV9dxX$2*B{S| zg}8`c4!agvCFoUfWSc4d-k=dG(Ote9O+BZ}QyA;DZf)afE^}kK6}tVp_kGFwR?;_t zCu)t-ki6@fkj`*9h-lvg7Zz}=uwe>R&Jc*2nAA&@-oS>WXsljY8Gj4waU}+QwzY-(&8h6tyPjq%*~rDH<)LQ7+;96O+b;A3HMP}_AIMeAqYVW? zig2=Q$RC}D-fxU{GX~-=rN^i%v+p5aoo zxr70f0l~Sxe#hq-^#S8HH5==6#o+W%2ps6*vOQG*?df!Pz0MPc#wGc10TDywH-66F zk}b`-VtC0-KXFURk)L*l;n4^D{zaG7W=#V6*dUqTSSeT%9H-cGX(?$PtSy(0V;Gn$ zt5dK!C1?}MwXoo>b<7tPvlc-W&w#)C`ieP>^?8Y-#Y8u%IvomUQJ!V3|AMK-jR@+8 zXjQ~=@Al)&7r1Y~G+^Tdxzf{@^w{{af)89={N^#x3T;-WRZ^b1D>SuSvrUg@Gh}HW znbq!Uo5!!U_LV4p4${%`yO>%yc=z=5ZLm8f1s;M6AI$o<@L!%ILq}pdv~iZhPK_!) zuJHwQaEk+{8l27)a1f>kavD%{-Eq%xuhQY+PQdZ`;bkcHY$yu9N+j||ml zEeyrQBgA{@u@79Ijv7r&Y%X6gKt`Kt`VhQ?OOf3YmGafyTtKxo(IRO#BZ_|f&I4RC zzMK~Ro!bh>p1M?gULnhp^(1pu`77i;gWeFScn#80QYh|@t!a$#J1}1`lD;%L9p_Qa z^K!q0P_=*?!COEw7scr$JqzHShCb=;{<m)aqxjZLXKDDS4H=RPq#mvhgE& zj9yg>iJ{Z4aZRh4+TH#N4~Mb6SwYXq&!4*v@;~o9pIHMX%*mmxH{M<9M?F5CAAAZ^5qVjG$C|$WjuNsnuvbvvOn_|@#g<06 zPEow^Ppl! zS$A!Pf)K+pr&Od?WFDd=heY1I_~^b8p_5X4r@8!=;Fhc=nIAT5MuHq6N15%A?ke~6 z2v#mV`xA}^005SS`*AsF;()(La0f+DLl9c?xtvOqVt3z;1@4~shU((7M1&L~)ar2w zm)qn-)H|3gKC5NjEd1r05;0D4u$izHM_rxv3xnLw@qG z%_FYa8<%cin~qZ^rdB^xX#){78e=k@j6ZRjr)J}#WPPfl;Djf|A+On2yqNBidg6|k z=v`5?ns7~4g#*0jx_Zm?r|Z@Uh$fCT1T+>jV&`a{zP3CuldGdXBZm4lLe0Ez%Oe@} zhF|4Lqtv?9&>*C5&93~U%CX>v zS3snK(B&5mizGRim31g5^hG>`i+AkSp>d{iy3@|jwB zzy^0Nc_+12V*d58gM44hAxkIn*P`^TB*h1-<^Bv#wxp`nJ{R)}G|u;*ALnnL1A{mO z<3tQy$^F*Ga*gzASxJ!JMb;0oR`U`cP`V&uO$M55l$4JRf+#E6(#aYqZ`hM^id}{+ zTg)!qekETS`i4v6RQ@6=Bc#l~n%c5ti(MumKFBV@ zPC=wOXPeV%K)d_2G4DrrJ>HL-=IV;4WGP{9PfE0dR* zQG-KRSatm3T^uVo60F8Z9Q}o6{+2OZZGHx$j`E;pMsv4~quIQ!lpFfa@f#f4X)<$O zF>4UnsR(vCTSr~Ra4DDrn=mYpTwcDNBG>w2S$qj~PxspIa}^SPE0F|GDS~`}rP?<^ z)l|(RdikPHb^e-mfx_53KqQ>bXQL>S;WW;ays$LHuykgq=;05;AsULnQK}A$`=}n- z|F#>SOZ}wKqO9ChcXL9_-E}3l(3sX})arnxg>1TR4fT_2wdTgJ78*s~!fZkTr{7yW z&+lI)YBo?7;vTB$G{UVjbeVTFPbL5LImWbi{pO?KC-gUwa#i++PQhD3zgZFa% za!u#<+F?%4)`?I(-uK+S7^+!TKdWIJo?&hN*Y5#zJ`YxX^OE!cv$3o&ehh- zrd`%Rj&D{Tz0h8^BBHlkXIZD5$_mbv<^A)9kHoDIqGGM${UC*4Sxtr3K_1Tut6e(E zlUa6nc4SUZ_B330PCWT&giRl1q<$3Q8cL4za3dtD#T@7<|9tb6*V!0xj3c_EF_3Qi z`Eet#k$?Do?eOq!0Zkqg^JS@hBeOm~t6@bIxi%IxhDHIlm2lE2Aj zWA+!4IqDJ##8)8){b?y=&ePhvRaNrZirwl2>RKy&x#MIZ_cmw@W2p@3-}Z36L|^{6 zL&1_*kF>VYigiX}de^8O=@%XNyF{({R@$hLL-k2M3azOgTkGN2PA6x%lM%cy4e-M+0t!X~w|KL;op{FtE7*Rd8aesy;^+I~g)`X0;KWAir9 z;J5I#+~co^pTC73MI<38v9m?QMC%b%l9=EHl-j_^`tbm`>}*(wx+rz9FH0PlgzZ>tnGk$ zmSd#D;Z@6PP3A$eT}yU_v|t1g{iVr z>tZtBnNujQm=fRuFJpZ6J)8*j;1oRe2oC=?-#ZGfp?`<7ZGLH9Qpe0!c zn1pmT{{oJ*@H5rLg3)(y-kjLkE;bLKqaUbWc(FhFqW2nvu|;*pq?zq__3Vi`yEn3L zXkK_UA(_Cpy7So#05i(pc6K&dJ#8qWe`^=o?{ZwfRz1BX(lMI`XYI3|0jVKWwn^p3 z&>YeJOh=2thyf>gdY!iQvM`IyU@YKs9hap<#;Bd)I7`%F_S0vBmhw}>u{>s9wpv{x zCQ!~gJ6kP>ozY0%x+@4&w493V_hl2X1Yz!`G02po9B^;Te`lAga^gs3h$<$GPra;1 zn?T@@j_l(S{oN8ttcKno@)55(ZH{qX+W)$XIu>9@W1`>6&Tjn2n2 z-xd;gs(gp*$J73w5%|K^IKrj^m%fjhSF0Fso0x&7+>Kl$vl*6)0A>A6$dfZQT?(UF zq#1XBcIkn&Eo{z-guO~i1qUN6#WL^@5oq%0EBPuYHK6Q zRm%;>Gd!c2cACnI{-gBc)4GK`%QWJ_3u6z4cS-Z%#a3_E1==tZX_CIRcXYQ)kQ}U8^xI&u@m(`JPqp!Jm4lwe^D@W|+j-bsV(G^5jV^ttoZf(q8jK;R*mF20_!$cyfa|R~T`NP|}*L zyAWAL>zFfUY3&(;pkE7DzkH)#K$9w{yW-X&{p=vdU^NCHHfaODNKsV+P;dr>l~7Jt zKhSqI#&^%8pMi}aW~k}r@wzNBiW-;Iu{ZmdEVgB$=iX-n6Tc$Oz7Ch~j(DS5?ijwIVmw&jmqo+636tYVlNz1Lcerjf|$?n3xZ#3`zz(JO==&ijmfh z>>ot|(5@qbcCXpQqrSOkaDL8^x1i5IfsRPbA(&PnAEAHmJuBj-e$JIbCu1FTK(oaj z$XZEElQvt+r!Lo{l~$8Vvh#2rv!$lVW%M#pCpevYXFlV1w{Yu2Z%mr(muo}^`5|cDEYv+)uC5kVqxHOoAR$7sidGxX z8h3m#_u|Fz^d}08BJ;@-EvL2U+E8jTcIzk8UuHYj)#Jk=SqQALT2WZ_$jQpG_Nnfw z!r~>Thf8DL8=+mmNppNuizxHs&U7a*Czy~4)2{L-8Xj8NLMUX6ssf{8PBu-H)m3u0 zm^}|%QoYUPXCMus=0^F_j5$>rF5(5lCbR&;|9&Hv`c3yuCFc+q`pjob^tx?rj^Zm6 zZSw=jQ|nhjh_%OSY>Kx$aM}Ug5zJ;a0{_nd>$LJj2sikkbWaS#fy5sDKSj8{C-GW#&>%P zE3c(R6`ZUVxvVuhr*VvNTCbD9qNmwRz*_#HTKUSlS`EcbB6uX;S~OI$1~Hs~%3O?> zVVaGC!aOa8`Gw!@t*YgmA1Ws$c9)6BG>XnrB{PuF(=m_y2;D;*R3!L#^NH)SuWBF#jZiFZ5% zjHHM62I#6)qYO{fH&v-{#ms`qsOq%Go)As;9H2>whs8lBtTbN2MU9be^FTEm1} zrfaNj43W4B7F2R zX)kl$`8H&<{LvbP>S(gnFb|=aQu2v70;`oi<(u=CZWdrVP+>rn(IkhqXI@H*9M9*q zA5Gx|wVTb~0^N{z(Um}gRzM9x>VyuwtzQB~^8crPB4U_A1`7np0)bHaie6g$fyoN; zDD|bcvblN;)jdO-WV%|q7-l-wJz#yKKvVJLxT-2$1^Jc8^q+d#EqD4l!F`>^lyy^R zLyPZUBWvTVQ?ey37WcYEUAAaUfp4& zh)zL>0HD=B1s?=}Ro8&+qOds#kZi+QWcO!h(BC)=?_Vd=uh+J~%gI(huSnIOCL3z9 zk7!48;nb?Cwf;DU?(*f7d!Y9@ zm&=!UZ5+GB2NgI1J6WX8*7!k9IOkUdmlEf|2PFg_2n>eEgBHuBSBtcA?e1(+ORb!a zS;3RBGG5qoyub;(wZBgOUyqKBP|pPW+>6s>%UXUa_oMY5y?k_+H9tPyWl{1{nAJJv z*EL^+ev};Ze0{fXholP2O!a*rk^8)MRdR||b9gp3J48!0jm_%Bt`VYYaHLJxG!w{7 z(yU}rmL60ahM#|nX-tT_U?T^y%}SMOFO0C$VP5^Ff&`eE8yV}rqdK$kzqid_4bmd4 z$TlJs*dWr6kIG?guKdZw5Cv0u?|vfQKWCx@8A2kba61Cu zlqeg;)22We-Q&y!ohi4bO4P!Wp9crGW%TZUu37^e6Yl@lF}aamABJ8c>s@%G$QA)a{yQN`M(%oH~O?P*Q0+P}l z(n$BFyF&z|6iMj@NeKawko#=UIq&D}i!PhhiwEq=kXHz9{)_N;Qfu^P1{`_!&pnsfSFc3+ukoTB7KMOc~vG$I9)6 z6IO8u>=N?`yTk;3N2hlJ)2kRuE};gLVb}?W&%r zN({6JNrtglH=Q{g&M(H6oyZj9C_EIul5;n<^yQ9+9!1r@RFGC|+*UZFcFk^@tn-o{ z#G)2xXeN3o*3#5_z@o|GM>%!?3;9pL0~(!1e{!|GEic4}{66ksVoKbeu^9)#h_U}g zGm6RSsD!TahNsYPgvOT@ERRB}3)FM#a+z_*VOsKG9g1j*_+|A-##*MONuux&5PFds zQCk==ksLvhL)myYC0C4LJT8W7Ty9JeoHnj2Z1d`id;~_iabuD-ezwXEUnHA>^{Y>g z?}30)P4w=6BP8*E=uCf|-g*~UAR4EZ2sC!;Q@SmNA#DG%@_$O?;Gl{p9xZe@ira;^LQK{;xCdL=~MR~!B~uL|A~r~B;8(FAUt03CJzf^=wI&_g}=8>~6nwUg3!ft3t&Lgiw8 zcR`@9_sOVy`IjaJLQ(oZR!w^?h>g$m?$eCcrwKF7z)H8mqcAoAmfH>Q`ew`ecJuM` zb$^Tyhe{wp{?BUs)uDqoY(xry2QrpGPEgeEzuq1eSylYHpO?p)Z=KIKk##WC*^@EY zuTj9bV5AD{OS^(iG-CPTdCvh?HK_ak;-{(qIpbHe$58+m`U#`u|1#<=(4x$YVZZH1 z5s!KW^?A||Qk?O_#qCbTdRB6cW8knX=bCK`AnM=GxBZ5vEn9isdp?=AZ`Et{D;mW9 zzNXelg*0 z##J%3Si}=LB^i+UeLKw2CGp2r0pR&60sanfe~Yvwt}4l^!Gmu%s>4qE9z(=45^Xlx zsRC~-=6espeHzDrb_M3ic5W3zw08uazwQ{eSV`?H7{R9MR$$ZD+Y+f>q?Vw_%ivJYpzh#RzY9TX-6>fB^54@!aZ=+GAKI6g|paN7;vokwyiWGZ!|cTCZi?a5>WqZ6snD~r)Xy-e!tPFyDh73zMXTSgz# zt}naJ2h^^tB!B-Ha}3z&4Bsf%aHEq4{#G zYvZzz-eGN5?|fB@d!5TW^b3J?_t+CU$+1~4SGbe^p{B@o|o)(CHETYQj%ZphIAY6 zH_~Mo4nKXSzF>!@5zZ*$Zay?Ey$;_Tg9RBjz$!H{k(x!T)46 zLm#Vg+Oeh$gD|ecw66-g)gwprc3~iu`wYPSUd6aDJ0CwKQf7AHHT3e#sgXr5{Fl?B z@lofI_9H^U8f(E0BjIA{HT53<<~ST-Sc3{LZb-sSWLX;n-78qp&;@Xzc26N`@|ftV#M2@nmrVV`V&;7m~?&BH>2lvPWG zQLidYc9suNe~2DBJe8!WedQ4qs-uS-xH;Bk=)i~Di4vv>!W9f*(}V2fiGzMMZaq|c z=pQ0Z$(DoD$b$HAX^d+GQ!I9dE3Fs-#^L{b^&c{4l{5ix8HUkX=RdMCKyVkFVJCaZ zzeb}!LMxB*8Jo&AMQav5QRt9i{s0hG|L6asBFw;ulK{rY#fZ?WXhS%9)1}KQ0`gSH z{nxetn4d;fB;S}Zc9F|#YWX6Zz=Z!{ss8onxXFQ(o#R~y*7BVO+XGSrBUTt)+E|H)8hd80^%z7O2Pnj>gblcAc zFixT@$JdF2u43=LcRcima7`v@XafQ42axRmh87yq|5k}eA(S!wMVV|~FLeTEt|?<= zCQK2K?(f^-7hH$r-@inAxuhVs6U+4*rb%lkuU+*EZ&2-ZV3b@)oToL_$8?1b4iebe zxIImF9nw+pq0A$)CPicrPXRb9t7+A1(BSH|F*;9>r$)G*gU^#rQeXiaT z=1wD|)lSPqyf@Y-X;o{O65I_mHJE5OY1{>XSTy%s0S)EfOO+edkC0X6X#k2{j}{!< zqp5dA60|RLd7WQn3I@`Gl1@qWpDhetr(paq|M|~)zobJTx31M)9HcNBS{|I}nFoJ* zsks=q-j!NM;rz7F$8#Z1OTz<{AXo#dU? z|HlhmMuNRiR_zJGys;O($&lVtThn}ARCZDXIsHxBT&tzA$AJwqk%_s1jwoh;rVT5( zzR>OdAD5M5K_sFfV?tkWmkDhhh0B}Af&H6Zz@7kK^ombl_EyjKY?pK^&~ z*T=NF`&Hpt@rTP9Aje#TzEP85d;x)~lJCL@wCmnqzd{LASBd*>($Ir`zJ9!KZF|@Su1Y+zv1-DQCp?fC*PXfGKBz-rt(3VCF1NR5GsohQoy3V57myvk;7ySt?ZG%g&1DX& z=QoT5NyG0VfRcs!aVOC%@*N8i#_A;$^3a>PI5wrWUjSV3xDA#1d1St7tlwmzQ2QtC z0nP#@1(!eluqiu<0|3fnz1&!ly>1G=!St4qq?90N3{US}A^XD~yh`T!tVYo743hvo z%~z52Uz`XKldDaDrAqr)1>-KO{YIp|*#JB^i(N_C=R(?#aH?2f)ai7a4n$NXXDZ^B z-CA2m;{SxDcLA_%o|Ttz&L8`V!z{I^e&YPDnCUkF5}zbWK6cf(-&tVH)&*Smaby92 z#artreO!GQ1Zw+S(@AZJ#aAA%Ob?4&VBLgWl#vo7Jp>iWEmVHk+P98iQ-&!F&{*UP zdi0zIoCe)&M&g-$HNNxcH45$aLq{OtEqRI!)h2x3H*P6b*|vHOc*cKB{7DM3>aIy0 zB8>4O{_#$+1Qtjta0%4VtoBIaPtWK?&ikGbq5HlLm$>m2toQEBU7}~IYZ&Jqts8JTexOw5~S=p zU4$FqHUar`NmjE&IbpA)?F#$8=v8nC-?49VtDue#eU1GT_(5P?dw!}IXKHd5V0Pn5 zRE;tJ9(|VI?3)4iiVI!|we9Mpj$go5Vem{$W*_A&SjE~%DPU}{4ri90i|E=W2*5PgKW^jMx zK%|~0Y5)q1w}0srm?MesS1C~Mg{Lp*HTSB;+#`n`m7N;l#LRTg(8n?uIL{n~?0^OZ z_9^;g`j)Q6R@4z!Dy^qHAc-(N8Z4T@5c^v%ckQBsXI#KQo^zCKV`tS`iRO2CTRmae zMx#U;!w(%NxS-48kGKlyr{^yYca2B_7)Dj+fAxOL6j82s zd5_{rZfqY~%Rws$%lNtl9^b6W>j)Qq)htN#QJjBTb~og3JQZYf&w+E3yc^kcJ2Hgd z%)4+IxEk@h{W@vX@%w8wX1)yQ=_m*(BZ#OBeL@f|Re#1Hgj}L0e@`AEc6Nz-;V~ho z^X2WUc>t?LUR-KN^wq<)YL&oRD^{N^jWeqWJSCNlDO%IC{&-t%5Zl3c3i zHw^p^ivA_xsH93~%uu69jp%*!Y7NP-U!pq5j_oDd&8`TNeU)MJNX)Z{Xh&bR4YLRm z_4Xlh5eJudOGq!?$#}t2Th8cvcxT)`r|zj`IX|s)aBTa#SnN-bH-DR16`}O$yB8M1 zc$nm!@8na>b8ZOo+kcL1o~>gbDX+qhkEVHc$a$f5q@2DmMXYrjNxUoX4p*ljLj=(*D(oXqTd*D5#5%_Hki#& zO)MgWw~4Yc?G9XVn~gvaOTH@@Vq$HGXFnlRnKflKD#@qyt5Lq_DVTb8x#^8Ppw)jhILp^dCxgLeloNAR8ZE=~z#29D z?pOPjc5V6lAj#@w1^pv1oFO3+-%UON+&p#gJTbugjOxYh*KM@DdW00NQj?af*(N8!OO1=%) zj7Z$QTuY^L(f%|Q97-vQkVx*OosxG&)3SPPdE_(COplcOp)YQ|oLb@=V;>s>=5)2a zwr)K&KEiz6*Jx#EzQ>OU%ZWKienh}V+|Fb8fUV;b%}T_4HVIwdNuh5PS67pqD~0_;JA=7eC5X=S6kUsa8s50IjfvEAtfw2yKm zGm8CM)?_NkbL`+jg0B)fYblls)o%>R!&~3lD!qG_L;BC2y@pk+*Fo|P?g~KBId;RX zfD3f~0Zno1L$wAbjQ4eR-RLVUmQvx{j%r|#}5_C zJS`uYzzYn9g#y0cy*81KX~LYgVp|$Lzc}Yo#|9fQ1RqEUTY}4DEo*mJBVycCClebA z%k6QAli*Rm67br0XF;#@ul6`>e2y{NR-w_lmpbRKWr9&P_!7OaGiWXMvBU7?ZO&$( z#%dF%^@H;b`S|DrW;-7pY^c+f^gRG5JaL?LEIcUrkt_MQGISTg(nmXu@ycw`7~iy#mB_-(5!F!$~DXAT`j2^3wdrge8>gI&=-)$ZuV0H`sAJHMdI3M zFr1#47g&}~I<68dC2r0b?N^lUG9*ZN$LCJs1dwr=oNGxQ*{!3fImEL2^&{w&{| z%M9`US=D)1cN2UsM0He&8M@obpr^|sbp;N3~7L3t<* zwBA)kyKi!$dD>fyX=$(ImN*iPNy&HyXfmiScr!ocHPrInO{0b~kWGNqY@JNqc)v-d z1LES@^zE2vQO{s*uDX~)1t0L9a`~u*OrqYH%>kv#M72|N(L>Z&U9k_V)3ZgUSSpr9>rRcz%ax=#naUwj`JS%kD3ikVRfjv79_sYHcE4P$myM3cLlfgB$ z$VtC3kasj5o`SE*I4?qZ%#UzD%ItQ}9xqgRDx9u_eJ>cen09jDNF#%T>@3sKSv%?2 z@+!sh<#QhW9uvD;u_^SWcJba0NwnjO@kDltm}_t1+t1lW#Eog=?WTiSKbN4ZWP6!) z=@tK7pql>?jm||{riFl_-v?LWbs1p~N7NxNBO`KjeGjzREuaO3Ea^5eqV21Ce@bnJ zch6^arr7c(J@&N1)ax;74^HMrROY{icJQS({H9u5L=&Lw8?L;F)i~I zAV0=6xJaK6YI2Pm$D=Uoa?*`2yF^sRN@*!=y9c5mlf#tEKs4D4oCLsWS z{WSLtLlO*VK2XNE(g-sr^q0 zni~rgnBaWMVPvq4q@|>*tc!j8Tae+kWkshV8IrrWws)$0tBa=A*i{bTFybW1SqG7O zsxte7tmn0m&5mTK`pQk1bQ{0zOQ&XYMQ4A@MTBruui{MTi;{Gy*f?Z{2$1KL`3MJL zVVGa%LD}R&Oo={|5(9XQ+Xzoyc6hG*pdAotL{O=N1=M-1>Gr%^b*~8B2pCigwPHTB z4`s&0S>$;j+!=u9r{h3RZ3|hu&|?d|EUz*IwbMQr=aTB~;Ul%e0eD)@Z0F$%$E?Ii zN7h3}*Q%PF@^(M1X@)CoE3@_V&Wd2{V>^n<-j>PAIwKa43e=0L5#Ucql*%PcM@dd(>-}v`(5{ zcsAaQ{d!ng_|fTx0%7Q^nL2OX;_mdr@)wzQEH$iUL7oORj-|>dc^55x;UkGQnu|$$ z)X1m6u|{rKcqT(8nlt4*NlT9F$^L>>&I4Q&lax^IbQDj#{y<#Xig=^nhI**86Jd1$yiF@yPLY-w0yJ2PyBL(B`$8+aqNI{OI7yniAy z{0&F}0#`tIFHWBzbE~{c5hLFg3m8Al|2&XiK9iJ)x~8>Su?*A6b(>K&C9WhM{xQ2y z%-9ml)uGF>s|^N5*w#f0IUIcqcQ}*A0@=iQ?2H5;3_2E4<2WwL`6+!=w;&=@Au-r2 z%N$!DWgam9(B-h?ZU(5O<0W6*4#OegddzlG3BRZ-e8aXJcRu@-V{80Kt}V6ci@pj} znlais8eW6YvBD}05$Tfnb&S8x3J|+#IublgLhU1w2aHK&_5gDPm=S=Qi_oWPHHIsi zBbso5xq4+-`Dge(`TYLe0C#B}X?j@HeH|!Q4kdwWgq7*;)%t@Bc*XlfF zF(_6$PCB=%OLt;)K@JQk;jX$3sAZkI(;G~kDmDr=wbms!-!9fwKH;`fBV6yW1l+vA zG08PjJo5>`kmkb$2CNYq23|qj05zt+QJn=m7!rR4Dl{HDP<)IMoEDlVr?x`N^|n!% zqItTK3>oA*fLlJ(R309 zifXibuy!25#Vl@HJJQ;f$5@-FXNPsp7(wK@!=xVo~Rd+GR@vzd* z!~=<_wAveE)*?zfjKvkOEV09N$c%rb{jM=C5RC>go;6;G1;{H@q#3-)@-=j^9T%$c zwGK_~=9771SQBOWaLaM=@rv;(M|^RKli*P1KMUWl4(pIYHPFe6>tyK)qjCA?)-5Xh z_Ru4(o~cr90U+5&74*l@on$Tj^ou6X*rn`YGQVF6NzWPLlxhOuT++SN|Jyzu#M89 zHjewBD}k$%r_MTnF&F49kXAI`oP00_jed!8K{lx%|E*iiU&5EoGtAp5^KU&phCI{5|ss65x-YaLo$!$QHKHwbF9k^x&yO7!#EKr${$f_yHXYL zL&ILMW{>xWQW0Im@vzb)YQG({!H6Bm8LyDXlwi&_sMS^`mU(tKai(Mqf*@2|#&xsW zE3kJtgX9aNScaJ^xKjOvGD%qr4pzue(aw&g-;gFnaSgtlFlXEZ)VD z3~3nECm`aBy~w+aV2e1S(VX^%dzxXI$Q{1nGPJtaEd>@NRPuQD;R`IrNb3BVEq>}O z5x)AA&#vXu^=jerKF;s%U`;!lGj_QrD|R|CZVTUaMC ze$vdKVU}P^{7OMnQ$mAtc4zA6gH4q!+Nf41aU?mP#ru`2Z4S2Y>JN4Je>dBJAU|%t zUM>B@)^&-3mNU!2?eU6Wd8F0+D>!pYJKdebC|5@K3Lov})P);t!RFYSzPAb-^s9d6E$*E1T2|dFL;ug`Cf5W_NSNM5hgP`6~v<>;jO>;dP?Zk(+1i^?X#l zuF(H6dO3;sQyrl;4t*K2mpYBEs+9BURLoO+@CzbH`l(}Fa@i5!KQnoXx*R&;01A*q zalEm%29F;J3e338zR!YoXQEm~V&b?Pce>e}r$N1Mk%i=0gfFY=di5acAAtB1>HhTE z^>eT+;RyMJrllqWRdRTmG?ZqS+t68NaMbiN^>#j~V4r;(y;z)53@fc?O(MP0Q)>;~ zMj$jEc@g<7UGI)I-*4qYgswxNIq9+UZiL4DCCmc`kmKqKpkm@mwyHWia?|eS%{DQI zcDqg@c$E?uw@9K8meH7`^`?4?h00cwN0z!7-2>yF)4zLl*!=;p4Kt47lUI3)9So zA@un&P=H(5n&)d8jewFTIiiUPb`;W#}t^By4?IN+dFqIkj8wC9XV*?x_@=!?* z5ZHtn^E7iKORi3AOZ7l6q7eX&mu5%pz$Yzqv2cO`kLVZN1?T1nBpe?ip4#>1sMdfG zsW2n=yiKF$(vVLnl;~QLSYzB#zcA52(qdl}$+jzNc?23<5haQZ$!duMHxOk4*}~&= zdCTSgIjF(;$;;J*<0^+u3HqWv$-XkIQeOcsj;%ds(;?s;_ekV)93fS!OZX(;E=h zoTo>jQupsB(i(I+ibCXwcGJc3MkFm(KbzNPf;hecgJb{hAf7}62kGROvE|$}fccLV zfd0W})QqxYkV52WH91uQsIRb0Q=i;svVuq_gid4RtBZ>O|4V;XkP#bZ<7Ciy)9STO zH`K?>s+N6>jo5D-k<_+_JkocGz1M4*{ds@=O>IkUx+IQS>yoa9>od~&*E05<#SMm;E7WP+i|aP`jQWG~4GU zxD?JI9QYYNtv}G6QvLx%uwk@!>;QMr>vG^{K!@{zW)26e#!z=)wX(w%bV5Drkbbd{ zTbZW+SvNqH(Ey~7;=hV7(;a8hglwq>$W=rn7FbsV_Ocb&-@1@mH+-(`B{K2P{*^b@TekG$YJ8pBZmu)YnmIVqgDiLN0W`wtL4UXZk5Bu%B|NLSY*! z40wfKy`)mK~us{NCx_ z8MHU?I{9cMk3=wr8a-=?)UE;oB3e#y<6v9);^K_G;xnF5lMZDi5Jc762;)Ifm|%5$ z*)yhcD>ho2LN9)4EoG^uCsC>k%SRxNj?ty=E0b#9&G|Qi|29!{U;$4jPxpAG5O{7L z`w75X59T^4(!3kD2oqvx=691q(h;XIT^-r`&PYm)5CsdGhD%j>8^yPDbW=ib6A~1% z9@>X@Qn>EUO30jCLG#E763_*0Hp%GH@GF)gakR+@mzaD{fTd4I1D<;Pl20e&PpUtACiNHDkF=&p&6`~osuptmi{9Br)9edZ&@Yu) zqDOS2UHy4$6AhP*P^ZSi7kx_=yN$g{+Fdollk;pttrL3q2Itn#X~V#H#_5m7fCbjc zB=1Pdf4uzu#NS<*+wq0i%&ff;j4Os=5KBP$2RRjMcEIc%IUP&*h{|}Uxco4jK5pqe z9%>KWg4s?121wd3p7M;@O*vz!O*2i3kIf6bZ>>vM%~?gKY4^X!cs?YBA;vgOG*c_c z*{k1cuaS7#yXyWSK6Q2=A4q`nu0pjZDvq%=4$c4N2m%k}ObvXwOTHbRN;*EU8nha3 z`iWpLY|CGkPKOUF_&N{uE>iBVG# z9k-Y9`BG696~_z5T-BBTjmD+Kv(tBS&lg1HK4pzm6wlkS1mcqAKf z!Z?}CJ@~2mKZ2~klqG*Ca;b^@X-ne3_oMp)I0r7U9vIG;Q#zu>-+S+@5U{r0l#P`5LDw0{+3wuD*w*e%ZX80?PQ z2n;xa1P1)(ssh&`quIgTnVfg_JwV<&sRMvNo9M@Dx5tR4M$a>#NBlJ!FdR7kI|BYq zj%0@soYOaG%g_OW31AmEVpy^d>*a2KqK`m#3d_5|@;kcQ|H!^L=ctKWi#BeJ!9GX; zKbuZjg=;2mDv{J&nid{LsI-;`>4C#xyE9mfUe$vD&;d(jZlk7M3w8ss`oCQ3%>VDJ zA!OiD(5U_eDrr<)T<`2@lf!bSiS{FHsV}H+tD30UoABj$XCFX=FcIXe!cbZ=SQUq~ zR*>a{g*KjmIS?sI4D~p5OI_oeUkm0f ziF>*)r<4snHBXDdJa!=chNf97Z*^zpcTl>xXp^P)z2Ce|tr16KwoZO~T}H<39iP@H zjiWoHlvjS3+v+$M;OBSR9S?HGYa_%@T&B1Nx#BC`V+*D7S|n_>3bba|lr zfAG)<{}kZ)|ET+U4a-}YYN{y)=|^oCY5c|t=eAtHJ;6rUTG|cz-8D$;mvG`5~mU8#OlV&<7hvx!#Z7Wwd_dmz-no4LTg3ge@}zc|%2_138D=^Yo2 zb7e%`w*h$MnrpRWmEw2DO;55LY9Xbj-JNo%Br8iREgxqTqN)+Naa(XA9{4ar$#X0M z-UEZ5+4DT_-Y>~~K%K`}kssGrGj~C75tyObAat+uHCz}s%T^)BmpO20iys@nyrvgU z!nvM5d+)lJTgI!N>$j6k9n<{0noJ05+j zPi97J$svJe6oDitf)R2s z_{+BMl%xc=*hggg-0)Uu(rWo*yC%QN1a?f^0!>!Me80m=D9i5QfOFgN^RE@Jc27KJ zpV|f2s2`tWh}n#;Au%DR%F%)tc>ounn7F_|#=6GlN|T4RFavepQvBM*r$4OSmAJZ?XR*MCa2J*tJmKfQ(f1bAJ_Y!`_vy%B@_%ndUA>BDiJhJjJlvr`1}oO z=SeG9*3ENs51Qc*$Q9Pz>WqmymAV9BJzVxb9B8+VHi5nhNpw-GaexCV;miFmJ!3rp z(o29b%cp_y#ry}>x_~xkqjU#$w$n~rm{cl=%1l=1lQU6&{{~3kbs}z4%D94l8oAJ7 z2FDMT#JP)~#;zmIS>XERxb6ijT`{_!4Lg;wV1smY@RT59CaLhQ_x!PBsk_r2!V6(i z4YW_1r8DMvEn8yYjnrAisMV>5IzN@MtFl5-Xu`tDL!FL0$&G7B}Y zeM-M)$l!AbocMx8edfZI+*ODF=v-% zr<}5DdOnUSgU<3%ct8{Sag&&B^io-LVNQ{7Kg+^BvkHp`XOs#_0OkNoS~Ju6mM_zf zu~)vB{`WAn2h#2Cs9M5z?FYx`jp0fxdVTVUy+-VaFNbaan&sXeaK* zO%E33f!_>fmb{u>AXL(JRpFt-I^*~Z(5h!;q$~@VxCJg^o_$$yvz6eVz+|0RHr+`( z#-{lZcL1jZHEA?gp|p5|y# zm0n7E|9T_Vo-?uFg1Q(bLvI@~38UteJx^K3(bD;=aeQstBw{GEs@I7de}h?0A5t|` z>&YKSrfp>9kmSwS1G>dfx?y_~{Z+v!zU4Dalpvb8no2Vr_lJ*r~bjJO1^bzhKum1%$N&+V`+@+wz(lXihqJK zD59kr;WfvY4qh{D^Bm;>5(zREXlbE4{NRQeXKQuB&}mO92UBb#C(+Jw%3v%!RC5Ya-j|@M(hO3Rye+mH=##fLH-Wy&{jc?&#iUQCoGB{<0bS4ug z+U;pCJ~`83rwtANkVp7YG0pP?Rq0O zmnl^qOqZ#g*@6qla;T)bNVA4$Lv9+|f(}kX8AP75@I5!YfEGmVYQ0G)VRvV~E8J0# zhI0)hjBy7{B`dRjFgZHpfUd-!i8N12!i3LOKpCAqAHxJQF#V_62QuL?0TR);v4va` z?*iJplxPVi{tckVLfDUXzM-aIW=DcMm$%a~OI2vY!G-)uoMJP!( zRzi3x*eL4do5_{$faaxlEJU z8%3OO0SJ@tmrUw?`1#X9B;9Vl$#xzzkA^h?!m7nL$iY!n{hW!h3uG=80UvYT+oRJcok8Eb7N!x($VWYLBGS(lKIYlp-geaG|;h2P6D~Pg!%JY5+-U)Gv zE0b>UiA803fMIP15qT&xb883#6OvlUb2xVFFgUQBZ!})N#DdMdG5p9m@6l77 zo?|aL62G%l29d*vk~j8xlj*N*Ryg~xtQVmd_ysAw7}pLJzLNgI ziNzH>j&5`yF9*KVH@tc?)9#tzjsc~{!L+z(G5+JX-85IP5p!p?OA`dF-Yax~!!bC0 z*e1daY6k(`tGC|@Q4F-qjAyi{mG$n1Y|l}qTZRX4uYo}TE6j{c|HmO=haHmh3YKS# zsR(okc5hVP;}=M2A^}&nDS}L_onW8J8;TV<5TpW=N?ef~t|%pmiedGl_Pw_`uR8__ zqA@&ZFpB#PLKCfsfD$ygTW*7ZWhWhu2jvN^sCb1Xw_~_~C|YOeqAuFDq$bhLbNM1; zigx;4OP?g}>Y{kx(hflPUL4b5DOy!eL4t3u8UC{%T@0z-0+&Wo$iJV?%|@5AJxK@} zhwp)Jj!#M=ebAARs?%B02(K(x!;BHE9z3EBM|Lqii4P~82M;Y1cGoL1DtU*F?xXre z^3+Gwhia(svu>DlvU+Pn`mQn(!jG6>ZKCj09XWl@u_=)X4!Npod=CZftS~ctoLWl} z_z~`cG!){u3Dgp6{S*>{qWEJYGFr?{EXl;P8)*>!#ZjN(5jK3;^cyg~sX8Sny|gvZ zfi>JR<%yI+W-`Hm6z1~2U40`G0SXqlwrF*lyS07@0NhB&4=%V%CD*Z1! zAQD!pqeokm;h;DF=^RjVKfD_6LiT#I&mH?}!`dA|5Nie1us}!_ufG#Fsfq+ME;25h z16s0xGd4spHOPws4!4s$NG0h+F4roFA*p_nhcv2L`2d!BVJXB-c!QGO6e;>rS~PqM zBy?#cH9V!r!i*tM-*;K?Szi%nOnntV-Q@~cl3TSCB$Dwsn98)l=;L99+PK1Ug-})1 zU|ZkVVZabL497xN)2*9(4@F9rqhfX100S|ru)Ro!xm=BqqMd65uJv++vktwnk0;#- zk9U?5C7c+as8V|(G*JN=J+i7vRa+Pyr)ZXy_^y1bA}_|{YJ{NXJIxas-{eM}H;C38 zyrPd(WoA4|u+R=Q&vw29BhX z(4x`YJ%A7mr(!x~F*H&hRT>Sy_ z5ebA?o7yu55=@;ds9>Pv1PPM$6Y-L*2K4wG#}sDldzl%X^F}_uk|A?)WXoocV+Y~1 zp*YL1?BD1kQQi)V2W}P}*~kN1=iGE)h3FLJX_v`K%*!^T0mrcKn#KmwX!Iz)06`9r zy6soi=@gL8zd$$tc4m8dnLO|mR9@0vZK^LvGM`#i@KFmPj@InDUP=_}M7P3<4jKk8 zUO_h6c!(K(tx8CnA|39D#zxNCf?k@Rx3=Vwseaw`Y06QJFn0o1CmB8aT8F`SGTd`h zkKTgJFgie=0kqpXy9f^ju(r6@ir;DK1OLB%f2&2nIr8!sXlCbL*Y)UO)t+7sum zs0V(Sv@UHd*{%8u*I$1pIy-1(-c6`;|+&M zc*$>DOQeFWvC`@~4?oB^X~*jxJzW+rJAOKW`0J%p{mIet_T*2#kpHYTfU3f(9H0Y& zg0tp5qjm?9w$FzRJGfi>`5O==1v*cL;sD+Ptn&MS6=1Ua7nbd=l9X;>Xn^>Oebaov zC;#W~tO$|s?LPnkYltS@^@-afear3oI9E_ztuKHX>Y^WQdxV!yA3Or{0&W24b;{tU z5)y$FN4W51%B!LJ06=M^P&2tq8jrdj^oTgPl(9W4J=HwtkV&foE@V*xMlr$kpmh6@ z`+%nwjBgS*&!Pm>XVqvSzz6|p72T4g_t57#$dRTcelx7W{5+h5quza$JsWS@0Lyka zhc-fP(Xx-hUbyS)-H9bmPf0vlAt?GX4w%$#=mtxdq zX@*wxrojP&N-HXKEAa4=*;TX(v{)mj<(bi=MtD7xm`bwzW#aJq@DXWAbwmo{u(Fz! zHkS!{@d~X9c(5E%JrAs>cQCf$3*YMyXg`a`ZA74q-wV%g)Nh*XxXXJz`QY*W>YJm} zddt_q`KG)pgS&SDv%+%L}l=@XGdX2uHt>(ZNKerIfRB)ND}{LYw*od;P}D4JfY<~Ly1E=^d{lbI8k zdo*+^`W=J)Ng=uh1A=BH`;^lcw;$=!1ev-tJ7eJ2(dR7bRsd+f8yI+bmyC1Jlc_SxPim^H$JFfn<&7}#wJ;~4J>sy^Z zOz)Oa4e!B;Qm%wqkpt@7O?*RL&L$~VNE3orhtY7I|E?RU&w4$VnfrScW34u_b2I<* zA>9kLhO1hW3=+fT9BBezoF@&sY{)0Dxyxvp3c@q{Y9(ocfo%+ySC1yIR4}S%GRleP*m4!=+T9O>cs3d9jLXwa)h50Mofh_4BM+zu4>R zB8_(cXvpqbgMKB-Q9?Y zqyh>eCFOU|v-k79+x>fw+WJ26!5kCp_ zOI-vqirRZ3dEs8?tlZTbBFz>nas-qrzclXY7|+nyV=({+)id|i(CD%Y8oTtIm-l{G z)XwUww>(N+GU;n;BR~_y%cGav#`mxX`f&GtEdb4qMX(@kz6hmOVSm5I*!i??eXnMb zqub#q&X{)mK9b$z=u#5XIHb^P)91dN+fui^PSZ=qOuv1@DYWcATP+%tTLW89WwCU9 zg_4y=ZpHYF?Rj@cOpiuNexErdg9C$RG6dCa(|N$luZX9IM=)_0!%%*4{boA`pK4-F zAHTvZPWkC~bA^DLw7?Li3S(1hG%*g(H7d+n&q0{AAns8jzVYaLH@o7x8q!^bO3=c% zHBe;(++zot<-=xsfR@0tz!LTSswFUbW?)NQ1TbZ&Z;`9R=*q7s+a;S*HZ*fCZ0%{IRgx8#i=~9q z@;V>q?|Mtaye zJe5Ms;25povUWBy2{2{vl={xBYh}pyBl?W zFJq%VB;07~jGrKvv5}3yB?WCC##hf{_0)&RfUo`VqA$lE`-6Qj)3n3FHx!uGMW{u) ziD%X)piVF+&2hAH2nV>S{k@0zS5j>=$MG;(lf};RxXtP&nR>JG^>Z^!l)$%@-?Ux! zCdJG&`i&57$F<8r6CE$WBO4_Ee9r>KnsXaE%E?TqJO&N&dTBfUXmvlRUoIoHehjx; z@aDSs1bT*Ud+P|P5`oORJwSE`%U+C&~9}--qJNc;S&uP z(a=do)5usv)Bfnd9no$h$=01>NoJ1DV>fGd(+p#@Qgcrpv-XT5Ivb_-#-*l~EAS#a zQ3vZgx7XttHCB=`O}hcEB|V{Yjd(S0ElLZTlA#9OhFD;1lMsVt0-K9e&;J@QWnH)d zGgS;pGGe|yLtS+h8A{1>i8B({j!x68PJ6?{dOm2P0*#F@dRAAHvOXxb{C(7wK zk<2K8?j?;`YFjdwF8cICe17K#%-i(vTpS*(3z}cmpO!q{x2op2bvS2n^<1XTg3W=h zHm%w)cIig$bM1s<#wXXGYyp(EQuu z&oQeev{o{Eus!o9*^>9{`y$vg=@=mE^HKvhnvun`wB4N)4?Y(&54SR_0YOGg?%&Du z!1b{r#Tt9Ehq?m}>~qF;ov$ve>fe9sH0HWK{AHsu^U%IIyxexDJ(}ggDx6Jjw6C%IUqH$w(y0J_$ z{p?u(6uDL;2yW}K2%>(Bj=Z|!zAjnVD?d843A)a|O(GZYJ}rH6xkdmkfgJ+}Ryn{_ z!3rv{0?jToYInJqM!MK~rn2Vw?O=SlrHr)N%_`bxDWW`1o4A_Y!t476m?gp1XGC(`65I`JGbr*~THk;k;I#ZWFl5zJUw_d`zmn!X6;4q5HnBPElW9n?2VM z(`^s0+bPnBk4fWi?h`(WT=&>P&Sr zCj!*==M|gIJgbb2=^*!1mQR@lfU8l%#tBz$|5g9|jG$V9;b#5(NP_=pyiw&o0~t&% zKWF29(tRZ#xtu)u6-{nm#Pyo38zT+izVkYHfz?~%a8UAa{lT^9UTw;y+*Ii0tV7c|6_`% zAdZ=!BZYc?2eq$HA*_jjTXsOF*=B>(%7rA?4EgXV(ZbDDc9c<{tStfg?lY~I2;pJL zj8Aciv63U8?_A}FTG4;0TYf_k4o21QPmEPYLt0N=UnInCJ1x-h!siuDo-3A&`WS#9 zGuB&eqw%gA@(o?b^j0C!!t4hW{e_Y#-T{I{G@W>i~p$t0|P|Pp^{(6~EYS0j>mjaCRVDZ)og$$gjVJ238H=AU|v{Qa4%wHW; zopJEiPp}%J#-1ib;k)Lijj*y^2RpiV^6MFnXeC2sC3hw=_W{Vxeu6Gnl6oh zjO$?EjF9?zHLv(-w4Ie{#@HFr8`QPg$J^aH-UBpnF%G%PzX!{VPW;^bU~*%->egxy z0QpY<2+ShCG_b15DZ=>$g1~{Ri{=>=fYjE(M>w79Btr_8fg-%>YV|I9P9{{bX`@z} zLZ8;T(X%p2KsyveTeCTd>Ghq`k*|m_m+Yl?R(i#u@#SK$QM;G3{j~P)@K;||k=(RJ znN}rvt}vF1t{X5|^v&&YI91cNgL|1d-;VFJZ``43x3}W1R~JGT!3=EPy9$T8AC#zp z=oG%huzeuBdDnhZapeTeq_(l5&EvmD?DU%=7f~ie9~vAlwA+=MzCm~JSqo=j>s7ne zeOtn`drdGElLq8v!veC%*}^Jkir{hAguFSk=*tnLh;f;O!b?jg4E_s`+BkOKFp$Zh z(x%oY!J^$OWJAnC1Nk2sE?1wNT0egOrJErG)@XkUNFYr)L=R`zOh4&xJgvU-?HA^2NwDU-8Ue2gkirY-EeBP znK2>Jalz4ef!Mq;EFfRM>J8OKpPwp^@@hn$C^gh5virV}a$)rSW?%>;;Tyo%KaZU?~Ey zU8nP(eu(FV)V6|}>u6cueY$Y?D13YDj+f^9>cvVhRtA^Lq9|)O^Sf^+x0+00H83rb z_}Yp~8i_`SGVNE=|4qu=fNkZ}&ZG!4R0MX~X&Pf=4E&S2r;}1-e@8#?Tm)EcdSH%n z7HRqZnyqyy`;_`p;P{aC?n?pL9}@c5-KJ$%0d;R%5^9++Pp_;L4xDgGx3 zf8{oRKUfd{Un{St+6blK`@D?s>vP}}woyUz{=d!qUk?H+pab~qrTKDmXg2&v!2TZS zUoqo<*YQ6iZ5)OF#Mv?Jdnb6RLa!0$@faA-`@T-w$Uh!*Nn~k6-5tk9zGX6}JO%U- zOrlSZ8N%+#;R>Q`-wgUMx1WBCgcUyAsxmN4aQqGgTDJ?X-P=7(^2}&S_L|l@-tVTV z-pqZjC=9$g|GEHFK6HNPHE(G8bBFSGw#{&$el~s(WN9{u2z|`th#58MCt>lZ)7cxU zx65h?%?hHg96v%X97gj#uo&dq56NKgn|gl+V?NX3-z2S}7_(|*W^u$NHO{zwSLreM z;20%Z+2}CE6D4G8+wdKF{WbT4q39GVv&vn}3ns)1?E)V&XZ6a;V`k;?XV?$t^%^V8 zHE)g+nkL`Wk7+9ps{Y=T;V9wznBJ5w70@ezXU_LI9MjMI%SY?AmZq`E&BMwQi*l=a z3h%838HE1C$AauV*V{k^k)-;L!|MOr``4Ybv0VPwPW>Gx&q4K&-6ELaS!y=WOH9@o z$kBoB4|TVf-+I5k$?apI3blyB{&e4m?T@;oE<>$nuOT#e^ZvujmDuh*KnS+hVsipu zI;j1eBCn1Wy*7R{b)G!z8g8DAbb6V(Zov?TIVDPkpDg?seUh{RKr*sPfrt2oT_fv2 zS)1Ze3K(i3K?cQ1*H3oz9Sgp;SOgDD-!Jz8C%wu^SDSvO?+AVYo!sY^*WJF%nirt= zMl00J`0uwE8Fya!7K@zEO7f%c_f|YTT;PR9<57+2{q0QPrT8Xl4N()*Y6N;QyXoEbC(^`b0nxk9f$aFm@qY_8bgIjO)Pew5#LJch3!6V-PQ0=%Bzq07 z?%Byeb~m{jpWusVE2y43uDki>3tbE^=5X?ijRDF6Z*)LV^k}DCIB7Ov?5;h4IuHlxGNQ&7Rq{veXQ1rG zxhDYnNP!=%)leTi-8g0cxW*EB`@ORepLCsjHPku&Zv^+Z^DJR%MBIhkBM?#% zby*yqnq#6P73~17EJ<;TpEIa9?>uBX;ucj?1|c=N!o;_fw^ditusZA`i?QnOxn5Th$it zhwA$5Pm);95%p=uj?;%*--ldhSlgm#+8s2S*M3`p8g?c!21=yozc zBCE!@Y<+seKFgpS%(Szo=EbKmf`n8mnWqI=%Ha~Q?n)FUh2;8n@FPEpG45wsl%Y9H znbSIR=4cnt;ulOynKZ%w|KI!k!A4__K67z_U&}e}FUEhrUPM$yz=T0yHV4zj!Kvxl z6YQPj{s^k8VHC-zk-=J{??LvbkMxF3zz?nzW$4-K-M5f>PRy@L8eWYYzj)@|j;*XY z7`i^IZ}d~OP0^}q4n%U*hLoeCG~!_tl%fsN8lpYx^VvX&?ylr0L&{Azyo(C?u`L%J z%PAx#FNqL zxLCNaQEmc~K z^Ky#E)m2=)1#BgFNJ!6s0j@V!z=Qa~1aN$S}GCRfPFR#m8hY{{V z%KH7iMSL!G#5?bPGz_zMMHDKC%{Qpq))&}d$ET7@Bcsr8xRu8%e68$%lS?`H)nZ?FxbnvZ!%#PYcbH;nm5GHHgz7|(BrluJtimrnoE zTxlVeQeunuhrFn!nh<(b&g zp_*pXjFTsFBT19HT~|RKCOfOt(cdR8J;ET9azGItX3)+27&# ze-lJ$FtEwZsZ#Avkw-0Fl zP2x^nB&4mrxbtIa3~^(qc$stRxMcn^hl$-w=+~OjDEe+c^A*C&ymOMlnah(us`362{zqM|-`-;Ynxh<}P0 ztY}?`Xf;meLd(2kKV7rsy%ozHN)$hC@36qSN}I@D`*n6K6JeV8Kv0E1fr!tS3y6rY&IP>;wYvi~ZOCgKPaAymmkw5!z|6xOr$&7U}KO zy+IIK5)^6ID@r|Df=AC`ILFcyMHv1_TITv?KXOjGdw0CMPMNL*DR9IQAH z!f;DDgfLr(&stmvw1gylgol%c6Y-QIwL^NEUXd3?tzQ_%ON-1TA&P?+jU+KA_=WmH zj)M^=@(l`KHM{q6vM_5{C2^eZtPCea07Gh+nhZMX{TXVf^$Jb0qAi)8@S{0j8w8~3 zM{-mXj6u?#Djq(z8i&;<+p(1y--c5N#Saq|uMYQ(whs2CCTcD-$BbeTCao2((yde> zIS)d9sv%U({7(B#Odlz_i!4j1rAG%nZsZ$|P}JdY8cWYSF{MbR#Z8|KlCTg^Q8r1H z0?$j2MNYzp3mO&6tRLm6FBwai7IcVEXlTO-@bZ_AP@@NGqnS9VU%#Y&hOo%uAV4y9 z%vZvV{)F~YY*g9r{FOeiOEW!V=(j6I|tO2{I_x)1r)_l<~zU<$YT7dGP0 zPoeDUUQu>fqhegg&ptzX^!VdsdXJA><+sfnFiuX3N@>)+69o~~sT|9i8`U0X_nUJ$==v5ore8Vi}8iw78AQmh~3Hdo)3PfqRM3^IR%#J z7cO0{0+1)^Y%hPQq(;FMXWl&bKL1kT&8d{HA!d4`{e;2@U704r7E|_aczSFLJ16Y+ zEjP}ScSP)IbmdA)EyFRdQ+cH!Pv}ZR$ch^6^jc1`xd;Q1WspnvWh)X{UPe@#RMJaN zUZh2Yaq7G!`KQa&IS(Y*`ESbgmkDnShOmO#`&o7m+GenRz@8@~6C)-zq9vJe^B1Gh zhG2?OtD-12Wp*Pei%}};`I*xMgP!z@&7!rTj35|tLac*h6tE1_s=!XT*r&*Qw!_J& zdS#kQC?&Wp;LXpbLj5mWC7T!DGiLgdN0ukPm8j>fQo&RkC}FW*J;gpQqVrCnt^``{ zwY*=#Q3fSm>)Hv>KKHpifYxEw2@${3xvQ*|Vl9gk2yIeR>V>5scykT|HTX6U!N2AJ z;ebGs>vU?Gg@dP`C1zP&Q|Y{N!kC6kxp(F2_wFkZC#TGA9FGz(ry#Zd6 z1$+6@|2Xi+s#C^t3j&Qb1&Ybf?X{2hJVin-WA4+!)*I`EHgzn1=~r5<@xtf1`l3S= z6yIaMbbMjS5bie)5H|2{oY1WH{oUa(^$strm?x6 zB`m2Mz<09>Pc=_1Uj^D>(UG-Xd~gr6n=bJ>l1V!pxsEMHgWGKaJQ1BtVlDRw^=o+% z%O5PBW(GfM&eZDK>P#0F@(Wve^h5(~K8_l?XY{{U2bN3aEO}qui~_vRpsPaDk{9!S z%1{U8-|MFwB2A?W+y|r8JCEQH!g$UEPd&YMN9O?NELQK!&a3?#1&I7(LE>US*~~|P z8T0(;xpD&B)uX&DyxtXtC&@t1f$cEL>sjTeA2C=y%V7kUZj$Ymvu%fa^> z7~jhA+_(+pgAZY@a_3vV;egxAE0vs9==&)6<}!-{cDXweP7DkRv5Tyx?uw-yK!OQGm&2WEOtWYg5($TzGFFCT zT^;wANeEJ=_lKV>jo>XSXqT)NNC_0^fdf3`8m%pU>a9Q0iWihXDKqX0}W_OFF1fekaB_FeTJnEu|YdU8b` zxRCp>#pe8L2aqU^joO3*|KloCIn>~>k630Av%E4DcG;7s@_38QSF_@Vz%^kVFH{=! z)-J!^eMX(SIF1kr?xKy(M}}Ns?_Jo&bcNeN%>v@d2D|CK$ITNV^jx+d4$HNuEl+i8 zen@wzas_KInHhB~WSNy|Y2SIaQXxejf0Q!gI_fSK(hwG)Vgl<{=-=(w0`z7ZeWtn5XA?>Nt;izLR z{bIW!W4YVPC{UhfDrfn}+M40W(VeILD~b{JKAMLOAN{&-Z(SJTYf$w_j=(#IV;O42 z)%%$1^KlJ3381t7Z7L>t{Z;7i(F|{ax4PmeM3%uUyVbiN>yMIaE@be3Py*;Rz#JtA z%+&usLlg@cqSif2H)C8x_2`d2Ew^&7Z^RNn{TQMr*ym)YB0#@lmDAZYDlT&=t13h`%m;0NHh&d5jaT+Xlu48N^y3N{J;OSjY#>4{pEKm3{^|_zZu# zJ~ZW2^SyeQ$U*E+MfUc^di(9C$SI83H61eDZBCO?hEKJ|*X{X0NAC5!E2WPNKRbIO z6%o%em$JA;l*zLVEFW?)K_-dycF2~uk$Z?+*)>)V;UH?p(}BTuHo!ivXD;N3{}>+oy;!d<%&=3*G>!O}!zAHCl2Cp1eF>JK7iYK(%tir%crP zs!hI}Bq=Ug*PI8_ajW6|K^E#Lbg5AMs#wE}^vn!@r@z*Ny1fRkLyJb85LSIG?1diR z9Now0=mt(V*UW>tYSan!J|^TL-&~}!Ech{mQ3q<&Cb@ z06beVCAS^(PfR!(#G(yMs&*3nM&|*4hvi5Qt+YZn-*aT-3;w!zwGh#G?8ncKE6}K^ zc4dF=*aWq!K4?5s$2KpPDd4hNp{hbF0A&d!kI!?avyVINnc5{f__TExV!`2Eflz$g zIAwI1$c*r&_h?FeMvmt-cu9EnqBxfr9?WuBy$=^7;fVIylT)e?Lj%CuW%Mu&i9l+L zfqme>Xl?YztV)F_tD7N?5fm(>L0;>grYHRl*eepEQop=JwlnKm+%Gb~pRS_6Qt zYm|Wp4^IMp&;CicPStC({%Z$XFgFJ8+81wyoipoe-%rI8P|)sSN%;{muOqhv!#C}| zp=rr;S-8WNrGGvU|Ievj9fm(J@q9y6z~{DrRJF(8y%Rtobu90qfzRFEA)Z)%rGc=P z1K-jZFBAEf&n5t(jZmEuSO=U@(%!_tKX?z1cnnn>Pyo95@5~ke&RkRgk=DEVMVe_i z`S9!_F{h6`2Uwpt{wFaEfBt5z7VrW^8H|l^mZ9!knd$PMM9*I!+<#MMILC6Nz_u*} zJnA$qX!tw<1PoL=G5lX|v_t>^+NkMlzJT}veLJ!wFfD?NdQw=QH2Wq;*gcl2i ze9kIA74!K?GJi`t=MY852eEe0qS4Mrn&S}lXR!yb?O>~(*x337M z$FY~GI(4B!X${Ade_PE2OZs^-&|Wx>$Gdl9cpUjvC7;va1?9x`($4Et_^;P!tRRW5 zA7){KYcDEe6drukG;!^%r~)dU>=7o(F_+EjpVVcTFyk4YUw|s`g=|rC`0~# zC2>`|hj)Mg<6o2N`5)E*$$y`xu>1GJqeP1PML=@*&~a4Xd$oBha{tw@7XX?^@HxW) zoncM9=SYIye|Xt>KTP)f_)YH1_Z$8{*?=aZ0jGVB(6bv~ z{EkuGZ1KAyfCC^Kfw!`(H>6uxRg)o@>^}hh#{O*8@{^j5CLe4K1oPEFSDE07vyfuB=IvqV>;KOP=t_CX!2w!r}6|@9hWC*Ca{_A+2s!Cjf6m zdJm(x$6-MvoSWC$eKUMg}f^_ zNWTVLeS{?0A$lt)OLxTJ)*Gu*&6Z1m>S&y+-ms@rv8qG1*049piK+ts@IOVO zEXg&itr6P=7>GV=RT+V3k^OZ!!+QXY(LY>?CMSRZObeUPcJ5=`YOZ2<>=-|{@fsa+ zG-uLT09Zq?_1;;oVWMkmqi}0Bjo0(*Rw_Qd6+8;OxLJ)ZRsg^Az83^A{X1 zPrn;^&`)2oh8L4dCINW0<2>F#ixG{sbHY`7*EV7NBa5Xupw58ue3bP4wVg z1dl1~wRbdGt1zxhARtDAMhg8;lN z8Z_=d&0#zvoNjm}hWFwlG}6BCi(%hL5Q;|K7H%@KFoM|WBV}ep6l!s_E!ONxIaKlx z)6WEXlH{pDRHSlc5N?~I$WVg~6M!i5vi!wTgp6-j=|zq-^BSUY9_=hfW3h$EAEMcq z1)>s*YHCwd(V`*hZC0DZPDeVQ&9eO_A?ipG`f>B8$YZq0S!P{`LDSLhSQ;wEC{Kn_ z2y@9^nvJB+z7&5tDfJJkYI{c70rMm(68gdLF&7h>I2=dw4c-&<(bRKVbG3r5^n>;n zb82)<@zU;yMS<2dX43DB(qYF+2qNImoje$C}CAjj}Q$b9U z=c2hw;BDMi2Mbx+bc_D!Q_tm_CdMeEx~DnOzZp3Jp{Lu$eAdIws2vv^r}~4m)?4nzn~H9`^c0!e%b`&1u%8CdE*MASH;Zv{>d$m8iRCvATEk@xjz`L8%O3WWfY5 zR1Ncn$oRdn(by(kjZE$bD%offcGs`v&RSuD`a9T}3XJmrLlN;N5*eRbl8GkJbGb)9Y8$Y7ZxRk*RJGCghW%JA)6iFh=_k4_9(@ct`}AGH7N>> z6u$7fq12GKkBsr+kpVxE?*IZ*>NG8eOH#IDG7WAC*X6c%C^YhHD+#p(kFy}Gk%Vu} zi8M~fGma*;)U$ zHS>uq-3@|fi3N=3{6LTU>*0lMmqm*r(V?_<7=daE3l`=hC zt{y%dhmMxT{&3trA4NKsg2+DRuapt$;5Wf()-4S!G>S4xP>VQ@1s&A^ae#!e8*TQV zUWKz1B&OD~f#3#S?D`_z8*bExE;6JV_*OTJO-_Ru8aB-M`>UX{EgG8{v?CO6w4iwf z)FQ^qiA#g{@pv-;9FHK_mY+=GoS{9$)87c3%2h-;#0Imp;b`b=d=)h{e=r^=IMoGf zpNaw%&25N6D)kH*IfTrga3*CbEN~PHBzcNy7S6SG*%EkV;@onxgyUEx#9JJz>7GKg zN)jDrq+gxt-X+apgoZ+xmOa?gcZN~z0vei~m7q+IMEuAbRnb^ml^x+LfE_hdYepUz zj$9?*iI>qQ@f=0s8=@B;niWPG)T4+8X?Nty9kmcF-&0;3KQH-bmH9amhtZozn;iF- z!I2Fd8E4D!=*2WW?Kl;y)$O)1rn6%vmc^}pxR%0 zqx#SFt0lQbV>*k!ma@gyOl6KdSe-yapuv0K;tG>aAVy-HvN07C8Z@%}jMz7jE`Y4M ztNB?g9XHp+wmf)Au7{gFcw+V(H0A0I5G;dl0M*Rz@#q9DNLWxEf~2((wZSNLd{~&B z11pH#nmN8*b0bs=fCv7Y0!SZ?Y6q9isP zoPktDT;#KR3CKufbj^>tkCnsM?94f|0gx_DsLThNEepi5Y+kOZ!GFg8Vudc!3BY_S z29!8oprU=>#bSLcj)$wW^&p~EObq3@xU7zX5>pYoS-Ox3A$A7qml=rT+oIIdeR#yy zM|a%M|piv`(i8 z;t@%OhG5IB6hQK|sl^BtVea-dj}0)}knS{QONCJ~9nD-=%6=OTxQqf(*|#Ef6=Q7` z6SJ&Z%~K)SK3V}S5Xa_QzxH5QF-aWAB1|Nvy|I{@>Y1Y&>9i9m>hIyvTyN+&b`|DG zJc6?QAgdf!(_?EZq^dP7yR>fdifYPQX^m%Y9W4{lgJN`X%6?NloaAW3<*AZs^?1G| zk?$>BCKpK=TNEdk;#9uP8);#oZB}m*AK7yG_Z#Fwx5>b6((?Ea?~)gZlFI3?m&_&x zGypKdr%`fUCgd65H^;41|Fq$&B@o`gcc{D7XEq3ka>aylh)yuV*n`o)kb+?F1_Fzi z+{QPs{%Ty4+^k!e-bXe1d>Nms?<~hdCa2{7rNm(55Z%$o%v~)|n@ZnG1zNKR9SCG`-bMr@4Qqgx2JNJ8_$2;QLEBD!n@&iVO3U<+%!q(Y5H?b$*^=`%lN z5sC`YVWzX?bJj%1Xp?4mE1g%Xjy}!D;b*M4KPQ+g!XJ+O9pNc)5o4RIl@dv*!Y=ZW zSokje5008gg&`JOS>+OVqH^WvaqnfQiOs(lyXz@oNEBHih3C%eJ3)AkCw6g3& zagZ7BFPJ`h8k#I{=f0 z1JsJ9HMG}%xJ`G3kjQF-;z&xjchWv`{hQ1{K0Fonc%C0JSq0CxJ*(3CWd51IIWmAr zdm-)X%m}ouFV%s;{p05ajXPej{vibTpdErzRXxk^&_%6lm>v}$j+t?t%bRWR%q}zM zop$hXK?C2}oZm>|<3Ot|010^_`smmHl}0AleDifmbNwTc1o#TlUIRe9DK1|S8~|uf zz=h|+_#cp9421<{fz9&^(??gwLc;PsFdHr3?WfL%!p$FcGCUSV&A$S@!)j!svArYc zyVeZj7`z=!riWm4w%_nlZ`R2@gk4to+pU~6C5^A@JjRPfXE3f946Gi%dmkWvf^oNW z>Ogc*P%82+rsuf2-cK}AbG%i7pQdUGBA*PAC<$YKbK^Xv`GtVW_@DCf^~)6=60<+f zf{tzxZuOW1rW5Wcfxu4IR(;QnQ{Zx4AY}Fg2`EXvdeTNvAz@vF2ipboY;~)OmVAxD zram>M{(^u~E>Ie4%+6>?b@T^-_%_kK9f@O6)j${>?9md#pSv#qfSfIG6V1tkiGmoo{cDjpkh#JwF>abi3BVPp|?OJmX1Q(=fvK5e0Egd`Ox=>QYv=$ml)S9&f!^R z>m8R{DCuXOQEau~jhLcH5g%;D@F``JrMN&FYF+@fO0h;1A@FE}8WW-LE*5IfbdIrMK;Zwx8k*PU2{B2i|`8R4nuQr~Oj=BXG28 zFQ-<`(@Ii-A86ARKT=cZGaMsr=O`!eij6yXTo9jPGsVOCyZ_bht^0`nk5c`AxL95x z?WU#uA~)Po?SRwX&yim8%81csB@Xp#NH*HSW>!SpmLa}o_`%YM6BaJtHjiAH%cLVy z`Rc(fX8MlD+ID^KXr(^B`tXf2%Mk37>8?Hfnba0F5Ag-_RaJ8}PzTr~6BHcA#Iz+h z^d^~wNq&2dkdJvi@>?Tot76?V+{V>5JW&;}7zr*-nW-Nx^{&DzO{@G6X&S8sLEcS( zv0`*wl4%0O(Cr$mhV@X`5W^zMpnNT}B40%}~^X&FyM2=RFbCp)fD6BZ0 zNf5sva(Yc<*F}uslp!Py4%R)3iyrt(cY*HhnwtD)W(5-qL9DLsu5)u8&0u{ZBn7ln z*qs)C@n#hjij)n-2`=7xyjLnKO4l3R*K^gSijt!9g>ZsKkqU!ha+l~c+v)@$Oy#06 zLba9X78r3kErE;YWWtwhS(wm2O4#w%PBQXo$Hd4hfl}1?uJB@IE8}q~j>d~qBbICp zr3KrUXIt7X&>LbDB&P^!KXOL%wLd^Ni`J=ww^^_!J2X1n) zNC2tBvJnvU_0fs*{~7baXc%WJwOFF7GYpF*jB(uP_~cTP1V4%~l!1*>DYaYosoA3O zmuY`LGDCbpMcO8h$fbs00wd35#Hb+jVR0&G~1pIYNXqHfML+mo8mfBlZCRrI- zrba@ZpMS2nnV=X2&nxkCbgarRTUk_a3i1)=1yIe4Z7xia{4u zualrDB3+^(c!yfmwlJS(ko&L89y_|IYyVQ?^Xr8Smja%YCB7;HU|7q}F$~HUbnbb+nJ=%qM$hDjoeD4Xr^jy)I7H8Kx$@h2OU;G+=!N{th6@Kduh6)ynIz1`RF{Y@TsW;( zk&z|KnQ3FR&GN-FUh6=EG1WPa70VIvTHNZrccS{!)xYvfN{|%US=gBj&X{9%ky{I^ z!FVH#>e%9Hh3sinYrC?|$=_6R& zY=%r`_2$P=Se$J0M7tXgRR`UWT={$dGfiyEEd6j+L>)#P(84GIs8kcvQ_D_wj}mvD z$kHWJbz|6MQ{XesH+3DP9RxLv)N8HTca^JD&O&cTZ$UhD0$e6n_wqp!Q38u8-(Nic zsv;DH^_Y;D=e+9U7u`Tc%`U7VylkC_;uq=SdU-rNw*aE>pXk%vD>kcixhz&UdP!!0l(60TfX`Bhh#`kd3xZO;x z{IBBp}x`$=J6WE4V`()QP)o5>?Cw?^bx#l>zn@xaZn%)B!uzsnXuCF|p zgyesdrQM3iz*0ytWTppL(Sll397|GAa**Zi9;5ZH27OLJFNO^MT4d!EAt zH@)sD4PN%{J?04b+K}W=vpT$M|G^BO#PoDgt88CJ^h!&Id+9yN$u{;2Lbr=g-M=gv zdVDcybVVGJx-eQ;fQTNh6}Qhq{x_@wRyV^_#Z=QCT4N3{5ji_J!E871N8t7g=k9s) zX1MC=X=kBceGG_&Mwipgt=>8cuPGih0cX;vh#1hG{4-Oaf=pJ5A?Zv}v@1+6 z~9R!-rKa^75qc#8nph4gw&r~E86eulLF8?1E(hs<=BmtQL zT0-;82>m>6nQ^uHJWf9|0eXa({sGQBPPH`qaz!tgY~G0adFo0QLcUCZn4ZPQzogwQ5>dp+jazRID}g-hMo44cyTV|u+Erxgn# z{MKnfIT-$#Klfi7ia0!%vXa`9N?<3>)hW&absDhnGcQH=A$(}_4HM@ydVOPGDO=|; z6$2{1ZfMG;x<4D}NhGlfy5!y$uL(IAQ-1g$X5a96(a61AP@`t$-GFEFuOgWhK$4UU zmm~q=H~ISMHP$1Hf6Kzu|04^#?sZt9%QAlT3odu^Y`DD#3S$HUlBHY8E5w&@%@J@!Zr2{& zdv60pO!z+k0=TQ8>+hYSYo|jRUr?Oe0XfsL-^}gHj<43(RLz^MNxApgCbTQzpjHP%E3(j(rLGDgVqh>|RH_5@yu1)GK|lUvW84I$;!+TK1Jt_Zu`49cC; z#>X#yGfEZ(u!+VOtJ6e1r;W}k`RCJ??waII-h zu6j}DgW9W$a3PCTJ(P`85eG~DI(W@8 z{V~Dwb40^Itg2q==V*nAuVGc(DxsjyDll}`H?p%~l(fjvvtZIE(F8 zuW?aX{23-7joW)Y)N7@-nM~7E{9=(utY~caOpK+^-N9A@Xs}q;=T@JACf)i5v4tOYcF0NBZ;Qv{x51bJDTxy{!a)8u#Aq%;FreEZV@Wi!PtDf$=uf- z*bWE+&BZXxU=VJzywW+swwg|(o$fsXjZ28s+MsEQpnPeqA)#l{M@P zSD-_aaGb4vXy}N{@Ss)cLy$dvEEU#GC2fGYZ_&tP_W3m^Kh<~_#R1nz|I9I~d5%D~ z+82eNZdAR%qeS{Q6-Q_buQ)x(qnRo2AtCXl+#FT#I`Y~oBUwH%#$avC6hcDDTV@I? zsT+dS@8?*OKbYk5?dxMo9S+$7g?1d>1_tSw`?68hpI!1U;yyk!<0J=ZY+^(Ls2UVN z)f|K28~o=uZ8q1RUYZyD0<%uAT|&rT=-KbPpXMPT+%Ue_P^tFfnRQAby07IaEV#gl z?~TfYmbqzCBgrA!Z$-VHq(jLu1srOF&(z5}x&{{lR}l(|e<+?%^dLQZh%2TAv7?)b zlFV~8wxKNMD>OF5(6-PaZ%LJ7X~iw*AjY$lWiVHj7kaU>nZh(dVWb*0*D_9c6Cp8% z1&0=hthMywjudNIl66R25~<}=ATpq3X`Rl@tmwCq2b;l>W zYa~wvLp>bRYXX&n%ol}o%c}#m@e*Dm$W@!lzEM%vDL%so)JMDK=AFS(>z^!>{y(<9 zGAzojU7H$25D6I?L>h)J0qO1@h7L*TmXZ{ap~0a=I%Z&KkZz>ALursk8UerY-TT?~ ze#iY|fP-Ia*1gtwU1wbP8`E3!RTVMZf3`aRG@+~Z=H#DR*e<;CPV>|kqDW;Q-uRL8 zu+A;Xzp?&~??3T{lNG?k`F44Y?|VZ6X=*8H>Md8yJ3D9hn1&|tQ*;wu!Tbz2=f z4*cW4V{+3U+zH^WnzqXEH_@^wew>h-K!O#@*U61)m$`2br{_Im4+UJf++vm%O!*or zACxZ5P6xQ7GaQX3kG>ZnkzD)XsJ=)5Npjm6<*f6X;8Akp(uqqHE$=^k-~Tb1>HgPrdrx zS!IqV?SZONYMn9U7_|1-_^}21a>&5h?4A7EJ7>EW_p50bTY zW)r`rgMUjd7>_ju?l1k=>hxD9eQq|p;i~@HxGs6pPUExjSw&aUadQ?CnFVqEdCBW^lT!SMvA;#_0IU0=oMvf`i0!;mZ&t* zl%*uZL15UyCNU>PBeBSl> zZ0G=;{H;x2TOx>hOi`&>ixOapr@++kdOOyIRH9DjB)1t`gDW_hp74jA=3)j(SSHRs z<{(FM)%>T& z#4IREfETo1b*bUM@7UvnR3wf>3D;h5CX9OdUPk_C{L_!l-!_fs)6zB((x>B}HCY)| zW#GSPQIPVQXm(UT1sgQnTqvxdDfCIbsc=_u=%JNosdEc)p&E<#h``+;W|m16ScYgTeF-xm z3S@7bRLv~QXwLZ7xj7p%chC?nE!}abRmxB-nWEy8Z!F+3^E5o8&V2Y_=V9YS>D^Sp z+#r?dUT~3=7i&K?OsQkh=p;!_5sx1y2qa#>H~VutBmIIoa>f;6bb1_NOrpby*c zjC`2JenIPoij8r_Estly5UyLtOWQ4`)ub6%ZuH4(eKT$|LEV1vD2@n&(7!cM!1|~7n|j@`BoBp zd8){0$*;rp=cmVOt5ctg(&_E7l}?s;!x;p|>>OMK=h&Rz;mk0!F?xI%tXqGUcM92{ zEW@Mt`H3zqv(94p<7t;1c5f#0p8A)zb0l_}&QE8p!k}aEOd1w3{u14Z4E?E1E}6_r z$_SqM=!7NdCqfju;hr{UOtkaT+@C7MK;2b%IkJ;j7PDzU7Y~~}6PFuam~ONEXQ-T5 zihlR^-;L1}xqI4kn}yh0n==W~Rt6WT9gK9q~%Tsn*SG=@G!fWQ)oWE>ts4E*VsB zBJON@@2sQQtM8ma;&9|Z`#arv%CyGS^jkP)_hj5N!09XB#kI|Gc;VCf562mN-q!V2 zGmoBcVK9_yWl~j|!M{z%k13r;N!$=4ws^{ZMc2aJ%%{_9phy@%-hX z^y+uBm;q6J7ydlKuJnxBEWz;YNFP13a_=;yuiU*(f_3RF*o{hE|4|$q9AA!I>rkqW zZ;bG3I$D}#)qi={2DEhMVmemYcf>9pJ!WU8(J;DrG^5n`)I;&NFv=VZHEDb}Fh52G zXyWTzpjg4QRqHC$7M;{!KZAE@CxUhd{IHHfk^=Wm7tzfK2?Wp*J4EkRSF5bdG4N5P zK0x=Rqpz4H;N5D{7tDG(h(xp>7=x|@&sGq~SF55WQ`|LJ%%cJl~?H6#-s?uSPAva7jtVE+zfTod5Gu}Q*4D{K- zrR4)RW8Vi^LfUyc{tuWNJloPdQo0c=v_cXo9=<3Z)?)Cam778%w%^PJ(eMjI$Y?R?WvvS{)dx?Wc!HHIEN)C3Vz(a~Sd2);s#8KK z8u_g6b!Mc$esU=<4=a&t;}wB?7dLUAnKY1=PFiQID@r3Wq;z9_K$9M?;lwv%n_e@L z%2%WYh~tKwD-}dSdNs?aw9{3PZfO{N;w>I`BrP6J(|m$EP)~j?w5rE5gfaa*v8@td z{7P83n+I=Ain6cZh4_u+k){~JXXE`QXI;Q4pd)8QRr1w=BPkY#Qzune=qLS}WY8qA zg)#vYmU>m?>Sx74VSz6y#K`$td^70 z$xb*MB2@OtqKqW_+`u-4kGiKUQU=6%r3dG(m>&E1PF{G(tQ?6{`!H&&}zi$h?W4{Y9S`%t_c2zRF7FmC+hzNgx; z%TpSj0Zc?d+Hc2d6X&u=L`{{QZn*=ep3AAG;<|QtJpOTU8(-zn8msKll}!US|`j zK~B{t47Of;T!!UlteU+ln4wESUWdH&ll^QbwO;+$SOFuQ6YG$2o|G_7PIr4!CxDqc z6C`UN*$<=Zm4umyOt!?`_V!vY)iyls4TEU>ApHgo*g3!p&jJm; z(m(Ii*G->6GsgckVEa$2^+LB}MN=Y#tkEbw3lXL#u8>yt^XhU-8a}LN##@2~p02%! z>A)>vqvY3c!Vci27i1`~Uoef;VjHe@Gf+>t5X6qk%oY9CHyO1w zYWvnB9Tpx_Yq{0sc4ArnH9kxSl)hOehs%va2<)GxBd-*$ILaK_rne0D@->4))WvD_ z<&b8#ljarEIo`K1&l|KYezS#`DAQ#nqp}@OFDqPZgzBEKs>nXt7-H^M1@t;Gd`RBcT`##0t4wFCNX#X zI-sN9f73*eZ=4Pcsx@VZ_}8_pG@`;b$e5B|XiLmmUTZ6b=zB>ul<~+IpFYbbt!ADu zYeB{4OYO^I_9cI7sND}i4=?qVt!tAMlTQ633a^MpWW|VZJc?IYjVlhmPc2@S+kUY_ zY#)3933A?KxQsSCS9MA1B3+h*{k2@$YIm4Ivj+u#RWF{N{UG%MfZI909t`>P*{%pAOV3t&sFAp`ikvx6 zu7uVYzq%az1fGbvT`#RJN)3ZxdI;u3IFnLly%~lB9f&DD)~xWL(&zkbD3_@cKtkdz z@Sb`j%?L;>e1P4<#`H|sY83oRMqw39W9!{Avu2m(OtCwqM=4VIFY@VcIogrIy1Ld- z39~WvMD9`MSB3Re808*j6!N_KYR_n$l&n_HhQW`A{OL^iA`_EKpjt%v3uXNz{PL+2 zb|%AU>LQrv(y{`n_7cAs-T)n3DE3&MwCuJ>3AgJhiknpS*cu!Wv5@elq&Oty4?AXBE9)xY)e@J;`6Jw zhbTr!wbZX4oR7|`a+-jRi%S#31A4MRcFnJT62J>!~EniiR*G2JJ zA8fYA8u_x^J+>IlQscY_U09Ap-v*>2sIa5?8o^qYCqhg8u$}3P!KoH!c0Cm4#0CU7 z7RiBZ!*t0N*)LcXSd|>mDun2E28Z<*!8Xe?i59I+qhK~k4}^sW68n+Pe~L6L!hvq0 zXUlJfP}^^2Mt%&J+3~jZogW%~U#I+`yavglze0izwQV8!Bf3dzHZ=j&clqEN5@C)S zL$NXYn#mX3Hj??HLm73AnKsDOI(Lq$pYbI&Lx&i?cP`QcoLt*4ue~#l@;VAIBzW(C z{CI%cy<>o&+{G;Ir(aOSAkh+6d(w85(xlR!rr+lWF)c^=VBf{AhjM$m{eqpaulF~h zo=@*1x6Ll#KWP07UqGte5<#Vgl0gr@6(8YQsmjN4JamwazlWx3aVINf zg%)d=wm^O)1huS5eo%8xKt)j!DA1PJjPv(W*t=1fg&gbRItxh-u>qE>2t&S(ci7R` z23XgT!cZQ$=hBHf7)U+94p-JiBiiVQJWKIsR$7~b(=iE%FbGrJ1!JQT`wl!U*E{oL zMrsPp+z(Er)*#ye51Y%SP9DF8)oChhyyRJwL(fMbsf4CbJ&)uc2HYtPBdFe>Yo=-2 zq;cNOTRW8+Y@d1W-CwZzCUh3&|Mg^?fCG)ME#e#@!ZAzCF}{5=d`zMVnA%pn=FwKOm%)#aj^ zqPB$`db|JSkG7kdAB`Z7Es6t%=T(Ql9`}0&kRDpfxh%p1$jLlSuRd{R*hkq}k(?Mu zy42A48Ga6axG{TIJ?r{)%~T$#U{=Y{Oo?C8rRM<_lU9iVu>VYz*uibz8$gu`XtCL@ zYD|!gdALp#du9m}iJ%kMx~R}}LI{rolBq;Bf1CX(6a zkNhb3>U~uwi5{X$AK0hoYf}U@N&MWR5X#|KEXZni#_CCk2UfTf0=Q)|BcRTnmGMt|YQG@l8B*>o-uo@;J-MHZC6hKuHA%WY zzv~f5LWNl__5}Kk`!^yeCW8esDdSbhT`}%u=Q4gdUDkOm7=A(0J{CxG>?VEndq5M#N=WsaZV)b6t z@T6OIl+qHuRtKZXDn+pRni0x9wf1mI(Dp~XABKu5nNan$SY92_^N2_wX{pY}tuU!K zglY(w<&JkFXx&lEpU^Md!rnKTrnZ7Vw+eKsqeodugbRf{n0z^Ul|K7K>Gt<4H}=o0 z2AXDi%Zth&_w>H2-s5@9tZ{D{H&MrfGyo4Uzd^+jE^ zExi?e?S*ao(XMNB{*CXVEi41DAtA_zHVGfaa+_{5*iTkm4nzlp_CYni$)mZ!sRNHY z@cz2^VBibc`2sb%!Py1JvTYA`d-YqQSq5pYI!7OIzqA$KTn>OI*WLXli)7+0(C%lGvmrXb~wb+Q?&$HSca5CB@JG(^5WHFh@wtpcPBtGYL$^M z9zBL2uAQY@P?W~|p62HcdJVWpvc}uH?)!Y?EnCUecf)?z8;szO$K*KZT6N_b}LEY6_B_LM)$zRwYgQ65HD$Be?P9L;)& zn;Y=HsbyeD&GF~|z^o&Da|}XHsREXoB%ysns)?XfXXJ_W3W`c@f}0nUSu87r!q`_m zXMf!Fe&!QLn?Wff=TT99#YZv0<3Z;WiaXX%Rf#g&%*gJy;X|2eVRd_Hc24t*8J?n( zf%haQANj{BDTAf`zGitTq5?{pu5-s`5<%RX{)aC;!UzOR#?fR>-@nGg^o__m-^9&9 znW;`aktTt8;u_WBjqK_n439PT(>zfdQR$>8H~?e@H32UI`PBuSHV0YR-;Ct&lr)u? znT~>)ObnZuD++Vy|J0qo#oK$!w*&8odA}m}_W)SpufnuR$Y>HkiWaXZ13bW<)3qx9 zmHYdF4JC;%zbaE41-{neKmZrFh1JLpXx4!D$S{aQN+Ah|Bo?DLT((cypjb!8p9Tm+!dBXgXh6RPX+~zr&7vlPwHY|QUK17z7 zMl=a8SI$|9LNRJsSEEp5q}{<+%W+QC>?ZyP>7}Jt)YB3N-5i4;qcQvCVG^Nh*HY_p z(!Of!5f5O*!o_Bw&jz5DWb*RimG|EC-=Q5F+^h||^bj-uc(Gp}BS#xU-=?G<>ScaV zCsF7JR{_YJ?sahT3a8FD;V1G;YX(<=-4r7_Xa%PUH=fAFl`vW7l8;+ zCxA}i*E86gCUuR-(&H+yCbH-?Vm%MjW5x>A+EN#f(fudl%EF4otc;b0^RtW} z7oZ?dj7S^5r+-F@xElrqxzBkVdi>I1p&pzJm-`KlY=+xe8L>_pS(LpBK24VIM1)p9 zooG>fRd9DEuI?J_Z^h?$|LKR)bJ0^{L27(hAiKYU?d;`iwvm~ME@A)?b6NthWIwu(4Im|^HRw0NH>wBI3l&!oF zs%afDbc0H@*9ZlqN$*Hlc?b&VHYRC;hYmy_7oXo~BHb7f7&1Eq?OnvCje433U+Vec(k^m)tb9N4|bPPPr-PqtYAU~U$e zkKyP*yN5BH{WD>caAo9-{R~G0y%C^}*|Z#4^n6roi^AJ%wrpgD!?U$4mH|4l=`N_F z8~L{R+i2}zzHDOCrI`7!einlOkYI>HQWf>i54Y4_(L@S2L zHpir8!+C`s$gBuUdX}xr_m@6Kt`VZ{6&WTMVK48On!QZ1N#Lkn5M{H&k?o8Bz{vEg z(^-h5l_vEb)Mtj={(mCmM6DZN?<~D8n75|%XD#Ld7-j_xDirT<9yKWBU+zp&#n3L4 zRr{vi%zl3za;62J} z?Z{CWUQFfpt)p}?2a5kUXgm4o4(}@$`hdOCVseC?zH??31`>S1C&lr^>9P_*p@+)d zdQuL{v;*J`8Krh+RER7igWs<-9M8Ht*&Kt+Z;UT|eQG!^PW#0pS6 zRtSk5I15C)9z(#tjrZ>#Ksj&N8}|l=q5a?hR2}o4#e)vO{sQAC>PC2#ITsbM>C#!} zKRT1z{_AZ-rGvN(vXZ$cN*}Wg#f4qWLn&hkNgIuDjV<3@gj8qr1R3EO8_rE%%{wHS zpqj!~PD!YLLiI!(GHfOLt^Vs|ZzWm1TH|h}d#k)kpUa}H3L7dbUn=a~!;O{az~h2? z*Iq!S{t} zSq=1b+F#<h8r#P$YRT%J2XJ<2k~a_DF3r3NjWA&Amn*6RH8>;PHc^(dC?pxd9v zL08Sh9{%X!cEdZ0&z*AFFD`Ebza60ThN!@c3uUdO@D||?E%6hkDrm!H@k4GTtqy@E zcoY-U&g{$A3s!U0VmH!1C{lS57oO zMsS@NcGh0NO*xHZDIfmM)Dmv|^(vdpJg`bmkz16YQS`LmJhK_xUIRq0MD{ufnee20 zf_-!Co({&E06*Ke$mB*s#MjeMb1+avQ&zg<4vIBW&mLTQwwSq!d*SUoQ|mW9I~f8a z(*vb0IT%#9izYWt*!EWsTDmJSpQbrmFQP;Y4;Xk499Seq|GpjX!bT%DYvY%mZ z!Ev2ESAzpR6&xmp6@&+-O*e9EJzP(}xT^`YH5BW-^J|%bUgBonTc3c+bJLi0y^ZB< zGV?|7HXaRE2N)l7Y?(9)jNnP)IspOJ{{2@W5(yv*x}XE6yJrope^a*$2?R}eqUdZ( z-?Y4jyCd}MgJ%kaetYm6%!k=WGry4en(#bn|G8It@SlfFm!=z3JUWVQteo0CPZzKZuUx4mx$^L|J`>7Jk1F66}~mi5L;-8q0p6-qowUL|qZ5dCXIbP6*R;nBZt&GW-x99O~99}&- zPmi-Pm*e)I;Qrfn`ElNYN;Jyd5P9ygwPGu!%{(xpBLX?BuV}&>_9u0Us6yd+6u2I! zcX$k;^{%5GYxIcoX>-{*_Zevv^$<*G{SxN?=XnBx*7#x*SA_Amo(EGQs!fVQ^GLr@ zSbBNwzmR;0z&B51%Q@Ysg6&!WmTNm0F9zf*0 zizr`)74ZC7|9y3Fohe!ACpNBrR=QW7H`(*1uIZ;49A-6u^pWEPyD>JSA)_Zf54}I1 zJ_H|rHZL;+r}w$~uK}2QGI{$3)bix`dkCYL@a5>0rwU5rIzRP>H<*buS` z-Vx!x1_eX!*mP~NNI2PvSiD7f*TMwQnJw0P2wTbFeG?zw3rD%TY|lxY59}|Z%wG>} zo*DuEqct_vzmauwMgfO*<@YqR@o&rD!9g8=j=ufC^aa#+-CJ$+sXG=Oj&+x1HHz?` zH&%sTM@7HviSjD$KPuAmSRWpm&AGo`<2kkxA>dbklE=7*#(VmW=orZ6R zZJ!vR>X{>~)g$z3Nl-^#-=nAPLi#rg=5|yzRh&W_+HOrAo28rZb_|13+Q)z{@|Y5k zkcFl(SQ?nj3_k&(i~t18)bGIla6Rb&UC?N_<2Qy;ooU^cm(0U&O)U3yHarC@EfO3u z%aP;GlNr)yprA)hI76}k+3@10EKbge~eK8W+Vz=^SO z%)Mzpovl%Z>4Y-}EsMR9Gy$Wcq5!3DA2EvaFz)z{oBu=)e|BxZuoa57y_uYj&=_t` z&x{T|?~3G#+bw!R<`wkhIeXqN<5GGmOxjTzJp4<5rMF}gcl`Y`l2?Y(Pux7i1ViBl zMT+#gl2r`b@v9u9#C)0sUuV(QJyBmKC+-}Z1M}xFHF85MrJ#?=Tx)~9MlyNRcenc$ zx}@zK3wo@X%^N=evia-=3q#!P!-xH9pG2EKg9CDx$X4!J*%*z8+wtT6kMcv zJGxej-OE{@Fb8(Q9Nz^u5YxBO=Zc-9%4?? zazkt)FV%;X3n8P6k-2Exa~X@ne6e)u-baQP&yh>zutB;^f+2gh>Lf(#kh1q@T*J)u~z$@abK5x~C0R?0!m7|HlLJ-_lvMFU=*CD@J- zjlw?c+>bJ|*!y<(=_mV<8slCFTPSxNwFm}-|6$!+|A!^u`QvXa%qzo1(gtoaNHd>> ztq!I;*LX7VCLE%3)L1m4(pRf@$lXZ4kB_6$qu8Kdq52Id63 zFU+N+<^@DdFV*Cf_KjsuIU(;4>UC=Uv9af z7g|G+;Qbv*0-cc`#MJ1C1zXu(Q%lp*47!Q=od3w+8_53DUi5_|6T3zPSQd|&UmvPE z!uy7ax$x6eZ)O;jPt(pP3IYt$^*Qn|Br9c`@xi8QqS3a|ovxpB%-+`FoS&D245PP=ELd45g7g=Fl{gZ53>Z?shb!-~|O^%Ye? z8mg0C56R_1w{sov=s0ENHzKZaSy@-YV_(` zkAFWnSt~c@?ww0C-S$2H@MF9bGJ;MiVc|lTL|3V0YJ>G$m`YJk&C=G!2}~6E*+)%= zotC$ePoAg|E+OMXoe^%L?L*usgB3J|6{m)DQ>;w}&#l2b_4`!lRb@UN0TK}k4vGUs zcb^LJ9TaTzyY$-t?-UIaK_x_R`uu)aE!<7hdd$PH0}i(?y@PVOy|wt7x$Mr@L=t^O zOHfTNL#g2%VhKqoblH2v5um4%O^ab`Do#ov>0mS9T+8zs`nU|fGqB*NIBuVY-8p%8Nw?c8tg#~CcQ;WtK!5ox*rLe%47At749{ZRqw`{h^1W0&EDbXL}AaX0?b=`{0@&x7FUd&t*- z8pH5HbKTtbyqhu19^1`$hi$%W#1Qwcf;C|}d0(HX>XUb?eTXA$UnhgD*M_1M5G&~3 zH%0UV{rWZ8*mLnL7tG2Mhh!wC{t#lYnsBL zBm^Q);=AEy2mk*5DFF<4`t=rFAeoBCKD~h`v;H?jPNo8$$8yu>E*cv+HdG&zr2VV~ z>YuR`>Yh!D3CbQIF=n+sQ_Ed;va% z%^2%k>SGO+K! zk15RBI=AFmWIp@Wuv`_;c~rgjrCoBQecTO+o2!Z)!qgGr=TMK{%vK$k7YO#ezr|;$ z0%}CrWu2m5*00ws)*og_w%mw*A?aCjxN8>SD;_{o2!Gn-6iSl(D26M?-X1ss6{fs> zF+XX6C>_S#!wC04GZ5)-g=gEdgLM?ZQ)fSw}Xu{0PML#3V4cZNf3$d^Y;4rP&N z@-sH1rkETt8Bzck*5Q?;*iR`EYwZ+iI=)3%W@V1k2vMqL(Fja7F(fE5S5cHi{jcPl zf9w$I7Tm&geDj( zf#Xr@2U(ip=ZPhsM1UV|@7E%q*KHpa;Z~HqhnFN+1OX~_=;W`GUXlrFQN>GG*!$Oi(2`#;g>qp{*|P< zEQSWrX9a2@Jsq7C?R-Q#k5})%z27WNz42p^SERW+M<(3iZKy1nik`K$^I2@)Zdf9h zSgCy>ed-4jBEd?B7!_nm=O(moTnV*;*8o{#H^S+US0uFHHJCjt9aaUi*Xh-NtuLbk z4h})V3B9^sgFfdh=j7s;ffG+oK@1$B94jB?EJ2pMduv2kj|+>dU`)i-Qwvdi@B&tb zcV&JJuf77JR^nvUh%+C&YoC7Tn`Nc1ddfl|MC@!ejZX3Ee>==j>&b(_xLQ5~mQz^2 zq+Le3ku;ukX|4(I1;I5m#B@5yFrQO9@kDgKpGSpk`Z=)%zf@82+-=iv%F{R&?7y2e zc6FYwbZ2JMx3ujT)zy5L?}O{FvX{a7TTkQ+2jw_+MYdjg@_X-Q2s)k^mF;6Ks2p7y zyJlaMQ>V9gg%0Afs}UO8SIRyUEVYl}+SO74Fkq4RgOb|*#5b!=50 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

)zs1p|eEs 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�gJ8cGUKt9b95S2jT>m#MKe%&re_07 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